2011-02-07 3 views
7

У меня есть следующий вопрос о java keystores и keytool. Я полагаю, что хранилище ключей может иметь более одного сертификата. Как я уже пытался, через keytool я могу создать хранилище ключей, и для доступа к этому хранилищу ключей я должен установить пароль. Также для доступа к каждой записи сертификата я должен установить пароль. Обязательно ли иметь один и тот же пароль для хранилища ключей и записей? Если нет (и я думаю, что это разумно предположить так) почему следующий код:java keystore and password settings

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

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

ответ

7

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

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

+0

Итак, вы говорите, что это неявное требование? Есть ли причина, чтобы заставить это ограничение в KeyManagerFactory? Я предполагаю, что в реальных сценариях общий случай заключается в использовании разных паролей. – Cratylus

+0

Это неявно, как для определения API KeyManagerFactory , Я бы предположил, что API был создан для обработки простейшего сценария, который состоит в том, что все ключи имеют одинаковый пароль. KeyManagerFactory - это простой механизм, который охватывает то, что может быть более распространенным подходом (я еще не проверял). API KeyStore позволяют вам получать доступ к различным ключам с разными паролями, что позволяет расширить функциональность для более сложных сценариев. Что касается обоснования определения API ... трудно сказать. –

+0

Это работает. Цените помощь! – Bai