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


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

可以做什么我要使用新证书对我的应用程序签名吗?

评论

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

你是怎么解决的?

@ int_32您如何解决它?

#1 楼

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


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


评论


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

– Peter Knego
2011年1月30日14:35



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

–克里希那巴德拉
13年1月23日在6:59

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

–克里斯托弗·奥尔(Christopher Orr)
14-10-10在10:12



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

–user156888
15年2月10日在11:19

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

–克里斯托弗·奥尔(Christopher Orr)
2015年4月23日在20:16



#2 楼

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

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

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

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


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

从APK中收集信息

您可以使用来检查原始APK和更新的APK使用了哪些证书这些命令,使用Java 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进行了签名。
如果原始APK和更新的APK之间的SHA1指纹值不同,则您没有对两个APK使用相同的签名密钥
如果Owner / 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。已使用多个证书签名。请仅使用一个证书签名并重新上传。“


我该怎么办?

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

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

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

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

评论


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

–CularBytes
15年7月2日在20:10

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

–克里斯托弗·奥尔(Christopher Orr)
15年7月2日在22:41

是的,我确实获得了X.509输出,所以我猜这不是问题吗?怎么样[CertPath未验证:路径不与任何信任锚链接],这不是问题吗?我确实在CN上看到了我的名字,所以我想我已经正确签名了:)

–CularBytes
15年7月3日在6:19

@RageCompex这已在“检查使用的签名密钥”部分中得到解答。

–克里斯托弗·奥尔(Christopher Orr)
2015年7月3日,9:53

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

– Ajeet
18/12/27在19:50

#3 楼

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

评论


@sports他们会警告您。注意红色的大警告消息:developer.android.com/tools/publishing/…

–克里斯托弗·奥尔(Christopher Orr)
2014年10月10日上午10:15

@sports在任何情况下,您都可以在同一开发者帐户上发布多个应用程序,因此您无需再次付费。

–克里斯托弗·奥尔(Christopher Orr)
2014年10月10日上午10:23

#4 楼

今天,我遇到了同样的问题,不幸的是,我的密钥库文件中有两个别名。

#5 楼

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

但是,Build => Clean Project修复了它。

评论


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

– Upsilon42
19年2月9日在11:27

疯了一个小时解决了这个问题

– Boris Legovic
19年3月7日在18:57

谢谢你这是一个真正的救星!

–伊恩·姆贝(Ian Mbae)
19年8月5日在14:08

我看不出这有关系。

–无限循环
19-09-20在17:41

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

–阿伦
3月10日14:03

#6 楼

如果您以前有一个APK文件(备份),请使用jarSigner从该apk中提取证书,然后使用该密钥或使用keytool克隆该证书,这可能会有所帮助... docs和keytool docs。

评论


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

– Rubycon
2011年1月30日14:01

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

–botteaap
2011年1月30日14:17

APK必须使用相同的私钥签名

–om252345
2012年7月16日在10:07

#7 楼

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

解决方案-
下载此-Keytool IUI版本2.4.1插件


现在将弹出窗口,显示别名。如果您的jks文件正确..
右键单击别名,然后单击“查看证书链”。.
它将显示SHA1密钥..将该密钥与您在上载时获得的tha密钥相匹配Google应用商店中的apk ...

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

现在很幸运,我有许多密码可以匹配..


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

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

评论


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

– LS_
16-9-29在8:55

#8 楼

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

#9 楼

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

#10 楼

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

2017年5月之后,Google Play商店在Play商店中添加新功能,这对Android开发人员来说是个好消息。 br />通过此功能,开发人员可以更新丢失了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/

评论


这不能回答问题。

– nathanfranke
9月7日上午9:40

#11 楼

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