如何使用上传证书发布应用更新?
How to use upload certificate to release an app update?
上周我创建了一个应用程序,并通过在 Android Studio 中创建密钥库将其第一个版本上传到 Play 商店。我想注册 App Signing,但 Play Console 说我首先需要上传应用程序才能注册,所以我上传了应用程序包 (app.aab),然后注册了该计划,现在我可以看到 2 个证书- 上传证书和应用程序签名证书。可以选择以 .der 格式下载它们。
我该如何处理这些 .der 文件?要发布更新,我再次转到“生成签名构建”,它要求我提供我选择的密钥库并输入密码,然后它生成了更新后的签名应用程序包。
在整个过程中,我从未遇到过使用 .der 证书的选项,如果不需要它们,为什么它们会显示在 Play 控制台的发布管理下的应用签名中。由于 Android Studio 仍在根据我硬盘上可用的密钥库生成签名版本,我注册的应用程序签名有什么意义?
App Signing and Managing Keys 上的官方文档甚至没有提到这些上传证书。它只提到使用上传密钥签署您的应用程序,什么是上传密钥 - Play Console 没有提到它,Android Studio 也没有,Android studio 需要密钥库来生成签名的构建,它在.jks 格式
更新: Google 更新了它的 documentation around App Signing by Play,使其更容易理解,所以这个答案可能是多余的。留着 post 诚实。
tldr;大多数开发人员不需要这些 .der 文件,它们用于高级用例。
这么多问题!好的,系好安全带...
只是为了澄清基础知识以确保我们使用相同的语言:当您在 keystore 中创建密钥时,您实际上是在创建 key一对(一个私钥和一个public密钥)以及一个证书。证书包含我们所说的专有名称(包括您的姓名、公司名称等)和 public 密钥。因此,证书是所有 public 信息,并且在您签名时实际上已添加到您的 APK 中以供任何人查看。私钥保留在您的密钥库中,并且是秘密,这使得其他任何人都无法以可以用您的证书验证的方式对您的 APK 进行签名。因为术语太多,而且人们通常不太熟悉底层密码学概念,所以您经常会看到人们只是互换使用术语 "keystore"、"key" 和 "certificate"。
当您注册 App Signing 时,您将私钥发送给 Google,以便 Google 可以代表您对 APK 进行签名。目的有三个:
- 好处 #1 - 应用优化:当您上传 Android App Bundle 时,Google 将能够签署它代表您生成的 APK。主要好处是为您的应用程序节省大小,但不在本范围内 post。
- 好处 #2 - 密钥丢失事件:无论您上传的是 APK 还是 Android App Bundle,如果您丢失了密钥,Google仍然有一个副本,因此您仍然可以通过上传使用 新密钥 签名的 APK 来更新您的应用(此操作称为 上传密钥重置),并且 Google 仍然可以使用您的原始应用签名密钥对您的 APK 进行签名。如果没有这个,如果您丢失了密钥,您将无法再对您的应用程序进行任何更新。
- 好处 #3 - 密钥泄露事件:如果您使用与应用签名密钥不同的密钥(即上传密钥)对上传到 Play 管理中心的 APK 进行签名,那么你的应用程序签名密钥被泄露的风险就会降低(你可以将它放在具有受限 ACL 的驱动器上,因为你不会再使用它,而不是与你公司的许多开发人员共享它)。如果您的 上传密钥 被泄露,Google 可以更改它。如果您的 app signing key 被泄露(例如泄露),那么您或 Google 将无能为力,其他人可以签署 APK 假装是您的应用并分发它们在某些应用程序商店或网站中。
您可以看到现在有两种密钥(和相关证书):
- 应用签名密钥:这是用于签署交付给用户的 APK 的密钥。
- 上传密钥:这是 Google Play 用来识别您上传到 Play 管理中心的 APK 的来源和完整性的密钥。
哦,是的,我还应该提一下:有两种方法可以注册 App Signing。
- 您是新应用,在您第一次上传应用时,系统会提示您是否要加入应用签名。如果您在此阶段注册,Google 会为您生成 App Signing 密钥 并将您用来签署上传工件的密钥视为上传密钥。
- 您是一个现有应用程序(即您已经上传了一个 APK 但尚未注册),在这种情况下,您必须使用名为PEPK 并在此时创建一个新的上传密钥。
对于现有应用程序,创建上传密钥是可选的 在注册应用程序签名时。这适用于只对利用 好处 #1 感兴趣的人。 Google 强烈建议创建一个上传密钥并开始上传用它签名的 APKs/Bundles 以避免好处 #2 和 #3 中描述的灾难性场景(密钥 lost/compromised).
正如您正确注意到的那样,即使您创建了上传密钥,您仍然可以上传使用您的应用签名密钥签名的 APK。尽管这似乎适得其反,但 Google 这样做的主要原因是为开发人员提供一种切换到 Android App Bundle 的方法(需要 App Signing)并在测试轨道中测试它,同时仍然能够将 APK 推送到使用他们的应用签名密钥签名的生产轨道。这让开发人员有时间测试和弄清楚如何在他们的构建过程中使这项工作在不阻塞他们当前的生产发布过程的情况下进行。
请注意,因为您可以仍然上传使用应用签名密钥签名的 APK,并不意味着您应该 。如果您想利用好处 #3,您需要开始上传使用上传密钥签名的 APK。
--
现在,回到这些 .der 文件......好吧,很快!
当您的 Android 应用程序与第三方 APIs(例如 Google APIs、Facebook API 等)通信时,您通常必须注册您的应用程序。这种注册通常需要两条信息:包名和证书指纹(例如SHA1)。此注册保证只有您的程序包名称 和 使用您的应用程序签名密钥签名的应用程序才能使用您的 API.
的配额
所有开发人员都知道他们的包名,但许多开发人员经常问 如何获取证书的指纹。 Whosebug 是一个很好的地方,可以找到 运行 从密钥库中提取它的正确命令,但 Play 控制台也会显示它以方便 (对于提出要求的开发人员也很重要Google 为他们生成应用签名密钥,因为他们没有带有应用签名密钥的密钥库)。这就是您看到应用签名证书的 MD5、SHA1 和 SHA256 的原因。
我看到你现在在问 "OK, it makes sense to show the fingerprints of the app signing certificate, but why show the fingerprints of the upload certificate as well?" 这是一个很好的问题,谢谢你的提问。如果您在将 APK 上传到 Play 管理中心之前使用上传密钥对其进行签名,您可能需要先测试这些工件,因此,如果您与任何第三方 API 有任何集成,则需要注册还有这个证书!
好的,现在,我们终于可以访问 .der 文件了。
.der文件就是证书。 Play Console不仅可以让您看到证书的指纹,还可以让您完整下载。开发人员可能需要它们的唯一原因是第三方 API 需要使用不同类型的指纹注册您的应用程序。例如,Facebook API 需要使用证书的 SHA1 二进制表示的 Base64 进行注册。您无法根据 Play 管理中心显示的指纹进行计算,因此您必须 运行 在原始证书上手动执行一些命令。
[资料来源:我在 Google 工作并实现了大部分]
上周我创建了一个应用程序,并通过在 Android Studio 中创建密钥库将其第一个版本上传到 Play 商店。我想注册 App Signing,但 Play Console 说我首先需要上传应用程序才能注册,所以我上传了应用程序包 (app.aab),然后注册了该计划,现在我可以看到 2 个证书- 上传证书和应用程序签名证书。可以选择以 .der 格式下载它们。
我该如何处理这些 .der 文件?要发布更新,我再次转到“生成签名构建”,它要求我提供我选择的密钥库并输入密码,然后它生成了更新后的签名应用程序包。
在整个过程中,我从未遇到过使用 .der 证书的选项,如果不需要它们,为什么它们会显示在 Play 控制台的发布管理下的应用签名中。由于 Android Studio 仍在根据我硬盘上可用的密钥库生成签名版本,我注册的应用程序签名有什么意义?
App Signing and Managing Keys 上的官方文档甚至没有提到这些上传证书。它只提到使用上传密钥签署您的应用程序,什么是上传密钥 - Play Console 没有提到它,Android Studio 也没有,Android studio 需要密钥库来生成签名的构建,它在.jks 格式
更新: Google 更新了它的 documentation around App Signing by Play,使其更容易理解,所以这个答案可能是多余的。留着 post 诚实。
tldr;大多数开发人员不需要这些 .der 文件,它们用于高级用例。
这么多问题!好的,系好安全带...
只是为了澄清基础知识以确保我们使用相同的语言:当您在 keystore 中创建密钥时,您实际上是在创建 key一对(一个私钥和一个public密钥)以及一个证书。证书包含我们所说的专有名称(包括您的姓名、公司名称等)和 public 密钥。因此,证书是所有 public 信息,并且在您签名时实际上已添加到您的 APK 中以供任何人查看。私钥保留在您的密钥库中,并且是秘密,这使得其他任何人都无法以可以用您的证书验证的方式对您的 APK 进行签名。因为术语太多,而且人们通常不太熟悉底层密码学概念,所以您经常会看到人们只是互换使用术语 "keystore"、"key" 和 "certificate"。
当您注册 App Signing 时,您将私钥发送给 Google,以便 Google 可以代表您对 APK 进行签名。目的有三个:
- 好处 #1 - 应用优化:当您上传 Android App Bundle 时,Google 将能够签署它代表您生成的 APK。主要好处是为您的应用程序节省大小,但不在本范围内 post。
- 好处 #2 - 密钥丢失事件:无论您上传的是 APK 还是 Android App Bundle,如果您丢失了密钥,Google仍然有一个副本,因此您仍然可以通过上传使用 新密钥 签名的 APK 来更新您的应用(此操作称为 上传密钥重置),并且 Google 仍然可以使用您的原始应用签名密钥对您的 APK 进行签名。如果没有这个,如果您丢失了密钥,您将无法再对您的应用程序进行任何更新。
- 好处 #3 - 密钥泄露事件:如果您使用与应用签名密钥不同的密钥(即上传密钥)对上传到 Play 管理中心的 APK 进行签名,那么你的应用程序签名密钥被泄露的风险就会降低(你可以将它放在具有受限 ACL 的驱动器上,因为你不会再使用它,而不是与你公司的许多开发人员共享它)。如果您的 上传密钥 被泄露,Google 可以更改它。如果您的 app signing key 被泄露(例如泄露),那么您或 Google 将无能为力,其他人可以签署 APK 假装是您的应用并分发它们在某些应用程序商店或网站中。
您可以看到现在有两种密钥(和相关证书):
- 应用签名密钥:这是用于签署交付给用户的 APK 的密钥。
- 上传密钥:这是 Google Play 用来识别您上传到 Play 管理中心的 APK 的来源和完整性的密钥。
哦,是的,我还应该提一下:有两种方法可以注册 App Signing。
- 您是新应用,在您第一次上传应用时,系统会提示您是否要加入应用签名。如果您在此阶段注册,Google 会为您生成 App Signing 密钥 并将您用来签署上传工件的密钥视为上传密钥。
- 您是一个现有应用程序(即您已经上传了一个 APK 但尚未注册),在这种情况下,您必须使用名为PEPK 并在此时创建一个新的上传密钥。
对于现有应用程序,创建上传密钥是可选的 在注册应用程序签名时。这适用于只对利用 好处 #1 感兴趣的人。 Google 强烈建议创建一个上传密钥并开始上传用它签名的 APKs/Bundles 以避免好处 #2 和 #3 中描述的灾难性场景(密钥 lost/compromised).
正如您正确注意到的那样,即使您创建了上传密钥,您仍然可以上传使用您的应用签名密钥签名的 APK。尽管这似乎适得其反,但 Google 这样做的主要原因是为开发人员提供一种切换到 Android App Bundle 的方法(需要 App Signing)并在测试轨道中测试它,同时仍然能够将 APK 推送到使用他们的应用签名密钥签名的生产轨道。这让开发人员有时间测试和弄清楚如何在他们的构建过程中使这项工作在不阻塞他们当前的生产发布过程的情况下进行。
请注意,因为您可以仍然上传使用应用签名密钥签名的 APK,并不意味着您应该 。如果您想利用好处 #3,您需要开始上传使用上传密钥签名的 APK。
--
现在,回到这些 .der 文件......好吧,很快!
当您的 Android 应用程序与第三方 APIs(例如 Google APIs、Facebook API 等)通信时,您通常必须注册您的应用程序。这种注册通常需要两条信息:包名和证书指纹(例如SHA1)。此注册保证只有您的程序包名称 和 使用您的应用程序签名密钥签名的应用程序才能使用您的 API.
的配额所有开发人员都知道他们的包名,但许多开发人员经常问 如何获取证书的指纹。 Whosebug 是一个很好的地方,可以找到 运行 从密钥库中提取它的正确命令,但 Play 控制台也会显示它以方便 (对于提出要求的开发人员也很重要Google 为他们生成应用签名密钥,因为他们没有带有应用签名密钥的密钥库)。这就是您看到应用签名证书的 MD5、SHA1 和 SHA256 的原因。
我看到你现在在问 "OK, it makes sense to show the fingerprints of the app signing certificate, but why show the fingerprints of the upload certificate as well?" 这是一个很好的问题,谢谢你的提问。如果您在将 APK 上传到 Play 管理中心之前使用上传密钥对其进行签名,您可能需要先测试这些工件,因此,如果您与任何第三方 API 有任何集成,则需要注册还有这个证书!
好的,现在,我们终于可以访问 .der 文件了。
.der文件就是证书。 Play Console不仅可以让您看到证书的指纹,还可以让您完整下载。开发人员可能需要它们的唯一原因是第三方 API 需要使用不同类型的指纹注册您的应用程序。例如,Facebook API 需要使用证书的 SHA1 二进制表示的 Base64 进行注册。您无法根据 Play 管理中心显示的指纹进行计算,因此您必须 运行 在原始证书上手动执行一些命令。
[资料来源:我在 Google 工作并实现了大部分]