android - 直接使用 cordova apk 使用 openssl 证书时 apksigner 失败

标签 android cordova apk android-signing

TLDR:apksigner sign -key rsa_der.key -cert x509.cert app.apk 直接使用未存储在 openssl 中的证书和 key 时失败一个 keystore 。


我想让 apksigner 在我们的 CI 服务器上工作,但是,我不希望在每个构建上生成一个 java keystore 文件,或者在构建之间安全地存储一个。

该应用是一个 cordova 应用,使用 cordova build android --release 构建。

我执行了以下操作以按预期格式创建证书和 key 。我尝试了多种生成证书和 key 的方法,下面是最简洁的。 (nb.passphrase.txt包含一个大口令,所有命令在Fedora 29机器上执行)

$ openssl req -x509 -days 9125 -newkey rsa:4096 -keyout rsa_pem.key -out x509.cert # generate certificate & key
$ openssl pkcs8 -topk8 -inform PEM -outform DER -in rsa_pem.key -out rsa_der.key -passout file:passphrase.txt # convert key over to DER formatted pkcs8, as required by apksigner

尝试使用证书和 key 签署 apk 失败:

$ apksigner sign -key rsa_der.key --key-pass file:passphrase.txt -cert x509.cert app.apk
Failed to load signer "signer #1"
java.security.spec.InvalidKeySpecException: Failed to load PKCS #8 encoded private key from ./rsa_der.key
    at com.android.apksigner.ApkSignerTool$SignerParams.loadPrivateKeyAndCertsFromFiles(ApkSignerTool.java:911)
    at com.android.apksigner.ApkSignerTool$SignerParams.loadPrivateKeyAndCerts(ApkSignerTool.java:665)
    at com.android.apksigner.ApkSignerTool$SignerParams.access$500(ApkSignerTool.java:615)
    at com.android.apksigner.ApkSignerTool.sign(ApkSignerTool.java:269)
    at com.android.apksigner.ApkSignerTool.main(ApkSignerTool.java:89)
Caused by: java.security.spec.InvalidKeySpecException: Not an RSA, EC, or DSA private key
    at com.android.apksigner.ApkSignerTool$SignerParams.loadPkcs8EncodedPrivateKey(ApkSignerTool.java:968)
    at com.android.apksigner.ApkSignerTool$SignerParams.loadPrivateKeyAndCertsFromFiles(ApkSignerTool.java:909)
    ... 4 more

如上所述,我不希望在每次构建时都创建和删除 keystore ,或者需要在构建之间存储它。

我做错了什么?

最佳答案

在这种特殊情况下,它最终成为 key 长度(我认为),并使用基于文件的密码。

以下对我们有用:

openssl req -x509 -days 9125 -newkey rsa:1024 -nodes -keyout key.pem -out certificate_x509.pem
openssl pkcs8 -topk8 -outform DER -in key.pem -inform PEM -out key.pk8 -nocrypt
apksigner sign --key key.pk8 --cert certificate_x509.pem app.apk

由于这缺少私钥密码短语,因此安全性稍差。

关于android - 直接使用 cordova apk 使用 openssl 证书时 apksigner 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55094683/

相关文章:

angularjs - facebookConnectPlugin 未定义(ngCordova,Ionic 应用程序)

android - 如何查找 android 应用程序是由 AndroidOS 还是 ChromeOS 的 android 容器启动的?

java - onSaveInstanceState(Bundle)方法是在onPause()之后调用的吗?

javascript - 使用 Ionic 框架显示远程图像的 Android Hybid 应用程序问题?

android - 地理围栏、iBeacons 以及在人们走进餐厅时发送通知

ios - Phonegap native 选择

android - 从另一个 APK 访问的布局无法访问其可绘制资源

android - 单个开发者可以在 Android Market 上发布多少个不同的应用程序是否有限制?

Android fragment 未添加到返回堆栈

android - 实现操作栏 : ABSherlock or ABCompat?