如要使用 Play 应用签名功能,您必须是账号所有者或拥有发布为正式版,排除设备以及使用 Play 应用签名功能权限的用户,并且需要接受《Play 应用签名服务条款》。
运作方式
如果您使用 Play 应用签名功能,系统会将您的密钥存储在 Google 用来存储自有密钥的安全基础架构中。密钥受 Google 密钥管理服务保护。如果您想详细了解 Google 的基础架构,请参阅 Google Cloud 安全性白皮书。
Android 应用会使用私钥进行签名。为了确保应用更新是可信的,每个私钥都有关联的公钥证书,设备和服务可以使用该公钥证书来验证应用更新是否来自同一来源。只有当更新的签名与所安装应用的签名匹配时,设备才会接受更新。让 Google 来管理您的应用签名密钥,可使验证过程更有安全保障。
注意:对于 2021 年 8 月之前创建的应用,您仍然可以上传 APK 并管理自己的密钥,而不使用 Play 应用签名功能,也不使用 Android App Bundle 来发布应用。不过,在这种情况下,如果您的密钥库丢失或被侵,您将无法更新自己的应用,而必须改用新的软件包名称来发布新应用。对于这些应用,Play 建议使用 Play 应用签名并切换到 app bundle。
密钥、工件和工具的说明术语 | 说明 |
---|---|
应用签名密钥 |
Google Play 会使用这个密钥对提供给用户设备的 APK 进行签名。如果您使用 Play 应用签名功能,可以上传现有的应用签名密钥,也可以让 Google 为您生成一个应用签名密钥。 请勿将您的应用签名密钥告知他人,不过您可以与其他人分享应用的公钥证书。 |
上传密钥 |
在将 app bundle 上传到 Google Play 之前,您可以使用该密钥对其进行签名。请勿将您的上传密钥告知他人,不过您可以与其他人分享应用的公钥证书。出于安全考虑,建议您确保应用签名密钥和上传密钥为不同的密钥。 可以通过以下两种方式生成上传密钥:
|
证书(.der 或 .pem ) |
证书包含一个公钥以及关于密钥所有者的额外识别信息。借助公钥证书,所有人都可以验证 app bundle 或 APK 的签名者,而且您可以与任何人分享该证书,因为其中并不包含您的私钥。 若要向 API 提供商注册您的密钥,您可以从 Play 管理中心的 Play 应用签名页面( 测试和发布 > 设置 > 应用签名)下载您的应用签名密钥和上传密钥所对应的公钥证书。您可以与任何人分享公钥证书。公钥证书不包含您的私钥。 |
证书指纹 |
证书独一无二的简短表示形式,通常 API 提供商会要求同时提供证书指纹和软件包名称,以注册使用其服务的应用。 您可以在 Play 管理中心的 Play 应用签名页面(测试和发布 > 设置 > 应用签名)中找到上传证书和应用签名证书的 MD5、SHA-1 和 SHA-256 指纹。此外,还可以从同一页面下载原始证书 (.der ) 来计算其他指纹。 |
Java 密钥库(.jks 或.keystore ) |
安全证书和私钥的存储区。 |
Play 加密私钥 (PEPK) 工具 |
您可以使用这项工具从 Java 密钥库中导出私钥,然后对这些私钥进行加密,再转移至 Google Play。 将应用签名密钥提供给 Google 使用时,请选择导出并上传密钥的选项(如有需要,另请选择上传公钥证书的选项),并按照说明下载和使用此工具。如果您愿意,也可以下载、查看和使用 PEPK 工具的开放源代码。 |
具体流程如下:
设置和管理 Play 应用签名
如果您的应用尚未使用 Play 应用签名,请按照以下说明操作。
第 1 步:创建上传密钥
- 按照这些说明创建上传密钥。
- 使用上传密钥为 app bundle 签名。
第 2 步:准备应用版本
- 按照说明准备和发布版本。
- 选择发布轨道后,“应用完整性”部分会显示您应用的 Play 应用签名状态。
- 如需继续使用 Google 生成的应用签名密钥,请上传您的 app bundle。或者,您也可以选择更改应用签名密钥来访问以下选项:
- 使用 Google 生成的应用签名密钥:有超过 90% 的新应用使用 Google 生成的应用签名密钥。使用 Google 生成的密钥有助于防范密钥丢失或泄露(该密钥无法下载)。如果您选择此选项,则可以从 App bundle 资源管理器下载使用 Google 生成的密钥签名的分发 APK,以供在其他渠道分发;也可为这些渠道的版本使用其他密钥。
- 使用其他应用签名密钥:选择应用签名密钥后,您就可以使用与您的开发者账号中的其他应用相同的密钥,也可以保留应用签名密钥的本地副本,以提高灵活性。例如,您可能已确定使用某个密钥,因为某些设备上已预安装了您的应用。如果将密钥副本保存在 Google 服务器之外,当本地副本发生泄露时,会增加风险。关于如何使用其他密钥,有以下选项:
- 使用与这个开发者账号中的其他应用相同的应用签名密钥
- 从 Java 密钥库导出并上传密钥
- 导出并上传密钥(不使用 Java 密钥库)
- 选择退出 Play 应用签名计划(只有在您计划升级应用签名密钥以加入 Play 应用签名计划时,才应选择此选项)。
- 按照剩下的说明准备和发布版本。
注意:您需要接受《服务条款》并选择加入应用签名计划,才能继续操作。
第 3 步:向 API 提供商注册应用签名密钥
如果您的应用使用任何 API,您通常需要向 API 提供商注册应用签名密钥,以便使用证书的指纹进行身份验证。查找证书的方法如下:
- 打开 Play 管理中心,然后前往 Play 应用签名页面(
测试和发布
> 设置 > 应用签名)。 - 滚动到“应用签名密钥证书”部分,然后复制应用签名证书的指纹(MD5、SHA-1 和 SHA-256)。
- 如果 API 提供商需要其他类型的指纹,您也可以下载
.der
格式的原始证书,并通过 API 提供商要求的转换工具转换该证书。
- 如果 API 提供商需要其他类型的指纹,您也可以下载
当您使用 Google 生成的密钥时,Google 会自动生成一个安全系数高的 4096 位 RSA 密钥。如果您选择上传自己的应用签名密钥,该密钥必须为不小于 2048 位的 RSA 密钥。
第 1 步:配置 Play 应用签名
- 打开 Play 管理中心,然后前往 Play 应用签名页面(
测试和发布
> 设置 > 应用签名)。 - 如果您尚未接受《Play 应用签名服务条款》,请查看条款内容并选择接受。
第 2 步:将原始密钥的副本发送给 Google 并创建上传密钥
- 找到您的原始应用签名密钥。
- 打开 Play 管理中心,然后前往 Play 应用签名页面(
测试和发布
> 设置 > 应用签名)。 - 选择最适合您的发布流程的导出和上传选项,并上传现有的应用签名密钥。
第 3 步:创建上传密钥(可选,建议创建)
- 创建上传密钥并将证书上传到 Google Play。
- 您也可以继续将应用签名密钥用作上传密钥。
- 复制应用签名证书的指纹(MD5、SHA-1 和 SHA-256)。
- 出于测试目的,您可能需要使用证书指纹和应用签名密钥向 API 提供商注册上传密钥的证书。
第 4 步:使用上传密钥为您的下一次应用更新签名
发布应用更新时,您需要使用上传密钥为更新签名。
- 如果您之前没有生成新的上传密钥:请继续使用原始应用签名密钥为 app bundle 签名,然后再将其上传到 Google Play。如果您丢失了原始应用签名密钥,则可以生成新的上传密钥,并向 Google 注册该密钥,以便继续更新您的应用。
- 如果您之前生成了新的上传密钥:请使用这个新的上传密钥为 app bundle 签名,然后再将其上传到 Google Play。Google 会使用该上传密钥验证您的身份。如果您丢失了上传密钥,可以与支持团队联系以重置上传密钥。
如果您无法共享现有密钥,则可能需要执行此操作。在选择升级应用签名密钥来加入计划之前,请注意:
- 此选项需要同时提供两种格式的版本。
- 您将需要在每个版本中上传 app bundle 和使用旧密钥签名的 APK。针对搭载 Android R*(API 级别 30)或更高版本的设备,Google Play 会利用您的 app bundle 生成使用新密钥签名的 APK。您的旧版 APK 将用于较低的 Android 版本(不高于 API 级别 29)。
*如果您的应用使用 sharedUserId
,建议您在搭载 Android T(API 级别 33)或更高版本的设备上针对应用安装和更新采用密钥升级。如需进行此项配置,请在 app bundle 配置中设置准确的最低 SDK 版本。
第 1 步:上传新密钥,生成并上传 proof-of-rotation
为了确保新密钥在 Android 设备上受信任,您必须从代码库中上传新的签名密钥,生成并上传 proof-of-rotation:
- 打开 Play 管理中心,然后前往 Play 应用签名页面(
测试和发布
> 设置 > 应用签名)。 - 选择应用签名标签页。
- 点击显示高级选项,然后选择使用新的应用签名密钥(每次发布都需要提供两种格式)。
- 选择使用与开发者账号中的另一个应用相同的应用签名密钥,或从 Android Studio、Java 密钥库或其他代码库上传新的应用签名密钥。
- 按照屏幕上的说明下载并运行 PEPK 工具。
- 在您的 ZIP 文件准备就绪后,点击上传生成的 ZIP 文件,并将其上传到 Play 管理中心。
- 在“5. 上传 proof-of-rotation,让新密钥在 Android 设备上受信任”旁边,点击显示说明。
- 下载 APKSigner,然后通过运行以下命令生成 proof-of-rotation:
$ apksigner rotate --out /path/to/new/file --old-signer --ks old-signer-jks --set-rollback true --new-signer --ks new-signer-jks --set-rollback true
- 点击上传所生成的 proof-of-rotation 文件,然后上传第 8 步中生成的 proof-of-rotation 文件。
- 点击保存。
创建上传密钥并更新密钥库
为了提高安全性,建议您使用新的上传密钥(而不是应用签名密钥)为应用签名。
您可以在选择加入 Play 应用签名计划时创建上传密钥,也可以之后通过访问 Play 应用签名页面(
测试和发布
> 设置 > 应用签名)来创建上传密钥。若要创建上传密钥,请按以下步骤操作:
- 按照 Android 开发者网站上的说明进行操作。将密钥存放在安全的地方。
- 将上传密钥的证书以 PEM 格式导出。替换下方带下划线的参数:
$ keytool -export -rfc -keystore upload-keystore.jks -alias upload -file upload_certificate.pem
-
发布过程中如果出现提示,请上传证书以向 Google 注册该证书。
当您使用上传密钥时:
- 上传密钥只会在 Google 中注册,我们会用它来验证应用创建者的身份。
- 在将您上传的任何 APK 发布给用户之前,我们都会从中移除您的签名。
- 上传密钥必须为不小于 2048 位的 RSA 密钥。
创建上传密钥后,您可能需要查看和更新以下位置:
- 本地计算机
- 上锁保护的现场服务器(变化的 ACL)
- 云计算机(变化的 ACL)
- 专属机密管理服务
- (Git) 代码库
升级应用签名密钥
在某些情况下,您可以请求升级应用签名密钥。
以下是请求升级应用签名密钥的几种原因:
- 您需要加密强度更高的密钥。
- 您的应用签名密钥被盗。
重要提示:只有使用 app bundle 的应用支持密钥升级。
在 Play 管理中心内请求升级密钥之前,请阅读下文的请求升级密钥前的重要注意事项部分。然后,您可以展开下列其他部分,详细了解如何请求升级密钥。
请求升级密钥前的重要注意事项在请求升级密钥之前,请务必先了解升级完成后您可能需要做出的更改。
- 如果您为多个应用使用相同的应用签名密钥,以便在它们之间共享数据/代码,则您需要更新这些应用以使它们能够同时识别新旧两版应用签名密钥证书。在搭载 Android S(API 级别 32)或更低版本的设备上,为了共享数据/代码,Android 平台只会识别旧版应用签名密钥证书。
- 如果您的应用使用 API,那么在发布更新之前,请务必向 API 提供商注册新旧两版应用签名密钥的证书,以确保 API 能继续正常运行。您可以在 Play 管理中心的 Play 应用签名页面(
测试和发布
> 设置 > 应用签名)上找到相应证书。 - 如果您有任何用户通过点对点共享安装更新,那么只有当要安装的更新的签名密钥与其已安装的应用版本所用的密钥相同时,他们才能安装。如果用户的应用版本因使用不同的签名密钥而无法更新,则可以选择卸载并重新安装应用以获取更新。
对于 Android N(API 级别 24)及更高版本上的所有安装,每个应用的应用签名密钥每年只能升级一次。
如果您成功请求升级此密钥,您的新密钥将用于为所有安装和应用更新签名。在搭载 Android T(API 级别 33)及更高版本的设备上,Android 平台将强制要求使用升级后的密钥。在搭载 Android S(API 级别 32)或更低版本的设备上,Android 平台不会强制要求使用此升级后的密钥,而仍能识别用于为应用签名的旧版签名密钥。包括所有依赖于应用签名密钥的 Android 平台功能(例如自定义权限共享)也是如此。在搭载 Android N(API 级别 24)到 Android S(API 级别 32)的设备上,除非用户关闭了 Google Play 保护机制,否则该机制会检查应用更新是否已使用您升级后的密钥签名。鉴于 Android 平台不会在搭载 Android S(API 级别 32)或更低版本的设备上强制要求使用升级后的密钥,上述检查可实现额外的验证。
- 打开 Play 管理中心,然后前往 Play 应用签名页面(
测试和发布
> 设置 > 应用签名)。 - 在“升级应用签名密钥”卡片中,选择请求升级密钥。
- 选择相应选项,针对 Android N 及更高版本上的所有安装升级应用签名密钥。
- 让 Google 生成新的应用签名密钥(推荐)或上传密钥。
- 应用签名密钥升级后,如果您的应用签名密钥和上传密钥相同,则可继续用旧版应用签名密钥作为上传密钥,也可以生成新的上传密钥。
- 选择请求升级应用签名密钥的原因。
- 如有必要,请向 API 提供商注册新的应用签名密钥。
提示:如果您通过多个分发渠道分发您的应用,而且您希望为用户最大限度提高应用更新的兼容性,请在您使用的所有分发渠道中升级密钥。为了与 Google Play 的密钥升级兼容,请使用与 Android SDK 构建工具(修订版 33.0.1 及更高版本)捆绑提供的 ApkSigner 工具:
$ apksigner sign --in ${INPUT_APK}
--out ${OUTPUT_APK}
--ks ${ORIGINAL_KEYSTORE}
--ks-key-alias ${ORIGINAL_KEY_ALIAS}
--next-signer --ks ${UPGRADED_KEYSTORE}
--ks-key-alias ${UPGRADED_KEY_ALIAS}
--lineage ${LINEAGE}
详细了解应用更新的运作方式。
最佳实践
- 如果您还在 Google Play 之外分发应用或未来打算这样做,并想使用同一个签名密钥,则有以下两种选择:
- 让 Google 生成该密钥(推荐),然后从 App bundle 资源管理器下载已签名的通用 APK,以便在 Google Play 之外分发。
- 或者,您也可以先生成要针对所有应用商店使用的应用签名密钥,然后在配置 Play 应用签名时将该密钥的副本传输到 Google。
- 为了保护您的账号,请为可访问 Play 管理中心的账号开启两步验证。
- 在将 app bundle 发布到发布轨道后,您可以访问 App bundle 资源管理器,以获取 Google 通过您的 app bundle 生成的可安装 APK。您可以:
- 复制并分享内部应用分享链接。通过该链接,您只需点按一下,即可测试 Google Play 会通过您的 app bundle 在不同设备上安装什么。
- 下载已签名的通用 APK。这个 APK 使用 Google 持有的应用签名密钥进行了签名,可安装在您的应用支持的任何设备上。
- 下载一个包含适用于特定设备的所有 APK 的 ZIP 归档文件。这些 APK 均使用 Google 持有的应用签名密钥进行了签名。您可以使用
adb install-multiple *.apk
命令在设备上安装该 ZIP 归档文件中的 APK。
- 为了提高安全性,请生成与您的应用签名密钥不同的新上传密钥。
- 如果您使用了任何 Google API,建议您在 Google Cloud 控制台为您的应用注册上传密钥证书和应用签名密钥证书。
- 如果您使用的是 Android App Links,请务必更新网站上相应 Digital Asset Links JSON 文件中的密钥。
上传密钥丢失或被盗
如果您丢失了自己的私有上传密钥或者密钥被盗,则可以创建一个新密钥。然后,您的开发者账号所有者就可以在 Play 管理中心内发起密钥重置流程。
在我们的支持团队注册新的上传密钥后,账号所有者和全局管理员都将在收件箱内收到一条消息和一封包含更多信息的电子邮件。然后,您就可以更新密钥库,并向 API 提供商注册密钥。
账号所有者还可以在 Play 管理中心内取消重置请求。
重要提示:重置上传密钥并不会影响 Google Play 在您向用户提供 APK 之前用于对 APK 重新签名的应用签名密钥。
APK 签名方案 v4
搭载 Android 11 及更高版本的设备支持新的 APK 签名方案 v4。Play 应用签名功能会为符合条件的应用使用 v4 签名,以使这些应用能够使用针对较新机型设备提供的经过优化的分发功能。v4 签名无需开发者采取任何行动,也不会影响用户。