我们正在开发Cordova应用程序,并且无法签署Android版本的应用程序。
使用命令
jarsigner -keystore keystore.p12 -storetype pkcs12 android-release-unsigned.apk 1
给出以下例外
java.io.IOException: DerInputStream.getLength(): Redundant length bytes found
来自OpenJDK this line的apparently这个被添加来修复CVE-2016-5546虽然我不太了解加密来真正理解它。
使用openssl导出证书并从中创建新的p12工作正常,但更改签名,这意味着Play商店拒绝上传。
我们的密钥库来自另一家我们最初将应用程序开发外包给的公司。
任何jarsigner或keytool命令抛出相同的异常,我认为这是有意义的,因为它们都使用相同的Java lib
我们遇到了同样的问题。我们发现JDK 1.8.0_112没有您正在谈论的错误。所以我们用这种方式解决了这个问题:
首先,我们使用以下命令(temp_keystore.p12
)将mycert.keystore
转换为Java\jdk1.8.0_112\bin\keytool.exe
:
keytool -importkeystore -srckeystore temp_keystore.p12 -destkeystore mycert.keystore -srcstoretype pkcs12
然后我们使用以下命令(Java\jdk1.8.0_112\bin\jarsigner.exe)
:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore mycert.keystore ReadyForSigning.apk 1
签署apk
。 (命令末尾的“1
”是别名)
PS。:从.p12
转换到.keystore
可能没有必要。
我花了好几个小时找到解决这个问题的方法。尝试了五种不同的JDK,没有任何效果。我有一个非常流行的Playstore应用程序的旧PKCS12证书,我已经从之前的开发人员“继承”了,而JDK 8 + 9将不会使用它。 Olexandr的解决方案也没有帮助。
最后,几乎是靠剪切运气,我设法找到了一个解决方案here,在Weijung Wang的回应。它涉及使用openssl导出和重新导入证书。然后我重新导入了JKS密钥库中的P12密钥库,它现在可以与JDK 8一起使用。
引用:
weijun Weijun Wang添加了评论 - 2017-02-28 15:55 Openssl能够在提取私钥时删除冗余0。我们可以使用以下2个命令来规范化受影响的pkcs12文件:
- openssl pkcs12 -in pkcs12-file -out key-and-cert -nodes -passin pass:abcXYZ
- openssl pkcs12 -in key-and-cert -export -out new-pkcs12-file -passout pass:abcXYZ
我一直有同样的错误,并且Olexandr的解决方案不起作用,因为在JDK8上使用keytool(更新151)会在读取使用JDK7生成的证书时抛出错误。从Anders回答,使用OpenSSL工作(粘贴命令行以供将来参考):
openssl pkcs12 -in android.p12 -out android_fixed.cert -nodes -passin pass:your_p12_password
openssl pkcs12 -in android_fixed.cert -export -out android_cert.p12 -passout pass:your_p12_password
我有用JDK6生成的密钥库。作为解决方法,我通过在[Project Structure] - [SDK Location] - [JDK location]下设置JDK来使用JDK 1.8.0_112。
我已经解决了以下步骤(使用macOS)。
使用JDK 1.8.0_112转换为PKCS12
/Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/bin/keytool -importkeystore -srckeystore original.keystore -destkeystore 1.8.0_112.p12 -deststoretype PKCS12 -storepass ***** -destkeypass *****
使用OpenSSL进行处理(感谢Weijung Wang和Anders Emil)
openssl pkcs12 -in 1.8.0_112.p12 -out 1.8.0_112.cert -nodes -passin pass:*****
openssl pkcs12 -in 1.8.0_112.cert -export -out 1.8.0_112.export.p12 -passout pass:*****
使用JDK 1.8.0_161转换为JKS。
在这里,我需要指定-destkeypass,-scalcalias和-destalias。请注意,openSSL命令后别名为“1”,因此需要设置别名。
/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/bin/keytool -importkeystore -srckeystore 1.8.0_112.export.p12 -srcstoretype pkcs12 -destkeystore 1.8.0_112.keystore -deststoretype jks -deststorepass ***** -destkeypass ***** -srcalias 1 -destalias youralias
所以指纹的结果就像这样。
Original keystore:
SHA1: 6C:9E:...:C5:8A
Original apk:
SHA1: DA:4C:...:3F:02
Modified keystore:
SHA1: C8:4A:...:2A:23
Modified apk:
SHA1: DA:4C:...:3F:02