в Java keystore и пароль

у меня есть следующий вопрос о хранилищах ключей 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 ответов


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

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