带有上传证书的Android Sign APK(如何确保正确的指纹)

Posted

技术标签:

【中文标题】带有上传证书的Android Sign APK(如何确保正确的指纹)【英文标题】:Android Sign APK With Upload Certificate (How To Ensure Correct Fingerprint) 【发布时间】:2018-04-24 21:19:05 【问题描述】:

这是 Google 关于签署 APK 的文档: https://developer.android.com/studio/publish/app-signing.html

文档看起来相当简单。我已经能够将来自其他各种页面和 Stack Overflow 线程的进程拼凑在一起。但是,我签署APK后,APK中的SHA-1证书指纹是错误的,这意味着我没有使用正确的证书签署APK。

您上传的 APK 未使用上传证书进行签名。 您必须使用相同的证书。上传证书有 指纹:

[SHA1:指纹]

并且用于签署您上传的 APK 的证书有 指纹:

[SHA1:指纹]

我的问题是:如何确保我生成的密钥库正在使用来自 Google Play 控制台的上传证书?

这就是我所做的:

以 Google 开发者身份注册并在控制台中创建应用 点击 App Signing 并下载上传证书 (upload_cert.der) 然后我使用 keytool 来导入证书并创建密钥库:“C:\Program Files\Java\jdk1.8.0_161\bin\keytool”-importcert -file upload_cert.der -keystore [appname].jks -别名 "[appname]" 。这成功了,因为它确实创建了密钥库文件。但是,我的直觉是,这就是过程出错的地方。我不认为证书是导入的。 我使用以下命令检查了密钥库:"C:\Program Files\Java\jdk1.8.0_161\bin\keytool" -list -keystore [appname].jks 和 输出的指纹与我的完全不同上传证书的指纹。 我也试过: "C:\Program Files\Java\jdk1.8.0_161\bin\keytool" -importcert -file upload_cert.der -genkey -v -keystore [appname].jks -keyalg RSA -keysize 2048 -validity 10000 -alias [appname] 这成功并推出了 .jks 密钥库文件 我生成了一个未签名的 APK(存档) 在 Visual Studio 中,我单击了“分发...”-> Ad Hoc 导入我的密钥库文件并单击“另存为”,这似乎签署了我的 APK 然后,我将它上传到商店,但商店拒绝了它,说它的指纹有误。 所以,我也使用密钥来检查 RSA 文件中的指纹。 "C:\Program Files\Java\jdk1.8.0_161\bin\keytool" -printcert -file [appname].RSA .指纹错误。

我缺少哪些步骤?

注意:谷歌文档说这是手动签名的过程:

https://developer.android.com/studio/publish/app-signing.html#sign-manually

keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias

apksigner 签名 --ks my-release-key.jks --out my-app-release.apk my-app-unsigned-aligned.apk

但是这些步骤并没有以任何方式使用上传证书...

您现有应用的所有更新现在都必须使用您上传的内容进行签名 钥匙。这将允许 Google 验证您的身份。

这完全有道理。本质上,我要做的就是用我从谷歌上传的密钥对 APK 进行签名。我有上传密钥。但是,谷歌没有记录的步骤是如何将上传密钥转入密钥库,以便我可以使用密钥库对 APK 进行签名。它看起来很简单,但它不起作用。

【问题讨论】:

【参考方案1】:

您的私钥似乎丢失了。上传证书是您的第一个上传应用程序的证书,并在您上传时创建。您需要使用该.keystore 文件来签署您的应用程序。

如何确保我生成的密钥库正在使用来自 Google Play 控制台的上传证书?

这是不可能的。根据谷歌Manage your app signing keys:

证书:证书包含一个公钥以及一些额外的 识别有关谁拥有密钥的信息。

证书不包含私钥。所以它不能用来创建密钥库。

解决这个问题的唯一方法是重置上传密钥,如上面article末尾所述。

您可以参考以下在 xamarin 中发布应用的指南:Publishing to Google PlaySigning the Android Application PackageManually Signing the APK

【讨论】:

你是对的。发生的事情是我创建了一个密钥库,用它签署了我的 APK,将其上传到商店,然后删除了密钥库。所以,问题不在于我需要将上传证书导入密钥库。这甚至是不可能的。问题是我需要使用原始密钥库。我的问题确实措辞不正确,我需要更改它才能正确回答问题。 我或多或少认为这个过程比实际复杂得多。让我感到困惑的是,Play商店给了我一个应用证书和一个上传证书。我以为他们希望我在上传之前用其中一个签名我的应用程序。我不明白他们为什么要我创建一个临时密钥库。但是,现在我意识到这是因为第一个密钥库被认为是最终且唯一的密钥库,将在应用程序的整个生命周期中使用。 我想我还是不明白他们为什么还要费心向我们展示证书。它们看起来很重要,但 Google 管理着它们,那么向我们展示它们有什么意义呢? @MelbourneDeveloper 通常使用asymmetric cryptography对apk进行签名,比如RSA。它有一个配对的公钥和私钥。例如,如果您有许多应用程序并且他们使用不同的私钥进行签名,您可以通过 google 显示的证书找到正确的私钥。 @BillyLiu-MSFT 您好,我已经启用了与现有应用程序.keystore 的谷歌应用程序签名,我面临的问题是我当前的版本构建显示不同的SHA-1 密钥,虽然我签署了它与相同的.keystore

以上是关于带有上传证书的Android Sign APK(如何确保正确的指纹)的主要内容,如果未能解决你的问题,请参考以下文章

您上传的 APK 或 Android App Bundle 使用尚未有效的上传证书签名,因为它最近已重置

React native - 您上传的 APK 没有使用上传证书签名

Google 控制台 APK 上传 - 新应用程序失败

如何签署我已经制作的 android app/.apk 文件

您需要为您的 APK 或 Android App Bundle 使用不同的版本代码

Ionic - 如何为 Android 应用程序的更新版本上传 apk