我们有一个以编程方式创建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
,我们对其进行了三重检查。
关于行为不端的机器的一些细节,
答案 0 :(得分:0)
到目前为止,对于发生的事情的最佳解释是,保存到Keystore的证书中的某些内容触发了方法中的NPE
sun.security.provider.JavaKeyStore.engineStore()
。
正在生成的证书将以完整的信任链保存在密钥库中。例如,证书A
的条目的格式为
Cert A alias : Cert A -> Intermediate CA Trust -> Root CA Trust
重新创建整个信任链后,错误消失了。这与我们之前的观察结果一致,因为信任链是工作系统和非系统之间唯一不同的东西。
我在Grep Code和Java Source Code处查看了课程sun.security.provider.JavaKeyStore
的来源,但我无法确定该代码中可能导致NPE的原因。
最后我们有一个解决方案但我们实际上并不知道根本原因。