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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (119)

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

今天我更新了这个应用程序,但是我删除了以前的密钥存储库,创建了一个新的应用程序。

在上传时,它说APK必须与上一版本的证书签署相同的证书:

上传失败 将使用不同证书签名的APK上载到以前的APK,必须使用相同的证书。 现有的APK与带有指纹的证书签署:用于签署上传的APK的证书有指纹

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

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

提问于
用户回答回答于

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

用户回答回答于

错误地用调试密钥签名的吗?

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之间是不同的,然后对两个apk使用相同的签名密钥。
  • 如果业主/X.509标识值是不同的,或者两个apk之间的证书到期日期不同,那么您就可以了。对两个apk使用相同的签名密钥。

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

如果两个apk有不同的证书信息,那么查找原始密钥存储库,即带有Google播放的第一个SHA 1指纹值的文件(或keytool)告诉过你。

搜索计算机上和任何备份中可以找到的所有密钥存储文件,直到找到具有正确SHA 1指纹的文件为止:

keytool -list -keystore my-release.keystore

如果提示输入密码,只需按Enter-如果您只想快速检查SHA 1值,则不必输入它。

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

如果找不到原始的密钥存储库,将绝不可能能够发布对这个特定应用程序的任何更新。

Android在签署申请页:

警告:将您的密钥存储库和私钥保存在一个安全可靠的位置,并确保它们的备份是安全的。如果你向谷歌Play发布了一个应用程序,然后丢失了你签署应用程序的密钥,你将无法发布对你的应用程序的任何更新,因为你必须始终用相同的键签署你的应用程序的所有版本。

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

扫码关注云+社区