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

信頼チェーン全体が再作成された後、エラーはなくなりました。これは、信頼の連鎖が機能しているシステムと機能していないシステムの間で唯一異なるものであるため、以前の観察と一致しています。

Grep CodeJava Source Codesun.security.provider.JavaKeyStoreの両方でクラスのソースを見てきましたが、そのコードで何が NPE を引き起こしているのかわかりません。

最終的には解決策がありますが、実際には根本的な原因はわかりません。

于 2013-03-14T19:25:44.283 に答える