хранилище ключей Java и настройки пароля - PullRequest
8 голосов
/ 07 февраля 2011

У меня следующий вопрос о хранилищах ключей Java и Keytool.Я предполагаю, что хранилище ключей может иметь более 1 сертификата.Как я уже пытался, с помощью 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)

secret - это парольчтобы получить доступ к хранилищу ключей myPersonal.keystore, которое я создал через keytool.В нем 2 записи для сертификатов, 1 DSA и 1 RSA.У каждого свой пароль с хранилищем ключей (и друг с другом).Теперь код верен, потому что, если я использую хранилище ключей с одной записью сертификата, имеющей тот же пароль, что и хранилище ключей, исключений нет, и программа работает нормально.

Так в чем здесь проблема?Я не должен иметь разные пароли?У меня не должно быть много сертификатов?Или что?

1 Ответ

7 голосов
/ 08 февраля 2011

Как указано API, метод KeyManagerFactory.init принимает пароль, используемый для получения ключей из хранилища ключей. Поскольку существует только один параметр пароля, ожидается, что пароль для всех ключей идентичен. Если для одного из ключей используется другой пароль, вы получите сообщение об ошибке, так как пароль неверен для этой конкретной записи хранилища ключей.

Самое простое решение для вас будет использовать один и тот же пароль для всех записей в хранилище ключей. Если вы настроены на сохранение разных паролей для каждой записи, то вам, возможно, придется подумать о создании собственных пользовательских элементов безопасности, например KeyManager.

...