PKCS#12:DerInputStream.getLength()异常

时间:2011-09-13 08:52:14

标签: java security certificate pkcs#12

我使用keytool命令生成证书:

keytool -genkeypair -alias myRSAKey -keyalg RSA -keysize 1024 -keystore test.p12 -storepass test -storetype pkcs12

然后,如果我尝试使用java安全API加载它,将文件作为byte []:

获取
KeyStore ks = KeyStore.getInstance("PKCS12");
try{
   ks.load(new ByteArrayInputStream(data), "test".toCharArray())
} catch (Exception e){
   ...
}

我得到一个DerInputStream.getLength():lengthTag = 127,太大的异常。

有什么问题?

11 个答案:

答案 0 :(得分:17)

我有这个问题,我搜索了谷歌的深度,仍然找不到答案。经过几天与糟糕的质量遗留代码作斗争后,我发现导致此错误的原因。

KeyStore.load(InputStream is, String pass);

这个方法接受一个I​​nputStream,如果这个InputStream出现任何问题,抛出这个异常,我遇到了一些问题:

  • InputStream指向错误/空白/刚刚创建的文件
  • InputStream已经打开或其他东西正在保存资源
  • InputStream 已经使用并读取,因此InputStream的下一个字节的位置是它的结束

最后一个是我的问题的责任。代码是从证书创建一个InputStream,并在两个KeyStore.load()调用中继续使用它,第一个成功,第二个总是让我犯这个错误。

答案 1 :(得分:8)

您创建的证书可能在最后有一个额外的字符,被误解为另一个证书。 最后使用一个或多个空行。

参考:Java Certificate Parsing

答案 2 :(得分:6)

对于有类似问题的其他人:

"keystore load: DerInputStream.getLength(): lengthTag=109, too big."

对我来说,解决办法是删除参数:-storetype pkcs12 因为标准类型是jks

答案 3 :(得分:2)

在代码中指定证书类型 例如:

 [IsActiveTrue(ErrorMessageResourceType = typeof(Resources.Resource), ErrorMessageResourceName = "Requried")]
       public string Remarks { get; set; }

答案 4 :(得分:1)

我的问题(lengthTag=109, too big)是.p12文件实际上是JKS格式,而不是PKCS#12格式。有人重命名了文件扩展名。通过以正确的PKCS格式重新生成,可以解决此问题。

java.io.IOException: DerInputStream.getLength(): lengthTag=109, too big.
    at sun.security.util.DerInputStream.getLength(DerInputStream.java:599)
    at sun.security.util.DerValue.init(DerValue.java:365)
    at sun.security.util.DerValue.<init>(DerValue.java:320)
    at sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:1914)
    at java.security.KeyStore.load(KeyStore.java:1445)

要检查安全文件的格式,可以使用KeyStore Explorer打开该文件。左下栏显示实际格式。

答案 5 :(得分:0)

你做错了什么 我尝试了你的命令,然后加载了p12就好了 以下代码有效:

 FileInputStream fin = new FileInputStream("..\\test.p12");
 KeyStore ks = KeyStore.getInstance("PKCS12");
 ks.load(fin, "123456".toCharArray());
 System.out.println(ks.getCertificate("myrsakey"));

我想知道你是否把命令放在了,因为你从keytool得到一个错误,密码必须至少6个字符。
你没有得到那个错误?您使用的是哪个版本的Java?
注意:如果您需要创建证书,您也可以查看此工具 http://sourceforge.net/projects/certhelper/

答案 6 :(得分:0)

我遇到了同样的问题。

我的解决方案是在下面的行中用jceks替换PKCS12,因为我显然使用了错误的类型。

KeyStore clientStore = KeyStore.getInstance("PKCS12");

答案 7 :(得分:0)

这件事发生在我身上,因为我在我的Windows 10机器上本地复制并粘贴了.p12文件。不知道这是什么/为什么这是一个问题,但是当我克隆一个包含.p12个文件的项目并将我的代码指向它们时,文件就可以工作了。但是,将Windows文件资源管理器中的文件复制并粘贴到硬盘驱动器上的其他位置会导致此错误!!!!

答案 8 :(得分:0)

在AndroidX迁移并使用新的测试框架之后,这在Android Studio中发生了。甚至删除现有的~/.android/debug.keystore对我来说都是失败的

解决方案是手动重新生成的(接受所有问题为空,最后一个回答是)

$ keytool -genkey -v -keystore debug.keystore -storepass android -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000

并复制

$ rm ~/.android/debug.keystore
$ cp debug.keystore ~/.android/debug.keystore

答案 9 :(得分:0)

确保inputstream变量的范围仅适用于您声明它的方法,而不能作为静态/类变量。这样可以避免这种异常。 原因:Inputstream在被声明为类变量的情况下第一次加载证书或数据后并未关闭,因此仅对方法可用。

答案 10 :(得分:0)

发生这种情况是因为以下命令:

openssl pkcs12 -export -in import.pem -inkey myhost.key.pem -name shared > server.p12(来自https://docs.oracle.com/en/database/other-databases/nosql-database/12.2.4.5/security/import-key-pair-java-keystore.html

生成了格式错误的pkcs12文件。使用以下命令可以解决问题:

openssl pkcs12 -export -in import.pem -inkey myhost.key.pem -name shared -out server.p12