PKCS#12 : DerInputStream.getLength() exception

2022-09-01 15:16:31

我使用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,太大的例外。

怎么了?


答案 1

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

KeyStore.load(InputStream is, String pass);

此方法采用 InputStream,如果此类 InputStream 存在任何问题,则会引发此异常,我遇到了一些问题:

  • 输入流指向错误/空白/刚刚创建的文件
  • 输入流已打开,或者其他内容正在保存资源
  • InputStream已被使用和读取,因此InputStream的下一个字节的位置是它的末端

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


答案 2

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

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

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