ChatGPT解决这个技术问题 Extra ChatGPT

使用 Google Play 提供的上传密钥签署 APK

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

这是我所做的:

创建了一个应用 使用 keytool.exe 为该应用生成密钥 将应用上传到 Google Play 已注册 Google Play 应用签名 尝试再次上传应用,但未成功。

它抱怨证书不是证书

将新 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 选择上面的密钥库 输入密钥库密码 选择uploadkey作为密钥别名 我强制输入密钥密码。

Android Studio 中的错误:

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

我的问题是这样的:

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

谢谢

我得到完全相同的错误信息。唯一的区别是我尝试使用deployment.pem 来上传Beta APK。这里有什么进展吗?
不知何故,这个问题帮助我解决了我的问题。我正在寻找如何使用 Play Store Console 中的上传密钥对 apk 进行签名,并通过将证书导入我的密钥库来从您的问题中找到解决方案。当我尝试导入它们时,证书似乎已经存在于我的第一个别名中。所以我只是尝试使用相同的密钥库但使用我的第一个别名来构建 apk 并且它可以工作。所以也许你应该在构建你的 apk 时只使用你的第一个别名 myappfull
我也面临同样的问题,一年前我已经使用 .key 商店在 Play 商店中发布了我的应用程序,当我即将发布用于 alpha 测试的应用程序时,谷歌使用我上传证书并按照步骤使用 .jks 文件签署了应用程序.我正在使用地图 API,现在它没有显示 .what 解决方法。
你能生成一个从 android studio 签名的 APK 吗?

A
Ayaz Aslam

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

创建密钥库并使用 Android Studio 添加签名密钥 使用 (1) 中创建的密钥对应用程序进行签名 将 APK 上传到 Google Play 从 Google Play 控制台下载“上传证书” 将下载的证书添加到步骤 (1) 中创建的密钥库中command keytool.exe -importcert -file upload_cert.der -keystore 应该会提示“证书已经存在于keystore的别名下,你还要添加吗?[no]:” 输入'y'并回车将出现确认消息 对于后续构建,使用与 (2) 中相同的过程对应用程序进行签名

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


on 5. keytool error: java.lang.Exception: Public keys in reply and keystore don't match
我遵循了 -importcert 流程,但添加的只是 upload_cert.der 中的别名,而不是 SHA1 ref。这是我可以解决的问题吗?
这看起来像是难题的重要组成部分。这里的关键区别在于 keytool 正在导入我们都在尝试做的证书。我能够用这个成功生成密钥库。但是,当我使用密钥库签署我的 APK 时,指纹仍然是错误的,并且我遇到了上述相同的问题。
updates the original certificate,您的意思是通过添加旧证书或只是重写它包含 2 个条目?
如果使用 Android Studio > Generate Signed APK 确保检查签名版本:V1 和 V2
z
zacronos

简短的回答:

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

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

长答案:

Google Play 支持文章 Manage your app signing keys 提供了理解这一点所需的信息。

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

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

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

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

作为进一步的证据,this other SO question (Android signing error: trusted certificate entries are not password-protected) 解决了同样的问题,但是由于它没有引用上传密钥/证书,因此很容易忽略这个问题的含义——从 Google Play 下载的任何内容都无法解决这个问题。

相反的主张

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

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

那么你能做什么呢?

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

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


“上传密钥是私钥,因为上传密钥用于签署 APK。”无法理解上述句子的步骤。
@VivekPratapSingh 那部分只是解释为什么不可能做 OP 试图做的事情。如果您想跳到后续步骤,可以转到“那么您可以做什么?”部分。
只要您指定与现有 keystone 文件相同的名称,信息就会添加到密钥库中。这是让它发挥作用的关键部分。
@JamesWestgate虽然信息(上传证书)并没有真正添加到密钥库中 - 导入具有相同别名的证书只是用证书中的公钥覆盖密钥库中的公钥,但是因为证书是创建的首先从密钥库中,它实际上是完全相同的值,并且导入没有任何改变。可以在 Google Play 控制台中使用上传证书签署 APK 的假设是基于对密钥和证书应该如何工作的错误理解。
嗨,扎克罗诺斯。幸运的是,我创建了旧密钥库的备份,因此我可以查看该文件的两个版本。新的有两把钥匙,旧的一把。虽然这些钥匙都具有相同的指纹?准确地说,这个过程添加了一个“受信任的证书条目”类型的条目那么给出了什么?
P
Patrick R

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

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

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

转到构建 > 生成签名的 APK。选择“选择现有”并浏览到您的密钥库路径输入“密钥库密码”在密钥别名中点击“...”并检查您的密钥别名是否与您在生成密钥库时提供的相同如果是,请再次提供“密钥密码”点击“下一步”

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


好的,但这与问题中描述的过程有什么关系?已经有可用的证书/密钥(upload.pem)并转换为密钥库。使用生成的密钥库对 APK 进行签名时会出现问题。
是的,如前所述,如果您遵循所有步骤,它也将涵盖该场景,请参见 #4,其中明确指出如果 Keystore 错误,则密钥别名将不同。因此,进一步签名的 APK 不会与上传的相同。如果您需要更多信息,请告诉我。
好吧,我最终暂时禁用了 Google Play 应用签名,并以“旧”方式在本地生成密钥库文件和证书以进行首次上传(来自此处:developer.android.com/studio/publish/app-signing.html)。有趣的是,在那之后,我在控制台的 App Signing 下获得了新的选项和说明,包括 PEPK 工具。如果您使用自行生成的证书进行第一次上传,也许它只是工作?仍然不确定。
似乎您正在为更新的 APK 生成新的密钥库,如果该密钥库与您之前将应用程序上传到商店时使用的不同,那么它将无法工作。
这是第一个 APK 上传和密钥库。我无法让它与 Google Play App Signing 一起使用,所以我切换回了“旧”样式。对于下一次上传,我将使用相同的密钥库。
R
Rahim Dastar

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

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

提示输入密码时按回车。

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

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


M
Manoj Alwis

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

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

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

按照 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文件。