Google Play 上的每一个应用都会被签名两次:一次由你在上传前完成,另一次由 Google 在文件送达用户设备前完成。第二次签名所用的那个密钥——应用签名密钥——是整个应用里唯一无法通过重新上传安装包来替换的东西;而到了 2026 年,它的大部分已经托管在 Google 自己的密钥基础设施里。本文讲清楚 Play 应用签名到底做了什么、三类密钥的分工、新应用与存量应用分别怎么接入、哪些指纹必须注册到 API 服务商、上传密钥丢失后的重置流程,以及应用签名密钥升级在不同 Android 版本上的强制执行规则。
为什么签名密钥比账号本身更值钱
开发者账号可以改名、可以重新验证、可以在不同主体之间转让、也可以从个人升级为企业。签名密钥不行。Android 判断一次更新是否合法,靠的是比对安装包与已安装版本是否由同一个密钥签名——一旦这条链断了,你唯一能做的事就是换一个包名重新发布一个"新应用",代价是安装量、评分和历史全部归零。
这正是 Play 应用签名存在的理由。自 2021 年 8 月起,Google Play 上的新应用就被要求使用它,如今它已是默认路径:由 Google 保管为分发 APK 签名的那个密钥,因此一台丢失的电脑、一个被盗的 keystore、一名离职的开发者,都不再能终结一个应用的生命周期。你手里保留的、也是大多数人俗称"那个 keystore"的东西,其实是上传密钥,而它是可以重置的。
三类密钥,三种完全不同的职责
Play 官方文档按"谁持有"和"用来签什么"把密钥分得很清楚。把这张映射关系搞对,既能避免认证故障(给 API 注册了错误的指纹),也能避免无谓的恐慌(以为 keystore 丢了就完蛋)。
- 上传密钥——由你持有。存放在 Java keystore(
.jks或.keystore)中,必须是2048 位及以上的 RSA 密钥。你用它给上传前的 AAB 签名,Google 用它验证这次上传确实来自你本人。它丢失或被泄露后,Google 可以为你重置。 - 应用签名密钥——由 Google Play 持有。关联一份公开证书(
.der或.pem)。Google 生成的密钥是 RSA 4096 位;如果你要自己提供密钥,要求为 RSA 2048 位及以上。用户设备上安装的那个 APK,就是用它签名的。你可以让 Google 生成,也可以自己提供。 - 抗量子混合密钥——由 Google Play 持有。由一把经典 RSA 4096 位密钥与一把后量子 ML-DSA-65 密钥组合而成。Android 17 及以上通过 APK 签名方案 v3.2 验证应用;更早的设备仍按经典签名块验证。由于 Google 会为 Android 17 之前的路径单独生成一把经典密钥,一个应用可能同时用到三把不同的密钥。
Google 在该设计上的原话:出于最大安全性考虑,上传密钥与应用签名密钥应当是两把不同的密钥。
Google 签名时还会往清单文件里写入 com.android.stamp.source 与 com.android.stamp.type 两个标记,让分发出去的 APK 可追溯到原始签名者。应用签名页面上的任何操作都需要账号具备 admin 权限——这也意味着掌握 admin 的人实际控制着这个应用的未来,而不只是它的某个设置项。
接入之后能拿到什么
Play 应用签名不只是密钥托管。让 Google 为你的应用包生成并签名优化后的 APK,才解锁了自动防护(automatic protection)与基于 Gemini 模型的自动字符串翻译;游戏类应用还能额外获得 Play Games Sidekick、边下边玩(Play-as-you-download)以及付费游戏免费试玩等服务。自行在 Play 应用签名之外管理密钥的应用,拿不到这些能力。
新应用如何接入
- 创建应用。新建的应用会自动以 Google 生成的密钥接入抗量子混合签名;Google 同时会生成一把独立的经典密钥,用于 Android 16 及以下可识别的签名块。
- 生成上传密钥。用 Android Studio 或命令行
keytool生成 keystore,用来给发布版应用包签名。这个文件和它的密码,请放在两年后你仍然找得到的地方。 - 上传应用包。创建发布版本并上传
.aab,自动接入即告完成。 - (可选)更换应用签名密钥。希望自己掌控密钥的进阶开发者,可以在任何版本发布到开放测试或正式版轨道之前更换:进入 Protected with Play > Play Store distribution > Go to Play app signing,点击 Change the app signing key。你可以选择复用同一开发者账号下另一个应用的签名密钥,或按说明提供自有应用签名密钥的副本。
存量应用如何迁移
如果你目前仍自己管理密钥、上传 APK,可以升级到 Play 应用签名,从而获得应用包格式与其余 Play 增强能力:
- 在 Play 控制台进入 Protected with Play > Play Store distribution > Go to Play app signing。
- 如尚未接受,先接受服务条款。
- 迁移原始签名密钥的副本。下载 PEPK 工具,按 Google 的统一分步说明,把现有应用签名密钥从任意代码仓库加密上传。这一步是保住已安装用户更新通道的关键。
- 生成新的上传密钥(推荐)。在 Android Studio 生成一把新密钥,并在控制台登记其证书,这样日常上传使用的密钥就不再是给用户签名的那把密钥。
把正确的指纹注册到 API 服务商
这一步是接入后最容易出事的地方。Google Maps、OAuth、Facebook 登录等服务,都是通过应用签名密钥的指纹来认证你的应用。由于最终 APK 现在由 Google 签名,到达用户手里的指纹是 Google 持有的那一把——所以你必须把 Google 持有的应用签名密钥指纹注册到各个服务商,而不只是本地上传密钥的指纹。
- 打开 Protected with Play > Play Store distribution > Go to Play app signing,滚动到 App signing key 区块。
- 复制服务商要求的 SHA-1 或 SHA-256 指纹,粘贴到对应服务商的控制台(例如 Maps 与 OAuth 对应的 Google Cloud Console)。
- 如果应用使用抗量子混合签名,需要复制并注册三把密钥的指纹:新设备上使用的经典密钥与后量子密钥,以及旧设备上使用的经典密钥。
- 如果使用 Android App Links,请把同样的指纹更新进
assetlinks.json。
上传密钥丢失或泄露时怎么办
上传密钥丢失并不会把你锁在自己的应用之外,官方恢复流程是标准化的:
- 在 Android Studio 中生成一把新的上传密钥。
- 把证书导出为 PEM 格式:
keytool -export -rfc -keystore upload-keystore.jks -alias upload -file upload_certificate.pem
- 在 Play 控制台进入 Protected with Play > Play Store protection > Manage Play app signing。
- 在 Upload key certificate 区块点击 Request upload key reset。
- 填写重置原因,上传
upload_certificate.pem文件,点击 Request。
在重置处理完成之前,你无法上传新的发布版本,所以要在截止日期之前就把恢复路径准备好,而不是在截止日期之后。请记住这种不对称性:上传密钥可以重置,应用签名密钥并不是你想换就能让 Google 立刻替换的东西。
应用签名密钥的升级
如果应用签名密钥被泄露,或你需要更强的密码学强度,Play 支持每年一次的密钥升级,作用于 Android 17(API 级别 37)及以上的安装。强制执行的强度按系统版本有所不同:
- Android 17(API 37)及以上:平台强制使用升级后的抗量子混合密钥,通过 APK 签名方案 v3.2 验证。
- Android 13(API 33)至 Android 16(API 36):平台强制使用你最新的经典密钥,依据 APK 签名方案 v3.1。
- Android 7(API 24)至 Android 12(API 32):平台本身不强制执行升级后的密钥,仍认可最新的经典密钥;Google Play 保护机制会额外校验应用更新是否由你最新的经典密钥签名(用户手动关闭的情况除外)。
有一个后果很容易被忽略:正因为在 Android 12 及以下平台不强制升级后的密钥,那些在多个应用之间共用同一把签名密钥以共享数据的应用,在这些旧版本上只会认可旧密钥,用于自定义权限共享之类的功能。
升级操作路径:进入 Protected with Play > Play Store distribution > Go to Play app signing,在 App signing key 区块点击 Upgrade key,选择升级路径——让 Google Play 生成新的应用签名密钥(推荐)、复用同一开发者账号下另一个应用的签名密钥、或提供自有密钥副本——然后点击 Save。随后把新指纹注册到 API 服务商;如果使用抗量子混合签名,那就是两把新密钥:新的经典密钥与新的后量子密钥。
在 Google Play 之外分发
如果你把同一个应用也分发到其他 Android 应用商店,希望全渠道使用同一套签名身份,有两种做法:
- 让 Google 生成应用签名密钥,然后从 Play 控制台下载已签名的通用 APK(Test & release > Latest releases and bundles,选中应用包,打开 Downloads 标签页),或通过 Play Developer API 获取,再分发到其他渠道。
- 自己生成应用签名密钥,并在配置 Play 应用签名时把副本交给 Google,这样各商店使用同一把密钥。
此外,Play 应用签名会对符合条件的应用自动启用 APK 签名方案 v4,以支持 Android 11 及以上设备的优化分发,无需你做任何操作。例外是使用抗量子混合签名的应用——该方案目前尚不兼容 v4 签名。
真正会付出代价的坑
- 把上传 keystore 当成一次性文件。Google 可以重置上传密钥,但重置处理完成之前你什么都传不上去。请把 keystore 文件与密码备份到构建机之外。
- 只注册了本地指纹。接入之后,分发出去的 APK 携带的是 Google 的应用签名密钥指纹;只认识你旧指纹的 Maps、OAuth 或登录服务商会直接失败。
- 忘记
assetlinks.json。Android App Links 的校验依赖同一批指纹。 - 发布之后才想换签名密钥。更换默认应用签名密钥只能在任何版本发布到开放测试或正式版轨道之前完成,发布之后不行。密钥决策要放在创建应用时,而不是第一次更新时。
- 忽略混合签名里的旧系统路径。使用抗量子签名的应用有三把密钥,服务商需要的是所有相关指纹,而不是只有最新的那一把。
- 以为各 Android 版本上的更新行为一致。升级后密钥的强制执行止于 Android 12,那一代设备上做校验的是 Play 保护机制,而不是平台本身。
- 把密钥自托管到自己的云项目。Google 支持通过自托管的 Google Cloud 项目接入,以满足极特殊的安全要求,但官方明确将其列为非标准方案、并不鼓励:签名操作的全部责任由你承担,灾难恢复能力丧失,部分高级优化、Play 增强能力以及抗量子混合签名等特性可能不可用。在这种配置下 Google 无法重新生成或修复已有发布版本,只能通过上传新的发布版本来解决。
- 访问控制太弱。应用签名页面上的所有操作都是 admin 级别。请为账号内所有用户强制开启两步验证。
一句话模型:上传密钥证明"你是谁",永远可以重置;应用签名密钥向每一台已安装设备证明"这个应用是谁",是绝不能丢失或泄露的资产。接入 Play 应用签名,把 Play 持有的指纹注册到应用所有需要认证的地方,并把构建流水线里的 keystore 当作生产基础设施来对待——有备份、有权限管控、只在深思熟虑后才更换。