使用提供的upload_cert.der文件对发布的Android APK文件进行签名

20

我刚刚加入了Google Play 应用签名计划,该计划要求上传加密版本的发布密钥库,并有一个"可选"步骤来创建上传密钥库——这里的 "可选" 用引号括起来,因为我认为它应该是必须的步骤。总之,在成功注册后,我现在有一个上传证书,我应该以某种方式使用它来签署未来的应用程序发布。

到目前为止,我已经从Android Studio创建了一个新密钥库,设置了存储和别名密码,并尝试将upload_cert.der导入到现有别名中-但失败了:

keytool -importcert -file upload_cert.der -alias upload -keystore upload-keystore.jks

keytool错误:java.lang.Exception:应答中的公钥与密钥库中的公钥不匹配

我还尝试过在不指定别名(或删除现有别名并创建新别名)或使用不同别名的情况下导入上传证书:

keytool -importcert -file upload_cert.der -keystore upload-keystore.jks

...也失败了:最终创建了一个名为mykey的新别名,它没有密码保护,并显示以下错误消息:

原因是:java.lang.RuntimeException: com.android.ide.common.signing.KeytoolException: 无法从存储“/path/to/upload-keystore.jks”读取密钥上传:可信证书条目未受密码保护

...因此,我尝试为该别名设置密码:

keytool -keypasswd -alias upload -keystore upload-keystore.jks

执行后仍然失败,显示以下消息:

keytool错误: java.lang.Exception: 别名 没有密钥

...现在我已经没有更多的想法了。

同时,我已向Google Play支持发送了一个问题/请求,以更新我的上传密钥,但我希望能有解决这种情况的方法(支持回复速度有点慢),因为文档并没有以任何方式暗示生成上传密钥库并上传该密钥库的加密私钥是必需的。所以,要么文档模糊/不清晰/错误,要么有一种方法可以使用生成的upload_cert.der文件。有什么想法吗?

编辑:

感谢Pierre提供的答案和评论,我意识到如果您不创建/提供上传密钥,则应使用您现有的原始签名密钥,并使用upload_cert.der。因此,唯一的要求是通过运行以下命令插入上传证书:

keytool -importcert -file upload_cert.der -keystore original-signing-keystore.jks

...而且您应该能够继续将您的应用程序发布到Play商店中。


我有一个类似的情况,我不确定为什么,但当我今天尝试在Google Play商店更新到内部跟踪时,我的上传证书已更改其签名。我有原始密钥库,但上传证书的签名不正确。我现在已经更新并获取了我的本地upload_cer.der文件,但我只能将其添加为trustedCertEntry到我的密钥库中。当我尝试上传到Playstore时,它会显示使用了无效的上传签名。这是一个类似的问题吗?根据您的编辑,这是否已被接受,因为它与我的密钥库和新的.der一起上载? - Jeffrey Holmes
1个回答

18
你上传到Play控制台的.der文件(也可在Play控制台的应用签名页面下载)没有包含私钥,它只包含公钥,因此你将无法使用它签署任何内容。
仅创建用于生成上传证书的密钥库包含私钥,并且必须用于签署你的APK(或应用程序包)。
换句话说,在Play Signing注册后,你不应该创建另一个密钥库,而应该使用你已创建的密钥库来生成上传证书并签署未来的构件。
希望这有所帮助。

8
是的,这有助于使事情更加清晰,但不幸的是并未解决我的问题。问题在于我在注册之前没有创建上传密钥库,因为当时它是一个“可选”步骤,Google只是自己创建了上传证书,这与我所拥有的密钥库没有任何关联。希望这能让我的问题更加清晰...我正在尝试弄清楚为什么允许这样做,如果无法使用自动生成的upload_cert.der。 - Bojan Ilievski
2
如果您在注册时没有向Google Play提供上传证书,则Play将视您的签名密钥为上传密钥,并且您应该继续使用相同原始密钥签名的APKs/Bundles进行上传。如果您想使用不同的密钥签署上传的构件,则需要通过联系支持团队来重置它,就像您所做的那样。 - Pierre
1
如果是这样的话,太好了,如果我仍然可以使用我的旧签名密钥,那就是一个选项...谢谢,我会尝试一下,如果它有效,我会接受这个答案。 - Bojan Ilievski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接