必须使用与先前版本相同的证书对apk进行签名

时间:2011-01-30 13:39:13

标签: android google-play apk

我不久前将我的应用程序上传到Google Play(当时称为Android Market)。

今天我更新了应用程序,但是我删除了以前的密钥库并创建了一个新密钥库 上传时,它表示必须使用与之前版本相同的证书对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]

但是我没有这个证书,也不想删除和重新发布应用程序,因为它有活跃的用户。

如何使用新证书签署我的应用程序?

11 个答案:

答案 0 :(得分:174)

无。阅读文档:Publishing Updates on Android Market

  

在上传更新的应用程序之前,请确保已在清单文件的元素中增加了android:versionCode和android:versionName属性。此外,包名称必须相同,并且 .apk必须使用相同的私钥进行签名。如果软件包名称和签名证书与现有版本的名称和签名证书不匹配,则Market会将其视为新应用程序,并且不会将其作为更新提供给用户。

答案 1 :(得分:102)

您是否错误地使用调试密钥签名?

Google Play不允许您发布使用调试密钥库签名的应用。如果您尝试上传此类APK,Google Play将失败并显示消息"您上传了以调试模式签名的APK。您需要在发布模式下签署APK。"

但是,如果您尝试上传使用调试密钥库签名的更新,则会看到此消息; Google Play会显示问题中显示的消息,指的是SHA1指纹。

首先,检查您是否错误地使用调试密钥对应用程序进行了签名。


如何查看使用了哪些签名密钥?

从APK中收集信息

您可以使用这些命令,使用Java keytool检查原始APK和更新APK的签名证书:

keytool -list -printcert -jarfile original.apk
keytool -list -printcert -jarfile update.apk

这会向您显示有关APK签名方式的详细信息,例如:

Owner: CN=My App, O=My Company, L=Somewhere, C=DE
Issuer: CN=My App, O=My Company, L=Somewhere, C=DE
Serial number: 4790b086
Valid from: Mon Nov 11 15:01:28 GMT 2013 until: Fri Mar 29 16:01:28 BST 2041
Certificate fingerprints:
  MD5:  A3:2E:67:AF:74:3A:BD:DD:A2:A9:0D:CA:6C:D4:AF:20
  SHA1: A6:E7:CE:64:17:45:0F:B4:C7:FC:76:43:90:04:DC:A7:84:EF:33:E9
  SHA256: FB:6C:59:9E:B4:58:E3:62:AD:81:42:...:09:FC:BC:FE:E7:40:53:C3:D8:14:4F
         Signature algorithm name: SHA256withRSA
         Version: 3

此处需要注意的重要部分 - 对于每个APK - 是 SHA1 指纹值,所有者标识值,以及有效期自/直到约会。


如果keytool命令不起作用(-jarfile选项需要Java 7),您可以通过jarsigner命令获取更多基本信息:

jarsigner -verify -verbose:summary -certs original.apk
jarsigner -verify -verbose:summary -certs update.apk

遗憾的是,这并未显示SHA1指纹,但确实显示了X.509所有者身份以及证书到期日期。例如:

sm  4642892 Thu Apr 17 10:57:44 CEST 2014 classes.dex (and 412 more)

    X.509, CN=My App, O=My Company, L=Somewhere, C=DE
    [certificate is valid from 11/11/13 12:12 to 29/03/41 12:12]
    [CertPath not validated: Path does not chain with any of the trust anchors]

您可以忽略任何未验证的" CertPath"消息,以及有关证书链或时间戳的警告;在这种情况下,它们并不相关。

比较APK之间的所有者,SHA1和到期值

  • 如果所有者 / X.509 标识值为 CN=Android Debug, O=Android, C=US ,那么您已使用<您的调试密钥,而不是原始发布密钥

  • 如果原始版本和更新版APK之间的 SHA1 指纹值不同,那么您对两个APK使用相同的签名密钥

  • 如果所有者 / X.509 身份值不同,或两个APK之间的证书到期日不同,那么您确实没有对两个APK使用相同的签名密钥

请注意,即使两个证书之间的所有者/ X.509值相同,这并不意味着证书是相同的 - 如果其他任何内容不匹配 - 例如指纹值 - 那么证书是不同的。


搜索原始密钥库,检查备份

如果两个APK有不同的证书信息,那么必须找到原始密钥库,即具有Google Play(或keytool)告诉您的第一个SHA1指纹值的文件。

搜索您可以在计算机上以及任何备份中找到的所有密钥库文件,直到您拥有具有正确SHA1指纹的密钥库文件:

keytool -list -keystore my-release.keystore

如果提示输入密码,只需按 Enter - 如果您只想快速查看SHA1值,则无需输入密码。


我无法在任何地方找到原始密钥库

如果找不到原始密钥库,则永远不会能够发布此特定应用的任何更新。

Android在Signing Your Application页面上明确提到了这一点:

  

警告:将密钥库和私钥保存在安全可靠的位置,并确保对其进行安全备份。 如果您将某个应用程序发布到Google Play,然后丢失了您为该应用程序签名的密钥,那么您将无法向您的应用发布任何更新,因为您必须始终使用相同的密钥对所有版本的应用进行签名

首次发布APK后,所有后续版本都必须使用完全相同的密钥签名。


我可以从原始APK中提取原始签名密钥吗?

没有。这是不可能的。 APK仅包含公共信息,而不包含您的私钥信息。


我可以迁移到新的签名密钥吗?

没有。即使您找到了原始内容,也无法使用密钥A对APK进行签名,然后使用密钥A和B对下一次更新进行签名,然后仅使用密钥B在下一次更新后签名。

使用多个密钥签署APK(或任何JAR文件)技术上可能,但Google Play不再接受具有多个签名的APK。

尝试这样做会导致消息&#34;您的APK已使用多个证书签名。请仅使用一个证书进行签名并重新上传。&#34;


我该怎么办?

您必须使用新的应用程序ID构建应用程序(例如,从&#34; com.example.myapp&#34;更改为&#34; com.example.myapp2&#34;)并创建一个全新的应用程序ID在Google Play上市。

可能您还需要更改代码,以便人们可以安装新应用,即使他们安装了旧应用,例如您需要确保没有冲突的内容提供商。

您将丢失现有的安装基础,评论等,并且必须找到让现有客户卸载旧应用并安装新版本的方法。

再次确保您拥有用于此版本的密钥库和密码的安全备份。

答案 2 :(得分:8)

没什么 - 谷歌明确表示该应用程序是通过用于签名的密钥来识别的。因此,如果您丢失了密钥,则需要创建一个新的应用程序。

答案 3 :(得分:6)

今天我面临同样的问题,不幸的是,我的密钥库文件中有两个别名。enter image description here

答案 4 :(得分:4)

我在这里得到了这个问题的答案。在搜索了太久之后我终于破解了密钥和密码。我忘记了我的密钥和别名也是jks文件,但幸运的是我知道我放入密码的密码。但找到正确的组合对我来说是最艰巨的任务。

解决方案 -  下载此 - Keytool IUI版本2.4.1插件 enter image description here

窗口会弹出现在它显示别名...如果你的jks文件是正确的.. 右键单击别名并点击&#34;查看证书链&#34; .. 它将显示SHA1键..将此键与您在谷歌应用程序商店中上传apk时获得的密钥相匹配...

如果匹配,则使用正确的jks文件和别名..

现在幸运的是我有一堆密码来匹配.. enter image description here

现在去这个scrren把相同的jks路径..和密码(在你的密码中)把任何路径放在&#34;证书文件&#34;

如果屏幕显示任何错误,则密码不匹配..如果它没有显示任何错误,则表示您使用的是正确的jks文件。正确的别名和密码() 现在你可以上传你的apk在Play商店:)

答案 5 :(得分:3)

如果您之前有apk文件(备份),那么使用jarSigner从那个apk中提取证书,然后使用该密钥或使用keytool克隆该证书,可能会有帮助... 有用的链接是jarsigner docskeytool docs

答案 6 :(得分:2)

我只是突然出现这种情况。我真的不认为我有什么改变。

但是,“构建” /“清洁项目”已修复它。

答案 7 :(得分:1)

我强烈建议您使用密钥库资源管理器(https://keystore-explorer.org/),使您无需将密钥库上传到Google Play即可访问密钥库。这样,您就可以排查密码输入是否错误。

答案 8 :(得分:0)

最近,在尝试了不同的登录方式(例如启用V1或V2)之后,我遇到了这个问题,通过更改别名和登录最后得知我使用了错误的密钥存储文件 < / p>

答案 9 :(得分:0)

您可以使用Google Play应用新功能签名来生成新的密钥文件。

2017年5月之后,Google Play商店在Play商店中添加了一项新功能, 对于Android开发人员而言,这是个好消息。 通过此功能,开发人员可以更新丢失了KeyStore文件的应用程序或Apk。 您需要在Play商店控制台上启用Google Play应用签名。

https://support.google.com/googleplay/android-developer/answer/7384423?hl=en

http://www.geekcodehub.com/2018/05/23/keystore-lost-in-android/

答案 10 :(得分:0)

我的[傻]错误是我使用app-debug.apk文件而不是app-release.apk文件。 生成签名的APK时,您需要在“构建变体”框架中选择“发布”。 app-release.apk文件应位于项目根目录下的“ app \ release”文件夹下。