2015-11-19 74 views
0

我们正在计划对我们的CI设置进行一些更改,包括对密钥库进行一些更改以用于签署Android应用程序(更改密码,密钥别名等)。验证Android代码签名

很显然,如果在商店中推出任何可能导致我们使用错误密钥签名的错误,那么将会有点灾难。

所以我的问题是:

  1. 什么是验证密钥使用签署Android应用程序的最佳途径?
  2. 是否可以验证两个应用程序是否由相同的密钥签名?
  3. Google Play开发者控制台是否有适当的安全措施来检测现有应用的密钥更改?

回答

1

我会以相反的顺序操作如下:

  • 是否谷歌Play开发者控制台有发生的任何保障措施,以检测键更改现有应用程序吗?
  • 是的。事实上,一旦您上传了已签名的* APK,您只能提交使用该相同证书签名的更新后的APK。如果不这样做将会使谷歌播放吐出这样的:

    上传失败

    您上传的用不同的证书到以前的APK所签署的APK。您必须使用相同的证书。

    您现有的APK使用带有指纹的证书进行签名: [SHA1:89:2F:11:FE:CE:D6:CC:DF:65:E7:76:3E:DD :A7:96:4F:84:DD:BA:33] 以及用于签署您上传的APK的证书有指纹: [SHA1:20:26:F4:C1:DF:0F :2B:D9:46:03:FF:AB:07:B1:28:7B:9C:75:44:CC]

    • = “签名” 与非调试证书签名的装置。

    来源:The apk must be signed with the same certificates as the previous version

  • 是否有可能以验证两个应用程序已经由相同的密钥签名?
  • 是的。您可以为此使用jarsignerkeytool。我更喜欢后者的输出:

    keytool -list -printcert -jarfile MyApp.apk 
    

    当中一些其他的细节,你会与证书的指纹(MD5,SHA1和SHA256默认情况下),它看起来有点像这样呈现:

    Certificate fingerprints: 
        MD5: 12:34:56:78:90:AB:CD:EF:12:34:56:78:90:AB:CD:EF 
        SHA1: 12:34:56:78:90:AB:CD:EF:12:34:56:78:90:AB:CD:EF:12:34:56:44 
        SHA256: 12:34:56:78:90:AB:CD:EF:12:34:56:78:90:AB:CD:EF:12:34:56:78:12:34:56:78:90:AB:CD:EF:12:34:56:78 
        Signature algorithm name: SHA1withRSA 
        Version: 3 
    

    您可以为多个APK执行此操作并比较结果。或者,您也可以在密钥库比较从APK指纹直接与证书:

    keytool -list -keystore MyApp.keystore 
    

    输入密钥库的密码后,你会看到类似这样的:

    Certificate fingerprint (SHA1): 12:34:56:78:90:AB:CD:EF:12:34:56:78:90:AB:CD:EF:12:34:56:44 
    

    这应该是一个与APK中的SHA1指纹完全匹配。

    关于如何使用jarsigner做类似的事例,可以在one of the answers至Q &上找到。

    1. 验证用于签署Android应用程序的关键用途的最佳方法是什么?

    不确定这是否可以客观回答,但上述任何一种方法都应该有效。理想情况下,您会希望设置一个脚本来自动执行此检查(作为构建过程的一部分?),并在出现意外事件时尽早失败。在最糟糕的情况下,您最终会以APK身份签名,而您并不打算签署该证书。如果此APK是对现有应用的更新,Google Play将阻止您提交该应用。如果它是一个全新的应用程序,它不会,任何更新都必须使用相同(错误)的证书进行签名。

    +0

    很感谢,它解答了我所有的问题。 – user3617723