在Sun的JavaKeyStore.engineStore()方法中可能导致NullPointerException的原因是什么?

时间:2013-03-13 22:47:48

标签: java nullpointerexception keystore

我们有一个以编程方式创建KeyStore的应用程序。我们按以下方式创建KeyStore(示例代码,为简洁起见,禁止异常处理),

KeyStore ks = KeyStore.getInstance( "JKS" );
ks.load( null, null );
... // Add crypto material here
keystore.store( new FileOutputStream( "keystore.ks" ), "password" );

方法store(OutputStream stream, char[] password)抛出以下异常,

java.lang.NullPointerException
 at sun.security.provider.JavaKeyStore.engineStore(Unknown Source)
 at sun.security.provider.JavaKeyStore$JKS.engineStore(Unknown Source)
 at java.security.KeyStore.store(Unknown Source)

在文件系统中创建keystore.ks文件。但是当我们尝试使用keytool进行检查时,

keytool -list -keystore nms.keystore
keytool error: java.io.EOFException

有趣的是,相同的代码在我们测试过的每台其他机器上都能完美运行。在实际代码中,传递给store方法的参数都不是null,我们对其进行了三重检查。

关于行为不端的机器的一些细节,

  • CentOS 5.8 32位
  • Sun的JRE 1.6.0_43

1 个答案:

答案 0 :(得分:0)

到目前为止,对于发生的事情的最佳解释是,保存到Keystore的证书中的某些内容触发了方法中的NPE

sun.security.provider.JavaKeyStore.engineStore()

正在生成的证书将以完整的信任链保存在密钥库中。例如,证书A的条目的格式为

Cert A alias : Cert A -> Intermediate CA Trust -> Root CA Trust

重新创建整个信任链后,错误消失了。这与我们之前的观察结果一致,因为信任链是工作系统和非系统之间唯一不同的东西。

我在Grep CodeJava Source Code处查看了课程sun.security.provider.JavaKeyStore的来源,但我无法确定该代码中可能导致NPE的原因。

最后我们有一个解决方案但我们实际上并不知道根本原因。