验证Android代码签名

时间:2015-11-19 12:34:07

标签: java android mobile google-play

我们正在计划对CI设置进行一些更改,这些更改将涉及对密钥库进行一些更改,这些更改用于签署Android应用程序(更改密码,关键别名等)。

显然,任何可能导致我们使用错误密钥签名的错误,如果被推入商店,将会是一场灾难。

所以我的问题是:

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

1 个答案:

答案 0 :(得分:1)

我将按相反的顺序执行此操作:

  
      
  1. Google Play开发者控制台是否有适当的安全措施来检测现有应用的密钥更改?
  2.   

是的。事实上,一旦您上传了已签名的* APK,您就只能提交使用该证书签名的更新的APK。如果不这样做会使Google Play吐出类似的内容:

  

上传失败

     

您上传了使用其他证书签名的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

  
      
  1. 是否可以验证两个应用是否已使用相同的密钥签名?
  2.   

是。您可以使用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执行类似操作的示例,请参阅上面链接的Q& A的one of the answers

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

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