为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

守着一只汪 2019-06-26 12:50:49
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]但是我没有这个证书,也不想删除和重新发布应用程序,因为它有活跃的用户。我怎样才能用新的证书在我的应用程序上签名呢?
查看完整描述

3 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

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

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上创建一个全新的列表。

也许你还必须改变你的代码,这样即使安装了旧的应用程序,人们也可以安装新的应用程序,例如,你需要确保你没有冲突的内容提供者。

您将失去您现有的安装基础,评论等,并将不得不找到一个方法,让您的现有客户卸载旧应用程序,并安装新版本。

同样,确保您对用于此版本的密钥存储库和密码进行了安全备份。


查看完整回答
反对 回复 2019-06-26
  • 3 回答
  • 0 关注
  • 2135 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信