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

时间:2017-05-19 12:29:41

标签: android google-play apk keytool android-app-signing

我试图了解在使用Google Play App Signing时如何将应用上传到Google Play。

这是我做的:

  1. 创建了一个应用
  2. 使用keytool.exe为该应用生成密钥
  3. 将应用上传到Google Play
  4. 注册Google Play App Signing
  5. 尝试再次上传应用,但没有成功。
  6. 它抱怨证书不是证书

      

    将新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:无法从商店读取密钥uploadkey     " C:\用户\管理员\ AndroidStudioProjects \密钥库\ my​​appfull释放-key.keystore&#34 ;:     受信任的证书条目不受密码保护

      

    我的问题是:

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

    由于

5 个答案:

答案 0 :(得分:50)

我可以使用Google Play提供的上传密钥对我的APK进行签名。以下是我为新应用程序执行的步骤:

  1. 使用Android Studio创建密钥库并添加签名密钥
  2. 使用(1)
  3. 中创建的密钥对应用程序进行签名
  4. 将APK上传到Google Play
  5. 下载"上传证书"来自Google Play控制台
  6. 使用命令将下载的证书添加到步骤(1)中创建的密钥库中 keytool.exe -importcert -file upload_cert.der -keystore <keystorefile>
  7. 它应该提示&#34;证书已存在于别名下的密钥库中。你还想加吗? [否]:&#34;
  8. 键入&#39; y&#39;然后按Enter
  9. 将出现确认消息
  10. 对于后续版本,使用与(2)
  11. 中相同的过程对应用程序进行签名

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

答案 1 :(得分:20)

简短答案:

您无法在Google Play控制台中使用上传证书签署APK。

希望这个答案可以防止其他人浪费我尝试寻找不存在的解决方案所花费的时间。


长答案:

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

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

  
      
  • 上传密钥(对于现有应用是可选的):您在注册该程序期间生成的新密钥。您将使用上传密钥对以后所有的APK进行签名,然后再将其上传到Play控制台。
  •   
  • 私有密钥:对于APK签名,这是用于对APK签名的密钥。私钥必须保密。
  •   
  • 公钥:对于APK签名,这是用于验证APK签名的密钥。公钥对所有人都可见。
  •   
  • 证书:证书包含公共密钥以及一些有关谁拥有密钥的额外标识信息。
  •   

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

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

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


主张相反

尽管有人报告可以使用从Google Play下载的上传证书对APK进行签名,但我相信他们误会了发生的情况。请注意,通常这些报告表明您必须将证书导入到用于生成密钥的原始密钥库中。实际上,当他们认为自己正在导入对APK进行签名所需的(私钥)时,实际上他们只是在导入公钥并覆盖密钥对中的公钥的一半-使用与证书中导出的公钥相同的公钥。首先。

如果他们不使用导入过程就尝试使用该别名对APK进行签名,那么效果也一样。 (导入对他们没有任何改变。)这就是为什么导入仅在与原始密钥库一起使用而不与新密钥库一起使用时才起作用的原因。


那你该怎么办?

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

  1. 在设置“通过Google Play进行应用签名”的过程中,有人生成了一个上传密钥并将其注册到Google。如果您仍然在某个地方的密钥库中拥有该(私钥)密钥,那么这正是对APK进行签名所需要的。
  2. 如果您使用keytool以外的其他工具生成了上传密钥,然后将其导入到密钥库中,但是仍然拥有原始生成的文件,则可以使用任何其他方法将私钥再次导入到另一个密钥库中。这个过程是第一次使用。
  3. 如果以上都不是选项,则可以按照Manage your app signing keys article的“创建新的上传密钥”部分中的说明生成新的上传密钥,并让Google交换它。

答案 2 :(得分:3)

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

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

如果要更新应用程序,则必须使用已生成的同一密钥库。

  1. 转到Build&gt;生成签名APK。

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

  3. 输入“密钥库密码”

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

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

  6. 点击“下一步”

  7. 让我知道你在哪个步骤中遇到问题,所以我可以相应地指导你。

答案 3 :(得分:1)

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

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

提示输入密码时,按Enter键。

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

它对我有用,我想肯定会为您工作。

答案 4 :(得分:0)

我必须联系google,并按照以下说明生成新密钥并上传证书。

新的上传密钥将用于对您上传到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文件。