猿问

apk必须使用与上一版本相同的证书进行签名。

apk必须使用与上一版本相同的证书进行签名。

不久前,我将我的应用程序上传到GooglePlay(当时它被称为AndroidMarket)。

今天我更新了这个应用程序,但是我删除了以前的keystore并创建了一个新的应用程序。
上传时,它说APK必须使用与上一版本相同的证书签名:

上传失败

您将使用不同证书签名的APK上载到以前的APK。您必须使用相同的证书。

您现有的APK与带有指纹的证书签署:
[SHA 1:89:2F:11:FE:CE:D6:CC:DF:65:E7:76:3E:DD:A7:96:4F:84:DD:BA:33]
用于签署您上传的APK的证书有指纹:
[SHA 1:20:26:F4:C1:DF:0F:2B:D9:46:03:FF:AB:07:B1:28:7B:9C:75:44:CC]

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

我怎样才能用新的证书在我的应用程序上签名呢?


守着一只汪
浏览 2136回答 3
3回答

哔哔one

您错误地用调试密钥签名了吗?GooglePlay不允许发布与调试密钥库签名的应用程序。如果您试图上传这样的APK,Google Play将无法使用“您上传了一个在调试模式下签名的APK,您需要在发布模式下签署您的APK”。但是,如果您试图上传更新它是用调试密钥存储库签名的,您将不查看此消息;GooglePlay将显示问题中显示的信息,引用SHA 1指纹。因此,首先,检查您是否错误地用调试密钥签署了应用程序。如何检查使用了哪些签名密钥?从APK收集信息您可以使用以下命令,使用Java检查原始APK和UPDATE 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-是SHA 1指纹值业主标识值,以及自[直到]有效日期。如果那keytool命令不起作用(-jarfile选项需要Java 7),您可以通过jarsigner指挥:jarsigner -verify -verbose:summary -certs original.apk jarsigner -verify -verbose:summary -certs update.apk不幸的是,这并没有显示SHA 1指纹,而是显示了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之间的所有者、SHA 1和到期值如果业主/X.509身份值是CN=Android Debug, O=Android, C=US,那么您已经与您的调试键,而不是原始的发布密钥。如果SHA 1指纹值在原始的和更新的apk之间是不同的,然后您做了。不对两个apk使用相同的签名密钥。如果业主/X.509标识值是不同的,或者两个apk之间的证书到期日期不同,那么您就可以了。不对两个apk使用相同的签名密钥。请注意,即使所有者/X.509值在两个证书之间是相同的,这并不意味着证书是相同的-如果有其他不匹配的地方-例如指纹值-那么证书是不同的。搜索原始密钥存储库,检查备份如果两个apk有不同的证书信息,那么必查找原始密钥存储库,即带有Google播放的第一个SHA 1指纹值的文件(或keytool)告诉过你。搜索计算机上和任何备份中可以找到的所有keystore文件,直到找到具有正确SHA 1指纹的文件为止:keytool -list -keystore my-release.keystore只要按下进入如果提示输入密码-如果您只想快速检查SHA 1值,则不必输入它。我在任何地方都找不到原来的密钥存储库如果您找不到原来的密钥存储库,您将绝不可能能够发布对这个特定应用程序的任何更新。Android在签署申请页:警告:将您的密钥存储库和私钥保存在一个安全可靠的位置,并确保您有它们的安全备份。如果你在Google Play上发布了一个应用程序,然后失去了你签署应用程序的密钥,你将无法发布对你的应用程序的任何更新,因为你必须始终用相同的键签署你的应用程序的所有版本。在APK的第一个版本之后,所有后续版本都必须使用完全相同的键进行签名。我能从原始APK中提取原始签名密钥吗?没有。这是不可能的。APK只包含公共信息,而不包含私钥信息。我可以迁移到一个新的签名密钥吗?没有。即使你找到了原件,你也不能用A键签署APK,然后用A键和B键签署下一次更新,然后用键B签署下一次更新。用多个密钥对APK(或任何JAR文件)进行签名是技术上有可能,但是Google Play不再接受带有多个签名的APK。尝试这样做会导致“您的APK已用多个证书签名。请只用一个证书签名并再次上传。”我能做什么?您必须使用新的应用程序ID(例如,从“com.example.myapp”更改为“com.example.myapp 2”)构建应用程序,并在GooglePlay上创建一个全新的列表。也许你还必须改变你的代码,这样即使安装了旧的应用程序,人们也可以安装新的应用程序,例如,你需要确保你没有冲突的内容提供者。您将失去您现有的安装基础,评论等,并将不得不找到一个方法,让您的现有客户卸载旧应用程序,并安装新版本。同样,确保您对用于此版本的密钥存储库和密码进行了安全备份。
随时随地看视频慕课网APP

相关分类

Android
我要回答