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

不久前,我将自己的应用上传到谷歌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] < br > 用于签名您上传的APK的证书具有指纹:
(SHA1: 20:26: F4: C1: DF: 0 f: 2 b: D9:46:03: FF:阿瑟:07:B1:28:7B: 9 c: 75:44: CC] < / p >

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

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

292193 次浏览

没什么。阅读文档:在Android Market发布更新

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

什么都没有-谷歌清楚地表示应用程序是由用于签名的密钥标识的。因此,如果您丢失了密钥,则需要创建一个新的应用程序。

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

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

谷歌Play不允许您发布使用调试密钥库签名的应用程序。如果您尝试上传这样的APK,谷歌播放将失败,并提示“您上传了一个在调试模式下签名的APK”。您需要在释放模式下签署APK。”

然而,如果你试图上传一个带有调试密钥库签名的更新,你将看到这个消息;谷歌播放将显示问题中所示的消息,指的是SHA1指纹。

因此,首先,检查是否错误地用调试密钥为应用程序签名。


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

从APK收集信息

你可以使用Java keytool来检查原始APK和更新APK是用哪些证书签名的:

keytool -printcert -jarfile original.apk
keytool -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之间的Owner、SHA1和Expiry值

  • 如果老板/x身份值是CN=Android Debug, O=Android, C=US,那么您已经用您的调试的关键签署了APK,而不是原始的释放密钥

  • 如果原始apk和更新apk之间的SHA1指纹值不同,那么你确实为两个apk使用了相同的签名密钥

  • 如果老板/x身份值不同,或者两个apk之间的证书过期日期不同,则对两个apk使用相同的签名密钥

注意,即使Owner/X。509的值在两个证书之间是相同的,这并不意味着证书是相同的-如果其他任何地方不匹配-例如指纹值-那么证书是不同的。


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

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

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

keytool -list -keystore my-release.keystore

如果提示输入密码,只需按输入 -如果你只是想快速检查SHA1值,你不一定要输入它。


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

如果你找不到原始的密钥库,你将从来没有能够发布任何更新到这个特定的应用程序。

Android在签署申请页面中明确提到了这一点:

警告:将您的密钥存储库和私钥保存在一个安全的地方,并确保您有它们的安全备份。如果你发布一个应用到谷歌Play,然后丢失了你签名应用程序的密钥,你将不能发布任何更新到你的应用程序,因为你必须总是用相同的密钥签名你的应用程序的所有版本。

在APK的第一个发行版之后,所有后续发行版都必须使用完全相同的密钥进行签名。


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

不。这是不可能的。APK只包含公共信息,不包含您的私钥信息。


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

不。即使您找到了原始版本,也不能使用密钥A签署APK,然后使用密钥A和B签署下一次更新,然后仅使用密钥B签署下一次更新。

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

尝试这样做将导致消息“您的APK已与多个证书签署”。请只签署一份证书,并重新上传。


我该怎么办?

你必须用一个新的应用程序ID来构建你的应用程序(例如从"com.example.myapp"到“com.example.myapp2"”),并在谷歌Play上创建一个全新的列表。

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

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

同样,请确保您拥有此版本所使用的密钥存储库和密码的安全备份。

在这里我得到了这个问题的答案。在搜索了太长时间后,我终于破解了这个密钥和密码。我忘记了我的钥匙和别名,也jks文件,但幸运的是,我知道一串密码,我把它。但找到正确的组合对我来说是最困难的任务。

——< p >解决方案 下载这个- Keytool IUI版本2.4.1插件 enter image description here < / p >

窗口将弹出现在它显示别名..如果您的JKS文件正确.. 右键单击别名,点击“查看证书链”.. 它会显示SHA1键..匹配此密钥与您在谷歌应用程序商店上传apk时获得的密钥…< / p >

如果它匹配,那么你是正确的JKS文件和别名..

现在幸运的是我有一串密码来匹配.. enter image description here < / p >

现在转到这个屏幕,放入相同的JKS路径..和密码(在你拥有的密码中)在“证书文件”中输入任意路径

如果屏幕显示任何错误,那么密码不匹配。如果没有显示任何错误,则意味着您使用的是正确的JKS文件。正确的别名和密码() 现在,你可以上传你的apk在play商店:)

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

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

我强烈推荐密钥库资源管理器(https://keystore-explorer.org/),它可以让您访问您的密钥库,而无需将其上传到谷歌Play。这样,您就可以排除是否输入了错误的密码。

这事突然就发生了。我真的不认为我改变了什么。

然而,Build => Clean Project修复了它。

您可以使用新功能谷歌播放应用程序签名生成一个新的密钥文件。

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

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

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

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

请检查您的android/app/build.gradle文件

android{
...
buildTypes {
release {
// signingConfig signingConfigs.debug
signingConfig signingConfigs.release
}
}
...
}

在释放appbundle之前,它应该启用signingConfig signingConfigs.release this行,而不是signingConfig signingConfigs.debug this行。

我犯了这个愚蠢的错误。

我通过debug sign in config发布在其他设备上测试我更新的应用程序,当我准备发布更新时,我没有更改配置,并发布了具有调试配置的包。

在我挠头大约一个小时后,我意识到我一直有这个debug config,然后我把它改成release mode,现在问题解决了。

什么对我有效:我意识到我之前上传了一个。aab文件,现在我试图上传。apk文件。我只需要检查构建设置上的构建应用捆绑包(谷歌Play)