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


200

不久前,我已将我的应用上传到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]

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

我该怎么做才能用新证书签署我的应用程序?


26
我遇到了一个不同的问题:我尝试升级应用程序,但这让我一直在说这个错误。事实是,我从未更改过密钥库!!!我能做什么?!?
Mariux

你是怎么解决的?
伊丽莎白

@ int_32您如何解决?
阿米特·沙尔玛

Answers:


187

没有。阅读文档:在Android Market上发布更新

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


14
好答案。我从未意识到,如果密钥丢失了,那么应用程序将无法更新。必须记住将密钥备份在安全的地方。
彼得·克尼戈

18
我通常要做的是将密钥库文件存储在svn中。将一个名为credential的新文件夹以及trunk / tag / branches一起放入,并将密钥库文件存储在那里。另外,添加一个新的.txt文件以指示密钥库文件。密钥库与源代码同样重要。一旦您丢失了它(或忘记了密码),便会被
拧紧。.– Krishnabhadra 2013年

42
不要像@Krishnabhadra所说的那样,将您的密钥库密码(或与此有关的任何密码)检查到源代码管理中。将密钥库和密码分开,并确保密码安全。
Christopher Orr 2014年

1
什么?!但是它只是告诉我我的钥匙太旧了,所以我现在删除了它并创建了一个新钥匙!

2
@iwayneo构建系统可能已经告诉您调试密钥太旧,但是发行密钥不太可能发生,因为Google Play会拒绝2033年10月之前到期的密钥。
Christopher Orr 2015年

126

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

Google Play不允许您发布使用调试密钥库签名的应用。如果您尝试上传这样的APK,则Google Play将失败,并显示消息“您上传了在调试模式下签名的APK。您需要在发布模式下对APK进行签名”。

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

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


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

从APK收集信息

您可以使用Java使用以下命令检查原始APK和更新APK签署了哪些证书keytool

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 not validated”消息,以及有关证书链或时间戳的警告;在这种情况下,它们无关紧要。

比较APK之间的Owner,SHA1和Expiry值

  • 如果Owner / X.509身份值为CN=Android Debug, O=Android, C=US,则您已使用调试密钥(而非原始发行密钥)对APK进行了签名。

  • 如果 SHA1指纹值是原始和更新的APK不同,那么你根本没有使用两个的APK相同的签名密钥

  • 如果业主 / X.509标识值是不同的,或证书失效日期两个之间的APK不同,那么你是不是使用两个的APK相同的签名密钥

请注意,即使两个证书之间的Owner / X.509值相同,也不意味着证书是相同的-如果其他任何不匹配的内容(例如指纹值),则证书也将不同。


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

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

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

keytool -list -keystore my-release.keystore

只需按Enter提示输入密码即可,如果您只是想快速检查SHA1值,则不必输入密码。


我在任何地方都找不到原始的密钥库

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

Android在“ 签名您的应用程序”页面上明确提到了这一点:

警告:将您的密钥库和私钥保存在安全的地方,并确保您具有安全的备份。如果您将某个应用发布到Google Play,然后丢失了用来签署该应用的密钥,则您将无法发布该应用的任何更新,因为您必须始终使用同一密钥对所有版本的应用进行签名。

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


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

不可以。APK仅包含公共信息,而不包含您的私钥信息。


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

不能。即使您找到原始文件,也无法使用键A签署APK,然后使用键A和B签署下一个更新,然后仅用键B签署下一个更新。

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

尝试这样做将导致显示消息“您的APK已使用多个证书签名。请仅使用一个证书签名并再次上传。”


我能做什么?

您将必须使用新的应用程序ID(例如,从“ com.example.myapp”更改为“ com.example.myapp2”)构建您的应用程序,并在Google Play上创建一个全新的列表。

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

您将失去现有的安装基础,评论等,并且将必须找到一种方法来吸引现有客户卸载旧应用程序并安装新版本。

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


我已经尝试了您提供的用于调试(我实际上正在搜索)的命令,但是它返回一个错误,表明该jar包含不包含时间戳的签名。我用这个线程创建我的APK:stackoverflow.com/questions/16622843/...
CularBytes

@RageCompex您没有输出,只有一个错误吗?当我运行该命令时,我还会收到一个时间戳警告(不是错误)。只要获得X.509输出,便是您所需要的。
Christopher Orr

是的,我确实获得了X.509输出,所以我猜这不是问题吗?那怎么样[CertPath not validated: Path does not chain with any of the trust anchors],不是问题吗?我确实在看到我的名字,CN所以我想我已经正确签名了:)
CularBytes

@RageCompex在“检查使用的签名密钥”部分中已经对此进行了回答。
Christopher Orr

我今天得了迷你型心脏病。我使用这些命令行来找出隐藏的密钥库。非常感谢,伙计!您救了我...真的:D
Ajeet

11

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


1
@体育他们确实警告您。请注意,大红色的警告信息:developer.android.com/tools/publishing/...
克里斯托弗·奥尔

2
@sports无论如何,您可以在同一个开发者帐户上发布多个应用程序,因此您无需再次付费。
Christopher Orr 2014年

7

今天,我遇到了同样的问题,不幸的是,我的密钥库文件中有两个别名。在此处输入图片说明


7

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

但是,将其Build => Clean Project修复。


1
嗯,我已经花了一个星期,尽一切可能。现在该说“ WTF”了,但这是唯一的帮助。(我也尝试过使无效的缓存无效。.)谢谢
Upsilon42 '19

1
这解决了该问题要疯了一小时后
鲍里斯Legovic

谢谢你 这是一个真正的救星!
伊恩·姆拜

我看不出这有关系。
无限循环

非常感谢!。我无意中生成了一个带有不同密钥库文件和凭据的签名apk,并上传了它。即使使用正确的密钥库上载apk,也保持同样的错误。经过一个小时的无效缓存创建新版本之后,android studio和PC重新启动,这终于解决了它。
阿伦

5

在这里,我得到了这个问题的答案。经过长时间的搜索后,我最终为此破解了密钥和密码。我忘记了我的密钥和别名,也忘记了jks文件,但幸运的是,我知道我输入的密码堆。但是找到正确的组合对我来说是最难的任务。

解决方案-下载此文件-Keytool IUI版本2.4.1插件 在此处输入图片说明

现在将弹出窗口,显示别名。.如果您的jks文件正确..右键单击别名并单击“查看证书链” ..它将显示SHA1密钥..将该密钥与tha密钥匹配当您在Google App Store中上传APK时...

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

现在很幸运,我有一堆密码可以匹配.. 在此处输入图片说明

现在转到此屏幕,将相同的jks路径..和密码(在您拥有的密码中)放入“证书文件”中的任何路径

如果屏幕显示任何错误,则密码不匹配..如果未显示任何错误,则说明您使用的是正确的jks文件。现在可以使用正确的别名和password(),您可以将apk上传到Play商店中:)


您丢失了私钥,并且能够通过这种方式检索它?如果答案是肯定的,那么您可以链接到哪里下载该工具?以及如何打开该应用程序?
LS_

4

如果您以前有一个备份的apk文件,请使用jarSigner从该apk中提取证书,然后使用该密钥或使用keytool克隆该证书,这可能会有所帮助...有用的链接是jarsigner文档keytool文档


5
“ ..使用jarSigner从该apk提取证书”-告诉我们该怎么做?
Rubycon

14
那将无法恢复您需要再次对apk签名的私钥。
botteaap 2011年

Apk必须使用相同的私钥签名
om252345

3

我强烈建议您使用Keystore Explorer(https://keystore-explorer.org/),它可以让您访问密钥库而不必将其上载到Google Play。这样,您就可以排除是否输入错误密码的问题。


1

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

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

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

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


0

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


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.