67

我正在尝试了解如何在使用 Google Play 应用签名时将应用上传到 Google Play。

这是我所做的:

  1. 创建了一个应用
  2. 使用 keytool.exe 为该应用程序生成密钥
  3. 将应用上传到 Google Play
  4. 已注册 Google Play 应用签名
  5. 尝试再次上传应用程序但没有成功。

它抱怨证书不是证书

将新 APK 上传到生产环境

上传失败 您上传的 APK 未使用上传证书签名。您必须使用相同的证书。上传证书有指纹:[SHA1:0C:...],用于签署您上传的APK的证书有指纹:[SHA1:2D:...]

搜索了一段时间后。我了解如何将我的 Google Play 控制台上的认证发布到我的密钥库中。像这样的东西:

keytool.exe -importcert -file upload.pem -keystore myapp-release-key.keystore

证书似乎在其中。当我列出密钥库的内容时,这是我得到的:

keytool.exe -list -keystore trackcoachfull-release-key.keystore 输入密钥库密码:

密钥库类型:JKS 密钥库提供者:SUN

您的密钥库包含 2 个条目

myappfull,2017 年 5 月 18 日,PrivateKeyEntry,证书指纹 (SHA1):2D:... uploadkey,2017 年 5 月 19 日,trustedCertEntry,证书指纹 (SHA1):0C:...

现在,我被封锁的地方......

在 Android Studio 中,我尝试使用上传密钥生成签名的 APK。

Build > Generate Signed APK 选择上面的密钥库 输入密钥库密码 选择上传密钥作为密钥别名 我强制输入密钥密码。

Android Studio 中的错误:

错误:任务“:app:packageFullRelease”的执行失败。

com.android.ide.common.signing.KeytoolException:无法从存储“C:\Users\Admin\AndroidStudioProjects\keystores\myappfull-release-key.keystore”读取密钥上传密钥:受信任的证书条目不受密码保护

我的问题是这样的:

如何生成使用 Google Play 提供的上传密钥签名的 APK?

谢谢

4

5 回答 5

76

我能够使用 Google Play 提供的上传密钥签署我的 APK。以下是我为新应用程序遵循的步骤:

  1. 使用 Android Studio 创建密钥库并添加签名密钥
  2. 使用在 (1) 中创建的密钥对应用程序进行签名
  3. 将 APK 上传到 Google Play
  4. 从 Google Play 管理中心下载“上传证书”
  5. 使用命令将下载的证书添加到步骤 (1) 中创建的密钥库 keytool.exe -importcert -file upload_cert.der -keystore <keystorefile>
  6. 它应该提示“证书已存在于别名下的密钥库中。您还想添加它吗?[否]:”
  7. 输入“y”并按回车
  8. 将出现一条确认消息
  9. 对于后续构建,使用与 (2) 中相同的过程对应用程序进行签名

这里需要注意的重要一点是,在步骤 (6) 中,keytool 导入会使用从 Google Play 下载的证书更新原始证书。

于 2017-08-18T06:08:28.463 回答
53

简短的回答:

您无法使用 Google Play 控制台中的上传证书对 APK 进行签名。

希望这个答案能防止其他人像我试图找到一个不存在的解决方案一样浪费时间。


长答案:

Google Play 支持文章管理您的应用签名密钥提供了理解这一点所需的信息。

从“键的类型和重要定义”部分:

  • 上传密钥(现有应用程序可选):您在注册程序期间生成的新密钥。您将使用上传密钥签署所有未来的 APK,然后再将它们上传到 Play 管理中心。
  • Private Key:对于 APK 签名,这是用于签署 APK 的密钥。私钥必须保密。
  • 公钥:对于 APK 签名,这是用于验证 APK 签名的密钥。公钥对每个人都是可见的。
  • 证书:证书包含一个公钥以及一些关于谁拥有该密钥的额外标识信息。

然后,请注意,在 Google Play Console 中,您只能下载上传证书(而不是上传密钥)。基于以上定义,我们可以得出以下结论:

  1. 上传密钥是私钥,因为上传密钥用于签署 APK。
  2. 上传证书不包含 private key,因为证书通常包含公钥,而不是私钥(有一些例外,但在这种情况下没有)。
  3. 因此,无论您采取什么步骤,上传证书都不能用于签署 APK 。它只是不包含必要的信息。

作为进一步的证据,这个其他 SO 问题(Android 签名错误:受信任的证书条目不受密码保护)解决了同样的问题,但是由于它不引用上传密钥/证书,因此很容易忽略这个问题的含义 - - 您可以从 Google Play 下载的任何内容都无法解决此问题。


相反的主张

尽管有些人报告说可以使用从 Google Play 下载的上传证书来签署您的 APK,但我相信他们误解了所发生的事情。请注意,通常这些报告表明您必须将证书导入用于生成密钥的原始密钥库。事实上,当他们认为他们正在导入签署 APK 所需的(私有)密钥时,他们实际上只是在导入公钥并覆盖密钥对的公共部分——使用证书中导出的相同公钥首先。

如果他们尝试使用该别名对 APK 进行签名而不执行导入过程,那么它也可以正常工作。(导入对他们没有任何改变。)这就是为什么导入似乎只在与原始密钥库一起使用时才有效,而不是与新密钥库一起使用。


那么你能做什么呢?

这取决于你的情况。由于目标是签署 APK 并成功将其上传到 Google:

  1. 在设置“Google Play 应用签名”期间的某个时候,有人生成了上传密钥并将其注册到 Google。如果您在某个地方的密钥库中仍然拥有该(私有)密钥,那么这正是您签署 APK 所需的。
  2. 如果您使用其他工具生成上传密钥,keytool然后将其导入您的密钥库,并且您仍然拥有原始生成的文件,您可以使用第一次使用的任何过程再次将私钥导入不同的密钥库。
  3. 如果以上都不是选项,您可以按照管理您的应用签名密钥文章的“创建新的上传密钥”部分中的说明生成新的上传密钥并让 Google 将其换掉。
于 2018-10-22T07:01:39.357 回答
4

我认为您一定是从“java\bin”文件夹中生成了这样的密钥库:

keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000

当您想更新您的应用程序时,您必须使用您生成的相同密钥库。

  1. 转到构建 > 生成签名的 APK。

  2. 选择“选择现有”并浏览到您的密钥库路径

  3. 输入“密钥库密码”

  4. 在密钥别名中点击“...”并检查您的密钥别名是否与您在生成密钥库时提供的相同

  5. 如果是,请再次提供“密钥密码”

  6. 点击“下一步”

让我知道您在哪一步遇到问题,以便我可以相应地指导您。

于 2017-05-20T05:33:51.657 回答
2

我不得不联系谷歌并按照以下说明生成新密钥并上传证书。

新的上传密钥将用于对您上传到 Play 的 APK 进行签名。

以下是生成和注册新上传密钥的方法:

  1. 按照 Android Studio 帮助中心中的说明生成新密钥。它必须不同于任何以前的密钥。或者,您可以使用以下命令行生成新密钥:keytool -genkeypair -alias upload -keyalg RSA -keysize 2048 -validity 9125 -keystore keystore.jks

此密钥必须是 2048 位 RSA 密钥,并且有效期为 25 年。

2.将该密钥的证书导出为PEM格式:keytool -export -rfc -alias upload -file upload_certificate.pem -keystore keystore.jks

3.回复此邮件并附上upload_certificate.pem文件。

于 2019-07-14T08:22:42.413 回答
2

有时会发生:一个密钥库有两个证书,它们通过别名或密码来区分。尝试查看密钥库的两个条目的属性。我确信任何一个都是具有正确别名的有效密钥。使用这个命令:

Keytool -list -keystore WeatherForecast.jks(您的密钥库)

提示输入密码时按回车。

您将看到两个条目,第一个单词将是您的密钥库的别名。

它对我有用,我认为它肯定对你有用。

于 2018-10-07T08:22:43.310 回答