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

时间:2017-03-02 11:28:25

标签: java android cordova signing pkcs#12

我们正在使用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

5 个答案:

答案 0 :(得分: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可能不是必需的。

答案 1 :(得分:4)

我花了好几个小时找到解决这个问题的方法。尝试了五种不同的JDK,没有任何效果。我有一个旧的PKCS12证书,用于我所拥有的非常受欢迎的Playstore应用程序"继承"来自之前的开发人员,JDK 8 + 9将不会使用它。 Olexandr的解决方案也没有帮助。

最后,几乎是通过剪切运气,我设法在Weijung Wang的反应中找到了解决方案here。它涉及使用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.   
  3. openssl pkcs12 -in key-and-cert -export -out new-pkcs12-file -passout pass:abcXYZ

  4.   

答案 2 :(得分: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

答案 3 :(得分:1)

我有使用JDK6生成的密钥库。 作为解决方法,我通过在[项目结构] - [SDK位置] - [JDK位置]下设置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

答案 4 :(得分:0)

@Water的解决方案对我不起作用。生成的apk的签名与原始apk的签名不同。

我终于通过上传使用pepk工具生成的私钥升级到Google的新应用程序签名来使其工作了,并要求他们的支持来重置上传密钥。