4

我们有一个以编程方式创建的应用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
4

1 回答 1

0

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

sun.security.provider.JavaKeyStore.engineStore().

正在生成的证书与其完整的信任链一起保存在密钥库中。例如,证书的条目A将是以下形式,

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

重新创建整个信任链后,错误消失了。这与我们之前的观察结果一致,因为信任链是正常运行的系统和未运行的系统之间唯一不同的地方。

我已经查看sun.security.provider.JavaKeyStoreGrep 代码Java 源代码中的类源代码,但我无法确定是什么导致了该代码中的 NPE。

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

于 2013-03-14T19:25:44.283 回答