apksigner завершается ошибкой при использовании сертификатов openssl напрямую с cordova apk - PullRequest
0 голосов
/ 11 марта 2019

TLDR: apksigner sign -key rsa_der.key -cert x509.cert app.apk происходит сбой при непосредственном использовании сертификата и ключа, сгенерированного openssl, которые не хранятся в хранилище ключей.


Я хочу, чтобы apksigner работал для использования на нашем CIсервера, однако, я бы предпочел не создавать файл хранилища ключей Java для каждой сборки или хранить его безопасно между сборками.

Приложение представляет собой приложение Cordova, созданное с cordova build android --release.

Я сделал следующее, чтобы создать сертификат и ключ в ожидаемых форматах.Я испробовал множество способов генерации сертификата и ключа, ниже приведен наиболее краткий.(примечание: 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

Как указано выше, я бы предпочел не создавать и не удалять хранилище ключей при каждой сборке или хранить его между сборками.

Что я делаю не так?

1 Ответ

0 голосов
/ 21 марта 2019

В данном конкретном случае это была длина ключа (я думаю ) и использование парольной фразы на основе файла.

Для нас сработало следующее:

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

Поскольку в этом секретном ключе отсутствует парольная фраза, она несколько менее безопасна.

...