PKCS#12:DerInputStream.getLength()异常

kar*_*ins 17 java security certificate pkcs#12

我使用keytool命令生成证书:

keytool -genkeypair -alias myRSAKey -keyalg RSA -keysize 1024 -keystore test.p12 -storepass test -storetype pkcs12
Run Code Online (Sandbox Code Playgroud)

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

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

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

怎么了?

ibr*_*ker 18

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

KeyStore.load(InputStream is, String pass);
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 第一个原因是你指出它是IMO最常见的原因:通常是错误的文件.也就是说,当我尝试使用带有`KeyStore.getInstance("PKCS12")或反转`:)`的`JKS`密钥库文件时,有时会发生这种情况. (2认同)

Ama*_*eet 8

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

请参阅:Java证书解析


Jan*_* vO 8

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

"keystore load: DerInputStream.getLength(): lengthTag=109, too big."
Run Code Online (Sandbox Code Playgroud)

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


Lee*_*iam 5

我的问题 ( 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)
Run Code Online (Sandbox Code Playgroud)

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