android - 使用提供的 upload_cert.der 签署发布的 Android APK 文件
问题描述
我刚刚注册了 Google Play App Signing 程序,该程序需要上传发布密钥库的加密版本,并且有一个用于创建上传密钥库的“可选”步骤 - 可选在引号中,因为我认为这应该是必需的步骤,但无论如何,在成功注册后,我现在留下了一个Upload certificate,我应该以某种方式使用它来签署我未来的应用程序版本。
到目前为止我所做的:我从 Android Studio 创建了一个新的密钥库,设置了商店和别名密码,并尝试将upload_cert.der导入现有的别名 - 失败:
keytool -importcert -file upload_cert.der -alias upload -keystore upload-keystore.jks
keytool 错误:java.lang.Exception:回复中的公钥和密钥库不匹配
我还尝试在不指定别名(或删除现有别名并创建新别名)或使用不同别名的情况下导入上传证书:
keytool -importcert -file upload_cert.der -keystore upload-keystore.jks
...也失败了:最终创建了一个名为mykey的新别名,该别名不受密码保护并且失败并显示以下消息:
原因:java.lang.RuntimeException:com.android.ide.common.signing.KeytoolException:无法从存储“/path/to/upload-keystore.jks”读取密钥上传:受信任的证书条目不受密码保护
...很自然,我尝试为别名设置密码:
keytool -keypasswd -alias upload -keystore upload-keystore.jks
消息也失败了:
keytool 错误:java.lang.Exception:别名没有键
...现在我已经没有想法了。
与此同时,我已经向 Google Play 支持发送了一个问题/请求以更新我的上传密钥,但是,我希望有解决这种情况的方法(支持的回复有点慢),因为文档没有t 以任何方式暗示生成上传密钥库并上传该密钥库的加密私钥是一项要求。因此,要么文档模糊/不清楚/错误,要么有一种方法可以使用生成的 upload_cert.der。有什么想法吗?
编辑:
感谢Pierre提供的答案和评论,我意识到如果您不创建/提供上传密钥,则应使用您现有的原始签名密钥和upload_cert.der。因此,唯一的要求是通过运行插入上传证书:
keytool -importcert -file upload_cert.der -keystore original-signing-keystore.jks
...并且您应该能够继续将您的应用程序发布到 Play 商店。
解决方案
您上传到 Play 管理中心的 .der 文件(也可以在 Play 管理中心的 App Signing 页面中下载)不包含私钥,它只包含公钥,因此您将无法用它签署任何东西。
只有您为生成上传证书而创建的密钥库包含私钥,并且必须用于签署您的 APK(或 App Bundle)。
换句话说,您不应该在注册 Play 签名后创建另一个密钥库,您应该使用您创建的密钥库来生成上传证书来签署您未来的工件。
希望有帮助。
推荐阅读
- css - 如何在没有媒体查询的情况下将 2 个 CSS 网格列变成 1 个用于移动设备?
- powerbi - 在嵌入式 Power BI 报表中默认使用 PageView 传递什么 URL 参数?
- python - 格式化一个 json 然后用 json.load() 打开它
- c - epoll_wait和dup2跨fork交互
- ruby-on-rails - 在 Rails 应用程序中使用钩子时出现错误
- javascript - 我试图从我在网上购买的编译器运行相同的代码两次
- php - php引导轮播指标
- python - 如何更改 Maya 自定义属性的最小值?
- javascript - mongo shell 中的 Node.js child_process 命令
- android - React Native Android:每次获得焦点时重新渲染屏幕