使用 Google Play 应用签名

应用签名为 Android 应用提供了一种安全的更新机制。每个 Android 应用都将由开发者或 Google Play 通过私钥以加密形式签名。每个私钥都有关联的公钥证书,任何设备或服务都可以使用该公钥证书来验证应用是否使用来自可信来源的私钥进行了签名。这样可确保每项应用更新都是可信的,因为只有当更新的签名与所安装应用的签名匹配时,设备才会接受更新。要详细了解 Android 应用签名,请阅读签署您的应用

您选择加入 Google Play 应用签名计划后,Google 会为您管理和保护您应用的签名密钥,并使用该密钥为您的 APK 签名以进行分发。Google Play 应用签名的好处如下:

  • 可让您使用 Android App Bundle,并受益于 Google Play 的 Dynamic Delivery 功能。Android App Bundle 可以缩减您应用的体量、简化应用版本、实现动态功能和免安装体验。

  • 提高用于为应用 APK 签名的密钥的安全性,让您能够使用单独的上传密钥为您上传到 Google Play 的 app bundle 签名。使用单独的上传密钥的好处在于,您可以在密钥丢失或受损时请求重置上传密钥。如果您未选择加入 Google Play 应用签名计划,而又丢失了自己的应用签名密钥,则将无法更新自己的应用。

密钥类型和定义

以下是您应该了解的重要密钥类型、软件工件和工具:

  • 应用签名密钥:Google Play 用于对提供给用户设备的 APK 签名的密钥。如果您选择加入 Google Play 应用签名计划,则可以上传现有的应用签名密钥,也可以选择让 Google Play 为您生成一个应用签名密钥。作为 Android 的安全更新模型的一部分,应用签名密钥在应用的整个生命周期内保持不变。应用签名密钥属于私钥,因此必须保密。您可以与任何人共享应用签名密钥的公钥证书。

  • 上传密钥:用于在将 app bundle 或 APK 上传到 Google Play 之前对其进行签名的密钥。上传密钥必须保密。您可以与任何人共享上传密钥的公钥证书。您可以通过以下其中一种方式生成上传密钥:

    • 如果要让 Google 在您加入计划时为您生成应用签名密钥,则您用于为第一个版本签名的密钥将被指定为上传密钥。

    • 如果您在将新应用或现有应用加入计划时向 Google 提供应用签名密钥,则可以在选择加入计划的过程中或之后生成新的上传密钥,以提高安全性。

    • 如果您没有生成新的上传密钥,则继续将您的应用签名密钥用作上传密钥来为每个版本签名。

为确保您的密钥安全无虞,最好确保应用签名密钥和上传密钥各不相同。
  • 证书(.der 或 .pem):证书包含公钥和关于密钥所有者的一些额外识别信息。借助公钥证书,所有人都可以验证 app bundle 或 APK 的签名者。您可以从 Play 管理中心的“应用签名”页面下载您的应用签名密钥和上传密钥的公钥证书,以便向 API 提供商注册您的密钥。您可以与任何人共享公钥证书。公钥证书不包含您的私钥。

  • 证书指纹 - 证书的唯一简短表示形式,通常 API 提供商会同时请求证书指纹和软件包名称以注册使用其服务的应用。您可以在 Play 管理中心的“应用签名”页面上找到上传密钥的证书和应用签名证书的 MD5、SHA-1 和 SHA-256 指纹。您还可以从同一页面下载原始证书 (.der) 来计算其他指纹。

  • Java 密钥存储区(.jks 或 .keystore)- 安全证书和私钥的存储区

  • Play Encrypt Private Key (PEPK) 工具:使用此工具可从 Java 密钥存储区中导出私钥,并对私钥加密以便传输到 Google Play。在提供供 Google 使用的应用签名密钥时,请选择“从 Java 密钥存储区导出并上传密钥”选项,并按照说明下载和使用此工具。或者,您也可以选择“导出并上传密钥(不使用 Java 密钥存储区)”选项,以下载、查看和使用 PEPK 工具的开放源代码。

权限和访问权限

如果您是 Play 管理中心帐号的所有者,或者是具有全局“管理正式版”权限的用户,可以选择加入 Google Play 应用签名服务计划。您需要为每个开发者帐号分别接受一次服务条款。接受相关条款之后,您就可以让各个应用加入该计划了。

接受《服务条款》并不意味着与您的开发者帐号相关联的所有应用会自动加入应用签名计划。

Google Play 应用签名的运作机制

您使用 Google Play 应用签名时,您的密钥和 Google 自己的密钥将存储在相同的基础架构中。Google 的密钥管理服务会保护您的密钥,您可以阅读 Google Cloud 安全白皮书详细了解 Google 的技术基础架构。

如果您想要使用 Android App Bundle 发布应用,则需要先加入 Google Play 应用签名计划,然后再上传 app bundle。

Google Play 应用签名是一项可自由选择是否参与的计划,因此如果您想上传 APK(而非 app bundle),则可以选择继续自行管理密钥。不过,如果您丢失了密钥存储区或认为它可能已受损,则您将无法更新自己的应用,并且必须使用新软件包名称发布新应用。

以下是具体签名流程:

  1. 为您的 app bundle 或 APK 签名,并将其上传到您的 Play 管理中心。

  2. 下一步取决于您上传的内容:

    • App bundle:Google 会通过您的 app bundle 生成经过优化的 APK,然后使用应用签名密钥为 APK 签名。

    • 使用上传密钥签名的 APK:Google 会验证 APK 中的签名并将签名删除,然后使用应用签名密钥重新为该 APK 签名。

    • 使用应用签名密钥签名的 APK:Google 会验证签名。

  3. Google 向用户提供已签名的 APK。

在加入 Google Play 应用签名计划前后,您随时可以上传使用原始应用签名密钥签名的 APK。这样做的一个好处是,您可以直接在开放式测试轨道、封闭式测试轨道或内部测试轨道中测试您的 app bundle,同时继续在不含 Google Play 应用签名的正式版中发布现有 APK。

选择将新应用加入计划

第 1 步:创建上传密钥

  1. 要为新应用创建上传密钥,请按照关于如何为应用签名的说明操作

  2. 使用上传密钥为新 APK 签名。

第 2 步:准备和发布版本

  1. 按照相应步骤准备和发布版本

  2. 选择发布渠道后,请在“让 Google 管理并保护您的应用签名密钥”部分下配置应用签名。

  3. 选择继续即可让 Google 管理您的应用签名密钥,而选择高级选项可为您的应用选择最合适的选项。

  4. 为您的应用选择最合适的应用签名选项:

    • 要让 Google Play 生成密钥并为您的应用签名,请选择继续。您用于为第一个版本签名的密钥将成为上传密钥,并且应该用于为未来的版本签名。

    • 要使用与开发者帐号中的另一个应用相同的密钥,请依次选择高级选项 > 选项 2,然后选择相应的应用。

    • 要上传现有应用签名密钥,请依次选择高级选项 > 选项 2-4,以选择最适合您的发布流程的导出和上传选项。上传应用签名密钥后,您可以创建上传密钥,也可以继续将应用签名密钥用作上传密钥。

如果您尚未接受服务条款,则需要查看条款并选择接受,然后才能继续操作。如果您选择暂时不加入应用签名计划,可以按照以下说明随时将现有应用加入计划。

第 3 步:向 API 提供商注册应用签名密钥

如果您的应用使用任何 API,您通常需要注册 Google 用于为应用签名的密钥所对应的证书,以进行身份验证。通常通过证书的指纹来完成注册流程。

要查找 Google 用于为要发布的 APK 重新签名的密钥所对应的证书,请按以下步骤操作:

  1. 登录您的 Play 管理中心

  2. 选择相应的应用。

  3. 在左侧菜单中,依次选择版本管理 > 应用签名

  4. 在此页面中,您可以复制应用签名证书的最常用指纹(MD5、SHA-1 和 SHA-256)。如果 API 提供商需要其他类型的指纹,您也可以下载 DER 格式的原始证书,并通过 API 提供商要求的转换工具运行该证书。

选择将现有应用加入计划

第 1 步:加入 Google Play 应用签名计划

  1. 登录您的 Play 管理中心

  2. 选择相应的应用。

  3. 在左侧菜单中,依次选择版本管理 > 应用签名

  4. 如果适用,请查看《服务条款》并选择接受

第 2 步:将原始密钥发送给 Google

要将原始密钥上传到 Google Play 并创建上传密钥,请按以下步骤操作:

  1. 找到您的原始应用签名密钥。

  2. 登录您的 Play 管理中心

  3. 选择相应的应用。

  4. 在左侧菜单中,依次点击版本管理 > 应用签名

  5. 上传现有的应用签名密钥。选择最适合您的发布流程的导出选项和上传选项。

第 3 步:创建上传密钥(推荐)

  1. 创建上传密钥并将证书上传到 Google Play,或继续将应用签名密钥用作上传密钥。

  2. 在接下来显示的屏幕上,您会看到应用证书的指纹。出于测试目的,您可能需要使用证书指纹向 API 提供商注册上传密钥的证书(包括注册应用签名密钥)。

第 4 步:使用上传密钥为您的下一次应用更新签名

现有应用的所有更新都必须使用上传密钥签名。

  • 如果您没有生成新的上传密钥,请继续使用原始应用签名密钥为每个版本签名,然后再将其上传到 Google Play。如果您丢失了应用签名密钥,则可以生成新的上传密钥,并向 Google 注册该密钥以继续更新您的应用。

  • 如果您生成了新的上传密钥,请使用这个密钥为每个版本签名,然后再将其上传到 Google Play。Google 会检查相应版本是否已使用上传密钥签名,以验证您的身份。如果您丢失或损坏了上传密钥,则可以与开发者支持团队联系以重置上传密钥

创建上传密钥

为了提高安全性,我们建议您使用新的上传密钥(而不是应用签名密钥)为应用和未来的版本签名。您可以在加入 Google Play 应用签名计划时完成此步骤,也可以之后访问版本管理 > 应用签名以开始使用上传密钥。

上传密钥简介

  • 上传密钥只会在 Google 中注册,我们会用它来验证应用创建者的身份。

  • 在将您上传的任何 APK 发布给用户之前,我们都会从中移除您的签名。

上传密钥限制

  • 上传密钥必须为不小于 2048 位的 RSA 密钥。

  • 我们不支持以下类型的密钥:DSA 密钥、EC 密钥或小于 2048 位的 RSA 密钥。

创建上传密钥

  1. 生成新的上传密钥并将其存储在安全的位置。请按照相应说明生成新的上传密钥

  2. 将新生成的上传密钥的证书导出为 PEM 格式。确保替换带下划线的参数

$ keytool -export -rfc -keystore upload-keystore.jks -alias upload -file upload_certificate.pem

  1. 在系统提示时,上传您的上传密钥证书以向 Google 注册该证书。

更新您的密钥存储区

创建上传密钥后,请更新您的密钥存储区。例如,您可能需要检查以下位置:

  • 本地计算机

  • 上锁保护的现场服务器(变化的 ACL)

  • 云计算机(变化的 ACL)

  • 专属机密管理服务

  • (Git) 存储区

重置丢失或损坏的私有上传密钥

如果您丢失了自己的私有上传密钥或者私钥受损,则可以创建一个新私钥,然后与 Google Play 支持团队联系以重置该密钥。

重置上传密钥不会影响 Google Play 在您向用户提供 APK 之前用于对 APK 重新签名的应用签名密钥。

与我们的支持团队联系

我们的支持团队只接受来自 Play 管理中心帐号所有者的密钥重置请求。

帐号所有者可以通过填写此表单与我们联系。请务必附上 upload_certificate.pem 文件。

我们注册新的上传密钥后,会立即向您发送电子邮件。届时,您可以按照上述步骤更新您的密钥存储区以及 API 提供商注册信息

提示和最佳做法

  • 如果您还在 Google Play 之外分发应用或未来打算这样做,则可以在选择加入 Google Play 应用签名计划时生成要在每个应用商店中使用的应用签名密钥,然后再将其上传到 Google。

  • 为了保护您的开发者帐号,建议您为所有可访问您的 Play 管理中心的帐号开启两步验证

  • 在将 app bundle 发布到测试轨道或正式版轨道之后,您可以访问 app bundle 探索器,以下载一个包含适用于特定设备的所有 APK 的 ZIP 压缩文件。这些 APK 均使用应用签名密钥进行了签名。您可以使用 bundletool cmdline 实用工具在设备上安装 ZIP 压缩文件中包含的 APK。

  • 如果您选择加入 Google Play 应用签名计划,请生成与应用签名密钥不同的新上传密钥,以提高安全性。

  • 如果您丢失或损坏了上传密钥,则可以与 Google 联系以进行重置。

  • 如果您想要测试通过上传密钥签名的 APK,则必须向使用您应用的签名进行身份验证的任何服务或 API(例如 Google Maps API 或 Facebook SDK)注册您的上传密钥。如果您使用了任何 Google API,建议您在 Google Cloud Console 为您的应用注册上传证书。

本文是否对您有帮助?
您有什么改进建议?