签署Android应用程序抛出IOException:找到冗余长度字节

问题描述 投票:6回答:4

我们正在开发Cordova应用程序,并且无法签署Android版本的应用程序。

使用命令

jarsigner -keystore keystore.p12 -storetype pkcs12 android-release-unsigned.apk 1

给出以下例外

java.io.IOException: DerInputStream.getLength(): Redundant length bytes found

来自OpenJDK this lineapparently这个被添加来修复CVE-2016-5546虽然我不太了解加密来真正理解它。

使用openssl导出证书并从中创建新的p12工作正常,但更改签名,这意味着Play商店拒绝上传。

我们的密钥库来自另一家我们最初将应用程序开发外包给的公司。

任何jarsigner或keytool命令抛出相同的异常,我认为这是有意义的,因为它们都使用相同的Java lib

java android cordova signing pkcs#12
4个回答
4
投票

我们遇到了同样的问题。我们发现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可能没有必要。


4
投票

我花了好几个小时找到解决这个问题的方法。尝试了五种不同的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文件:

  1. openssl pkcs12 -in pkcs12-file -out key-and-cert -nodes -passin pass:abcXYZ
  2. openssl pkcs12 -in key-and-cert -export -out new-pkcs12-file -passout pass:abcXYZ

3
投票

我一直有同样的错误,并且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

1
投票

我有用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
© www.soinside.com 2019 - 2024. All rights reserved.