使用Google Play提供的上传密钥对APK进行签名

Ron*_*ald 46 android keytool apk google-play android-app-signing

我正在尝试了解如何在使用Google Play App Signing时将应用上传到Google Play.

这是我做的:

  1. 创建了一个应用程序
  2. 使用keytool.exe为该应用程序生成密钥
  3. 已将应用上传到Google Play
  4. 已注册Google Play App Signing
  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中,我尝试使用uploadkey生成已签名的APK.

构建>生成签名APK选择上面的密钥库输入密钥库密码选择uploadkey作为密钥别名我强制输入密钥密码.

Android Studio中出错:

错误:任务':app:packageFullRelease'的执行失败.

com.android.ide.common.signing.KeytoolException:无法从商店"C:\ Users\Admin\AndroidStudioProjects\keystores\myappfull-release-key.keystore"读取密钥uploadkey:受信任的证书条目未受密码保护

我的问题是:

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

谢谢

Aya*_*lam 54

我可以使用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. 它应该提示"证书已经存在于别名下的密钥库中.你还想添加它吗?[no]:"
  7. 输入"y"并按Enter键
  8. 将出现确认消息
  9. 对于后续版本,使用与(2)中相同的过程对应用程序进行签名

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

  • 这看起来像拼图的一个重要部分.这里的关键区别是keytool正在导入证书,这是我们所有人都想做的事情.我能够用这个成功生成密钥库.但是,当我用密钥库签署我的APK时,指纹仍然是错误的,我得到了上面提到的相同问题. (5认同)
  • 5. keytool错误:java.lang.Exception:回复中的公钥和密钥库不匹配 (4认同)
  • 我遵循-importcert进程,但所有添加的是upload_cert.der中的别名而不是SHA1 ref.这是我能解决的问题吗? (2认同)

zac*_*nos 25

简答:

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

希望这个答案可以防止其他人浪费尽可能多的时间,因为我试图找到一个不存在的解决方案.


长答案:

Google Play支持文章管理您的应用签名密钥包含了解此信息所需的信息.

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

  • 上传密钥(现有应用程序的可选项):您在注册程序时生成的新密钥.在将所有APK上传到Play控制台之前,您将使用上传密钥对所有未来的APK进行签名.
  • 私钥:对于APK签名,这是用于签署APK的密钥.私钥必须保密.
  • 公钥:对于APK签名,这是用于验证APK签名的密钥.每个人都可以看到公钥.
  • 证书:证书包含公钥以及关于谁拥有密钥的一些额外识别信息.

然后,请注意,在Google Play控制台中,您只能下载上传证书(而非上传密钥).根据上述定义,我们可以得出结论:

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

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


声称相反

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

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


那你能做什么呢?

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

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


Pat*_*k R 3

我认为您必须从“java\bin”文件夹中生成这样的密钥库:

keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
Run Code Online (Sandbox Code Playgroud)

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

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

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

  3. 输入“密钥库密码”

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

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

  6. 点击“下一步”

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

  • 是的,正如已经提到的,如果您遵循所有步骤,它也会涵盖该场景,请参阅#4,其中明确指出如果密钥库错误,则密钥别名将会不同。因此,进一步签名的 APK 将与上传的不同。如果您需要更多这方面的信息,请告诉我。 (2认同)