首页 文章

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

提问于
浏览
35

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

这是我做的:

  • 创建了一个应用程序

  • 使用keytool.exe为该应用生成密钥

  • 将应用上传到Google Play

  • 已加入Google Play App Signing

  • 尝试再次上传应用程序但未成功 .

它抱怨证书不是证书

将新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?

谢谢

4 回答

  • 0

    我想你必须从你的“java \ bin”文件夹生成这样的密钥库:

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

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

    • 转到Build> Generate Signed APK .

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

    • 输入“密钥库密码”

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

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

    • 点击“下一步”

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

  • 2

    简答:

    You can't sign an APK with the upload certificate in the Google Play Console.

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


    答案很长:

    Google Play支持文章Manage your app signing keys包含了解此信息所需的信息 .

    从“ Types of keys & important definitions ”部分:

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

    然后,请注意,在Google Play控制台中,您只能下载 upload certificate (而不是 upload key ) . 根据上述定义,我们可以得出结论:

    • the upload key is a private key ,因为上传密钥用于签署APK .

    • the upload certificate does not contain a private key ,因为证书通常包含公钥,而不是私钥(有例外,有点,但在这种情况下不是) .

    • 因此, the upload certificate cannot be used to sign an APK ,无论您采取什么步骤 . 它只是不包含必要的信息 .

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


    声称相反

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

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


    那你能做什么呢?

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

    • 在设置"app signing by Google Play"期间的某个时刻,有人生成了一个上传密钥并将其注册到Google . 如果您在某个密钥库中仍然拥有该(私有)密钥,那么这正是您签署APK所需的 .

    • 如果使用 keytool 之外的某个工具生成上传密钥然后将其导入到密钥库中,并且仍然具有原始生成的文件,则可以使用第一次使用的任何进程将私钥再次导入到其他密钥库中 .

    • 如果以上都不是选项,您可以按照Manage your app signing keys article的"Create a new upload key"部分中的说明生成新的上传密钥,并让Google将其替换 .

  • 45

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

    • 创建密钥库并使用Android Studio添加签名密钥

    • 使用(1)中创建的密钥对应用程序签名

    • 将APK上传到Google Play

    • 从Google Play控制台下载"Upload certificate"

    • 使用命令 keytool.exe -importcert -file upload_cert.der -keystore <keystorefile> 将下载的证书添加到步骤(1)中创建的密钥库中

    • 应该提示"Certificate already exists in keystore under alias . Do you still want to add it? [no]:"

    • 键入'y'并按Enter键

    • 将出现确认信息

    • 对于后续版本,使用与(2)中相同的过程对应用程序进行签名

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

  • 10

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

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

    提示输入密码时按Enter键 .

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

    它对我有用,我认为它肯定会对你有用 .

相关问题