Play 控制台错误:Android App Bundle 未签名,并且使用错误的密钥进行签名

hot*_*oup 5 android google-play-console

我正在尝试将 AAB 上传到 Google Play 控制台,并且需要使用与 Google Play 预期匹配的上传密钥。

我使用 Android Studio 为我生成了一个新的密钥库 ( myapp.jks)。它要求我提供所有域名(DN;OU 等)信息,我假设它使用 OpenSSL 在后台生成自签名证书(?)。

当我用来keytool检查 JKS 内的密钥时(在 Android Studio 生成它之后),我看到它的指纹以1F. 到目前为止,一切都很好。

然后,我使用此密钥库文件签署我的 AAB,并尝试将其上传到我准备好的版本。当我这样做时,我收到错误:

在此输入图像描述

它期望使用以 开头的 SHA1 指纹签名的密钥85,但(正确地)看到我的 AAB 是使用以 开头的 SH1 指纹签名的1F。果然,如果我进入菜单Setup >> App Signing,我会看到 Google Play 期望的上传密钥证书具有以 开头的指纹85

因此,我将提供一个以 开头的 SHA1 指纹密钥1F,这是 Android Studio 为我创建的 JKS。

但我的 Google Play 应用程序帐户需要一个 SHA1 指纹以85.

我在此应用程序签名屏幕上看到“下载证书”链接,但仅下载上传证书,而不下载上传密钥

那么,我到底如何获得上传密钥(以 SHA1 指纹开头85),以便我可以用它签署我的 AAB 并让它被 Google Play 接受?!

Von*_*onC 3

据我从文档中了解到,签署 Android App Bundle (AAB) 并将其上传到 Google Play Console 应该是一个五个步骤的过程:

步骤 1:创建上传密钥 您需要创建上传密钥,该密钥与 Google 管理的应用签名密钥不同。根据Google Play Console 帮助页面,您应该:

  • 按照提供的说明创建上传密钥。
  • 使用此上传密钥签署您的应用程序包。

上传密钥用于验证应用程序首次上传到 Google Play 的过程。

第 2 步:签署您的 App Bundle 在上传到 Google Play 之前,您需要使用上传密钥签署 AAB。Android开发人员指南解释说,您应该使用 Android Studio 或命令行构建签名的 Android App Bundle。

步骤 3:向 Google Play 注册您的上传密钥 如果这是您第一次上传应用程序,或者您生成了新的上传密钥,则需要向 Google Play 注册。在Google Play Console 帮助页面上,“第 3 步:向 API 提供商注册您的应用签名密钥”下有详细说明。这一步非常重要,因为 Google 必须识别上传密钥来验证您的上传。

第 4 步:准备并推出您的版本 按照说明准备并在 Google Play 上推出您的版本。当您上传签名的 AAB 时,Google Play 将使用 Google 管理的应用签名密钥重新签署您的应用。Google Play 管理中心帮助中的“设置和管理 Play 应用签名”下突出显示了这一点。

第 5 步:了解 Google Play 的角色 根据Android 开发人员指南,Google Play 使用您上传的 AAB 为每个设备配置生成并提供优化的 APK。这意味着,虽然 Google Play 管理最终签名和分发,但您负责使用上传密钥进行初始应用程序包签名。


您看到的错误表明您用于签署 AAB 的密钥与在 Google Play 中注册的上传密钥不匹配。
确保您使用已注册的正确上传密钥。如果您丢失了上传密钥或它已被泄露,请按照“上传密钥丢失或泄露?”进行操作。Google Play 管理中心帮助中的部分可对其进行重置。

您必须使用您管理的上传密钥对 AAB 进行签名,然后将其上传到 Google Play,Google 将在其中管理应用签名密钥并将其用于应用的最终签名。两步签名过程涉及 Play 商店上应用的安全性和完整性。


来自评论:

那么我可以使用 OpenSSL(自签名)证书,将其添加到 JKS,使用 JKS/自签名证书签署我的应用程序,然后上传 AAB 吗?因为如果是这样,我尝试过,此时我得到的错误是:您的 Android 应用程序包使用错误的密钥进行签名。确保您的 App Bundle 使用正确的签名密钥进行签名,然后重试。这就像谷歌想要“鱼与熊掌兼得”,但它不能,自然法则严格禁止任何凡人有机体这样的恩惠

关于 OpenSSL(自签名)证书的使用,请在步骤 1:创建上传密钥步骤 3:向 Google Play 注册您的上传密钥中解决。

第 1 步:创建上传密钥

虽然从技术上讲可以使用 OpenSSL 自签名证书来创建 Java 密钥库 (JKS),但这不是标准做法,也不建议用于 Android 应用签名。正如Google Play Console 帮助文档中所述,标准做法是使用该实用程序创建新的上传密钥keytool,该实用程序是 Java 开发工具包 (JDK) 的一部分。然后,该上传密钥将用于在上传到 Google Play 之前对您的应用程序包进行签名。

第 3 步:向 Google Play 注册您的上传密钥:创建上传密钥后,您必须按照同一 Google Play管理中心帮助页面上的详细信息向 Google Play 注册。这是关键的一步,因为如果您使用 Google Play 无法识别的密钥对应用程序进行签名(例如,未注册为上传密钥的 OpenSSL 自签名证书),您将收到一条错误消息,指示应用程序包已签名用错钥匙。

要解决您的错误,请确保您用于签署 AAB 的密钥确实是您在 Google Play 中注册的上传密钥。如果您尝试使用任何其他密钥对 AAB 进行签名,即使它是有效的 JKS,Google Play 也会拒绝它,因为它与 Google 为您的应用记录的注册上传密钥不匹配。

因此,这里的“蛋糕”是在 Google 通过使用应用程序签名密钥重新签名来添加另一层安全性之前,通过使用已知且已注册的密钥对应用程序包进行签名来提供的安全性。
Google Play 要求注册上传密钥,以确保初始上传来自经过身份验证的来源,这有助于维护应用程序分发中的信任链。


那么,我到底如何获得上传密钥(以 SHA1 指纹开头85),以便我可以用它签署我的 AAB 并让它被 Google Play 接受?!

您已通过 Android Studio 创建了一个新的密钥库,该密钥库可能用于签署您的应用程序。当您使用命令检查此密钥库时keytool,您注意到此密钥库内密钥的 SHA1 指纹以 开头1F。新的密钥库旨在提供用于签署 Android 应用程序包 (AAB) 的上传密钥。

但是,当您尝试将签名的 AAB 上传到 Google Play 时,您收到错误。Google Play 控制台表明它需要一个 SHA1 指纹以 开头的上传密钥85,而不是1F。这种不匹配就是您收到错误的原因。

Google Play 控制台本质上是在说:“我识别出 SHA1 指纹以 开头的上传密钥85,但您向我提供的密钥的 SHA1 指纹以 开头1F。”

这意味着在某个时候,会生成一个上传密钥,并在 Google Play 中注册,并且其指纹以85. 这是 Google Play 希望您用于签署 AAB 的密钥。但是,您创建(和正在使用)的密钥库不包含此密钥;相反,它包含具有不同 SHA1 指纹 ( ) 的新密钥1F

Google Play 管理中心应用程序签名页面上的“下载证书”链接允许您下载与预期上传密钥(以 开头的密钥85)关联的公共证书。该证书可用于各种验证目的,但不包含签署应用程序所需的私钥。

要解决此问题,您需要找到包含以 SHA1 指纹开头的上传密钥的原始密钥库,85并使用它来签署您的应用程序。

如果您找不到此原始密钥库,则需要联系 Google Play 开发者支持来重置您的上传密钥。这意味着使用该keytool实用程序生成新的上传密钥。并使用该命令创建新的密钥库和密钥对keytool

keytool -genkeypair -v -keystore new-upload-keystore.jks -alias new-upload -keyalg RSA -keysize 2048 -validity 10000
Run Code Online (Sandbox Code Playgroud)

联系 Google Play 开发者支持并按照他们的流程重置上传密钥。Google 注册新的上传密钥后,请使用此密钥来签署您的 AAB。

并使用这个新的密钥库签署 AAB:

jarsigner -verbose -sigalg SHA256withRSA -digestalg SHA-256 -keystore new-upload-keystore.jks app-release.aab new-upload
Run Code Online (Sandbox Code Playgroud)

我正在尝试查找丢失的上传密钥,但可能必须启动“重置请求”过程。可能还有另一位开发人员生成了它,但他们在年底之前都在休假。同时,您能验证一下我对流程的理解是否正确吗?

相信我需要:

  1. 查找或重置上传密钥,该密钥将是 PEM 和 CER 文件对。CER 文件将具有 SHA-1 指纹,我可以在应用程序签名页面上看到该指纹。
  2. 然后,我使用包含 PEM 文件(我将通过 添加)的 JKS 签署我的 AAB(在构建时)keytool。这应该(理论上)允许我
  3. 将签名的 AAB 上传到我的封闭轨道版本。

确实如此,但您的上传密钥实际上是Java 密钥库 (JKS)文件,而不是 PEM 和 CER 文件。如果您找不到原始的 JKS 文件,您确实需要通过 Google Play 执行重置请求流程。重置后,Google Play 将为所有未来的上传使用新的上传密钥。

您使用 JKS 内的私钥对 AAB 进行签名。签名过程不直接涉及 PEM 文件。JKS 是 Java 使用的二进制密钥库格式,其中包含您的私钥和公共证书。该keytool命令可用于检查、导出、导入和管理此密钥库中的条目。您使用该jarsigner工具或 Android Studio 使用 JKS 签署 AAB(可能KeyStore Explorer也可以)。
此 JKS 内公共证书的 SHA-1 指纹应与 Google Play Console 的应用签名页面上显示的指纹匹配。

使用包含上传密钥的 JKS 签署 AAB 后,您可以将其上传到 Google Play 管理中心以进行封闭式跟踪版本。

将签名的 AAB 上传到 Google Play 管理中心以进行封闭式发布。如果 AAB 使用正确的上传密钥进行签名,Google Play 管理中心将接受它并继续进行发布过程。