为什么要使用 Play 应用签名功能?除了保护您的密钥免遭永久丢失或泄露,加入 Play 应用签名计划还可为您的 Android App Bundle (.aab) 带来增强功能。通过让 Google 为根据您的 app bundle 生成的优化型分发 APK 签名,您可以使用自动保护和基于 Gemini 模型的自动字符串翻译等宝贵服务。游戏可使用更多自动服务,例如 Play 游戏 Sidekick、边下载边玩和付费游戏免费试玩。
如需配置 Play 应用签名功能,您必须拥有管理员权限。
核心概念
使用 Play 应用签名功能时,您需要处理两个不同的密钥。了解这两者的区别及其技术格式,对于避免第三方 API 的身份验证问题至关重要。
| 密钥类型 | 谁是持有者? | 技术详情和用途 |
|
上传密钥 |
您(请妥善保管此密钥!) |
|
| 应用签名密钥 |
Google Play |
|
| 量子就绪 | Google Play |
|
注意:为尽可能提高安全性,您的上传密钥和应用签名密钥应有所不同。
Google 如何为您的应用签名:当使用应用签名密钥生成并为您的 APK 签名时,Google 会使用 apksigner 向应用的清单中添加两个戳记(com.android.stamp.source 和 com.android.stamp.type)。这些戳记旨在确保您的 APK 可安全地追溯到原始签名者。
设置 Play 应用签名功能
设置流程取决于您是要发布新应用还是迁移现有应用。
对于新应用
- 创建新应用:您的应用将自动注册量子就绪型混合签名,并使用 Google 生成的密钥。我们还会生成一个单独的经典密钥,用于 Android 16 及更低版本设备所识别的签名块。
- 创建上传密钥:生成密钥库,用于为版本 app bundle 签名。为此,您可在 Android Studio 中生成,也可从命令行内使用 Java keytool 实用程序。
- 上传 app bundle:前往 Play 管理中心,准备一个新版本。默认情况下,当您上传 app bundle 时,系统会自动为您的应用启用量子就绪型混合签名,并使用 Google 生成的密钥。
- 更改应用签名密钥(可选):想要自行管理密钥的高级开发者可以在版本发布到开放式测试轨道或正式版轨道之前,更改此默认设置。为此,您可以依次前往由 Google Play 提供保护 > Play 商店分发 > 前往 Play 应用签名,然后点击更改应用签名密钥。然后,您可以选择:
- 使用此开发者账号中的另一个应用所用的同一密钥
- 提供应用签名密钥的副本(按照说明操作)
对于现有应用
如果您目前自行管理密钥并上传 APK,则可以升级到 Play 应用签名功能,以利用 app bundle 和 Play 增强功能。
- 在 Play 管理中心内,依次前往由 Google Play 提供保护 > Play 商店分发 > 前往 Play 应用签名。
- 如果您尚未接受《服务条款》,请先予以接受。
- 传输原始密钥的副本:下载 PEPK 工具,然后按照统一的分步说明,从任意仓库中对现有应用签名密钥进行加密并上传。
向 API 提供商注册
如果您的应用使用 API(例如 Google Maps、OAuth 或 Facebook Login),这些服务会使用应用签名密钥的指纹为该应用验证身份。
由于 Google 会为最终 APK 签名,因此您必须向 API 提供商注册由 Google 持有的应用签名密钥指纹,而不仅仅是本地上传密钥的指纹。
- 依次前往由 Google Play 提供保护 > Play 商店分发 > 前往 Play 应用签名。
- 滚动到应用签名密钥部分。
- 复制所需的指纹(SHA-1 或 SHA-256)。如果您的应用使用量子就绪型混合签名,您必须复制三个密钥的指纹,并向 API 提供商逐一注册这些指纹:分别是用于较新设备的新经典密钥和 PQC 密钥,以及用于较旧设备的经典密钥。
- 将这些指纹粘贴到 API 提供商的控制台(例如 Google Cloud 控制台)中。
提示:如果您使用 Android App Links,请使用这些指纹更新 assetlinks.json 文件。
管理密钥
升级应用签名密钥
如果您的应用签名密钥遭到泄露,或者需要加密强度更高的密钥,您可以请求针对 Android 17(API 级别 37)及更高版本上的所有安装进行年度密钥升级。
不同 Android 版本中的强制执行方式:
- Android 17(API 级别 37)及更高版本:Android 平台会严格强制要求使用升级后的量子就绪型混合密钥。请参阅 APK 签名方案 v3.2。
- Android 13(API 级别 33)到 Android 16(API 级别 36):Android 平台会严格强制要求使用最新的经典密钥。请参阅 APK 签名方案 v3.1
- Android 7(API 级别 24)到 Android 12(API 级别 32):Android 平台本身不会强制要求使用升级后的密钥,且仍会识别最新的经典密钥。不过,Google Play 保护机制会检查应用更新是否使用了最新的经典密钥进行签名,从而提供额外的验证(除非用户关闭了该机制)。
重要的考虑因素:
- 共享数据:由于平台不会在 Android S(API 级别 32)及更低版本上强制要求使用升级后的密钥,因此如果您在多个应用中使用同一密钥来共享数据,这些旧版 Android 系统将只会识别旧版密钥,以用于自定义权限共享等功能。
如何升级:
- 依次前往由 Google Play 提供保护 > Play 商店分发 > 前往 Play 应用签名。
- 在“应用签名密钥”部分中,点击升级密钥。
- 选择升级路径:
- 让 Google Play 生成新的应用签名密钥(推荐)
- 使用与这个开发者账号中的其他应用相同的应用签名密钥
- 提供应用签名密钥的副本(按照说明操作)
- 点击保存。
- 向您的 API 提供商注册新的密钥指纹。如果您的应用使用量子就绪型混合签名,您必须注册两个新密钥(即新经典密钥和新 PQC 密钥)的指纹。
请求重置上传密钥
即使您丢失了上传密钥或怀疑它已泄露,您仍可访问自己的应用。
- 在 Android Studio 中创建新的上传密钥。
- 将证书导出为 PEM 格式:
keytool -export -rfc -keystore upload-keystore.jks -alias upload -file upload_certificate.pem
(如需有关 keytool 和密钥库路径的更多帮助,请参阅 Android Studio 应用签名指南)。 - 生成 PEM 文件后,在 Play 管理中心内提交重置请求。
- 依次前往由 Google Play 提供保护 > Play 商店保护 > 管理 Play 应用签名。
- 在上传密钥证书部分,点击请求重置上传密钥。
- 输入重置原因。
- 上传
upload_certificate.pem文件,然后点击请求。
最佳实践和替代分发方式
- 安全性:通过对所有用户强制执行两步验证来保护您的 Play 管理中心访问权限。
- app bundle 增强功能:加入 Play 应用签名计划后,您就可为 app bundle 启用增强功能。如需应用增强功能,请先在创建新版本时进行任何必要的配置更改,然后再上传新的 app bundle。
- 在 Google Play 之外分发:如果您通过其他应用商店分发,并想在所有地方使用同一个签名密钥,则有以下两种选择。[1] 您可以让 Google 生成应用签名密钥,然后从 Play 管理中心或 Play Developer API 下载已签名的通用 APK 以便在其他地方分发(在 Play 管理中心内,依次前往测试和发布 > 最新版本和 app bundle,选择您的 app bundle,然后点击下载标签页);或者 [2] 您可以生成要用于所有应用商店的应用签名密钥,并在配置 Play 应用签名时将该密钥的副本传输给 Google。详细了解应用更新的运作方式,以及您启用或停用跨商店更新的选项。
- 测试:使用内部应用分享功能测试 Google Play 将向用户提供的确切内容,或从 App bundle 资源管理器下载设备专用 APK,并使用 adb install-multiple *.apk 在本地安装这些 APK。
- APK 签名方案 v4:Play 应用签名功能会自动为符合条件的应用使用 v4 签名,以支持在搭载 Android 11 及更高版本的设备上进行优化型分发。您无需执行任何操作。这会排除所有使用量子就绪型混合签名的应用,因为该签名方案尚不兼容 v4 签名。如需详细了解技术优势,请参阅 APK 签名方案 v4 文档。
自行托管的 Google Cloud 项目
如果您有非常具体的安全性要求(例如使用 OEM 密钥),则可以使用 Play Developer API 通过自行托管的 Google Cloud 项目注册 Play 应用签名。
这属于非标准设置,不建议使用。使用自行托管的项目意味着您需要对应用签名操作承担全部责任。
- 这将导致 Google Play 无法执行灾难恢复等基本功能。
- Google 无法重新生成或修复现有版本。如需修正任何与版本相关的错误,您必须上传新版本。
- 在此配置下,您可能无法使用高级优化功能、某些 Play 增强功能以及量子就绪型混合签名等安全功能。
- 生成签名密钥或将其导入 Cloud KMS,确保位置配置为美国多区域,并遵循 KMS 密钥导入文档。
- 如需更改签名密钥,请使用 enrollApp 方法。只有在应用发布到开放式测试轨道或正式版轨道之前,才能更改签名密钥。
- 如需在发布后升级签名密钥,请使用 rotateAppSigningKey 方法。
- 向使用 Google Play Developer API 进行身份验证的客户端或服务账号授予以下 IAM 角色:
- 确保您有足够的配额来执行加密操作。具体而言,我们建议将 asymmetric_requests 的配额增加到至少 350 QPS。
- 如需查看签名密钥的使用情况,请在 Cloud KMS 项目中启用审核日志。