TLDR:apksigner sign -key rsa_der.key -cert x509.cert app.apk
直接使用openssl
未存储在密钥库中的证书和生成的密钥时失败。
我想让 apksigner 在我们的 CI 服务器上工作,但是,我不希望在每个构建中生成一个 java 密钥库文件,或者在构建之间安全地存储一个。
该应用程序是一个科尔多瓦应用程序,使用cordova build android --release
.
我执行以下操作以创建预期格式的证书和密钥。我尝试了多种生成证书和密钥的方法,以下是最简洁的。(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
尝试使用证书和密钥签署 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
如上所述,我不希望在每次构建时都创建和删除密钥库,或者需要在构建之间存储它。
我究竟做错了什么?