不久前我将我的应用程序上传到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]
但是我没有这个证书,也不想删除和重新发布应用程序,因为它有活跃的用户 .
如何使用新证书签署我的应用程序?
7 回答
没有 . 阅读文档:Publishing Updates on Android Market
您是否错误地使用调试密钥签名?
Google Play不允许您发布使用调试密钥库签名的应用 . 如果您尝试上传此类APK,Google Play将会失败并显示“您上传了以调试模式签名的APK . 您需要在发布模式下签署APK” .
但是,如果您尝试上载使用调试密钥库签名的更新,则不会看到此消息; Google Play会显示问题中显示的消息,指的是SHA1指纹 .
首先,检查您是否错误地使用调试密钥对应用程序进行了签名 .
如何查看使用了哪些签名密钥?
从APK收集信息
您可以使用Java
keytool
检查原始APK和更新APK使用这些命令签署的证书:这会向您显示有关APK签名方式的详细信息,例如:
这里需要注意的重要部分 - 每个APK - 是 SHA1 指纹值, Owner 标识值和 Valid from/until 日期 .
如果
keytool
命令不起作用(-jarfile
选项需要Java 7),您可以通过jarsigner
命令获取更多基本信息:遗憾的是,这并未显示SHA1指纹,但确实显示了X.509所有者身份以及证书到期日期 . 例如:
您可以忽略任何“CertPath not validated”消息,以及有关证书链或时间戳的警告;在这种情况下,它们并不相关 .
比较APK之间的所有者,SHA1和到期值
如果 Owner / X.509 标识值为 CN=Android Debug, O=Android, C=US ,那么您已使用 debug key 而不是原始版本密钥对APK进行了签名
如果原始版本和更新APK之间的 SHA1 指纹值不同,那么您对这两个APK都使用了相同的签名密钥 not
如果 Owner / X.509 身份值不同,或两个APK之间的证书到期日不同,那么您确实 not 对两个APK使用相同的签名密钥
请注意,即使两个证书之间的所有者/ X.509值相同,这也不意味着证书是相同的 - 如果其他任何内容不匹配 - 例如指纹值 - 那么证书就不同了 .
搜索原始密钥库,检查备份
如果两个APK具有不同的证书信息,那么您必须找到原始密钥库,即具有Google Play(或
keytool
)告诉您的第一个SHA1指纹值的文件 .搜索您可以在计算机上以及任何备份中找到的所有密钥库文件,直到获得具有正确SHA1指纹的文件:
如果提示输入密码,只需按Enter即可 - 如果您只想快速检查SHA1值,则无需输入密码 .
我无法在任何地方找到原始密钥库
如果找不到原始密钥库,则 never 能够发布对此特定应用程序的任何更新 .
Android在Signing Your Application页面上明确提及:
After the first release of an APK, all subsequent releases must be signed with the exact same key.
我可以从原始APK中提取原始签名密钥吗?
不,这是不可能的 . APK仅包含公共信息,而不包含您的私钥信息 .
我可以迁移到新的签名密钥吗?
不会 . 即使您找到原始版本,也无法使用密钥A签署APK,然后使用密钥A和B签署下一个更新,然后仅使用密钥B签署下一个更新 .
在技术上可以签署具有多个密钥的APK(或任何JAR文件),但Google Play不再接受具有多个签名的APK .
尝试这样做会导致消息“您的APK已使用多个证书进行签名 . 请仅使用一个证书进行签名并再次上传 . ”
我该怎么办?
您必须使用新的应用程序ID构建应用程序(例如,从“com.example.myapp”更改为“com.example.myapp2”)并在Google Play上创建一个全新的商家信息 .
可能您还需要更改代码,以便人们可以安装新应用,即使他们安装了旧应用,例如您需要确保没有冲突的内容提供商 .
您将丢失现有的安装基础,评论等,并且必须找到一种方法让现有客户卸载旧应用并安装新版本 .
同样,确保您拥有用于此版本的密钥库和密码的安全备份 .
没什么 - 谷歌明确表示应用程序是通过用于签名的密钥来识别的 . 因此,如果丢失了密钥,则需要创建新的应用程序 .
今天我面临同样的问题,遗憾的是,我的密钥库文件中有两个别名 .
在这里,我得到了这个问题的答案 . 在搜索了太久之后,我终于破解了密钥和密码 . 我忘记了我的密钥和别名也是jks文件,但幸运的是我知道我放入密码的密码 . 但找到正确的组合对我来说是最艰巨的任务 .
解决方案 - 下载此 - Keytool IUI版本2.4.1插件
窗口将弹出现在它显示别名 . 如果你的jks文件是正确的..右键单击别名并点击“查看证书链”..它将显示SHA1键..匹配此密钥与你得到的密钥当你在谷歌应用商店上传apk时...
如果它匹配,那么你使用正确的jks文件和别名..
现在幸运的是我有一堆密码来匹配..
现在去这个scrren把相同的jks路径..和密码(你有密码)放在“证书文件”中的任何路径
如果屏幕显示任何错误,则密码不匹配..如果它没有显示任何错误,则表示您使用的是正确的jks文件 . 正确的别名和密码()现在你可以上传你的apk在Play商店:)
如果你有以前的apk文件(备份)然后使用jarSigner从那个apk中提取证书,然后使用该密钥或使用keytool克隆该证书,可能会有帮助...有用的链接是jarsigner docs和keytool docs .
我最近遇到过这个问题,尝试了不同的方式登录,如启用V1或V2,通过更改别名和 last come to know that I am using wrong key store file 登录