2011-09-13 52 views
11

我生成使用keytool命令证书:PKCS#12:DerInputStream.getLength()异常

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

然后,如果我尝试加载用java安全API它,得到该文件作为字节之后[] :

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

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

出了什么问题?

回答

10

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

KeyStore.load(InputStream is, String pass); 

这种方法获取InputStream,如果有这样的InputStream的任何问题,这会抛出异常,我已经遇到了一些问题:

  • InputStream的指向错误/空/只创建的文件
  • 的InputStream为已打开或别的东西,是抱着
  • InputStream的已经使用和资源阅读,因此下一个字节的位置InputStream是结尾

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

+0

谢谢。错误信息是真的令人误解。在我的情况'数据'(关键)是一个空的字节数组,并导致这个错误。所有,因为我重用了输入流。 – Stroboskop

+2

第一个原因是你指出它是IMO最常见的原因:通常是错误的文件。也就是说,当我尝试通过'KeyStore.getInstance(“PKCS12”)'或反转':)''使用'JKS'密钥库文件时,有时会发生这种情况。 – albciff

7

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

请参阅:Java Certificate Parsing

+0

是的,我已经检查,因为我有一个x509证书类似的错误,但事实并非如此。感谢您的回答,我会为它+1,因为它可能是问题所在。 – karlipoppins

+1

看起来像链接已死。 –

+0

@AniketThakur:我修复了这个链接。你现在可以参考它。 – Amanpreet

0

你在做错事。
我试过你的命令,然后加载p12就好了。
下面的代码工作:

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

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

3

对于其他类似的问题:

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

对我来说,解决方法是删除帕拉姆:由于标准型为JKS

-1

在EG的代码 指定的证书类型-storetype pkcs12

System.setProperty("javax.net.ssl.trustStoreType", "jks"); 
System.setProperty("javax.net.ssl.keyStoreType", "pkcs12"); 
0

我有同样的问题。

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

KeyStore clientStore = KeyStore.getInstance("PKCS12"); 
相关问题