8

Javaキーストアとkeytoolについて次の質問があります。キーストアには複数の証明書があると思います。私が試したように、keytoolを使用してキーストアを作成できます。このキーストアにアクセスするには、パスワードを設定する必要があります。また、各証明書エントリにアクセスするには、パスワードを設定する必要があります。キーストアとエントリに同じパスワードを設定する必要がありますか?そうでない場合(そして私はそう仮定するのが合理的だと思います)、なぜ次のコードがありますか?

char[] pwd = new char[]{'s','e','c','r','e','t'};
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(new FileInputStream("myPersonal.keystore"), pwd);
kmf.init(ks, pwd);//fails here with exception

次の例外がありますか?

Exception in thread "main" java.security.UnrecoverableKeyException: Cannot recover key
    at sun.security.provider.KeyProtector.recover(Unknown Source)
    at sun.security.provider.JavaKeyStore.engineGetKey(Unknown Source)
    at sun.security.provider.JavaKeyStore$JKS.engineGetKey(Unknown Source)
    at java.security.KeyStore.getKey(Unknown Source)

secretmyPersonal.keystorekeytoolで作成したキーストアにアクセスするためのパスワードです。その中には、証明書用に1つのDSAと1つのRSAの2つのエントリがあります。それぞれがキーストア(および相互)で異なるパスワードを持っています。これでコードは正しくなりました。キーストアと同じパスワードを持つ単一の証明書エントリを持つキーストアを使用した場合、例外はなく、プログラムは正常に実行されるためです。

では、ここでの問題は何ですか?別のパスワードを設定するべきではありませんか?私は多くの証明書を持っているべきではありませんか?または何?

4

1 に答える 1

7

API で指定されているように、KeyManagerFactory.init メソッドは、キーストアからキーを取得するために使用されるパスワードを受け取ります。パスワード パラメータは 1 つしかないため、すべてのキーのパスワードが同一であることが想定されます。キーの 1 つに別のパスワードが使用されている場合、その特定のキーストア エントリのパスワードが正しくないため、前述のエラーが発生します。

最も簡単な解決策は、キーストア内のすべてのエントリに同じパスワードを使用することです。エントリごとに異なるパスワードを維持することに設定されている場合は、KeyManager などの独自のカスタム セキュリティ要素の構築を検討する必要がある場合があります。

于 2011-02-07T23:46:50.637 に答える