KeyStore.load не работает, но KeyStore.getkey работает с тем же паролем - PullRequest
3 голосов
/ 15 мая 2019

Использование класса хранилища ключей Java.

 InputStream keystoreStream = new FileInputStream(strKeystorePath); 
 KeyStore keystore = KeyStore.getInstance("JCEKS"); 
 keystore.load(keystoreStream, strTrustStorePwd.toCharArray()); 
 Key key = keystore.getKey(strAliasName, strTrustStorePwd.toCharArray());

Метод load() выдает ошибку keytool:

java.io.IOException: хранилище ключей было подделано, или пароль был неправильным.

Но когда: используйте

InputStream keystoreStream = new FileInputStream(strKeystorePath); 
KeyStore keystore = KeyStore.getInstance("JCEKS"); 
keystore.load(keystoreStream, null); 
Key key = keystore.getKey(strAliasName, strTrustStorePwd.toCharArray());

работает нормально. Обратите внимание, что одни и те же пароли используются методами load и getKey.

Когда методы load() и getKey используются с паролями, метод load() выдает ошибку, но когда load() используется с паролем null и getKey с тем же паролем, он работает .

1 Ответ

1 голос
/ 15 мая 2019

JCEKS, как и JKS, использует пароль уровня хранилища (только) для проверки целостности всего хранилища;если вы вызываете .load(instream,null), он не проверяет целостность, но все равно загружает содержимое - или пытается: если данные фактически были подделаны или повреждены, загрузка может дать сбой любым количеством способов, или, по-видимому, будет успешной, но приведет к другимпроблемы позже;но если данные верны, они загружаются.(Обратите внимание, что это не обязательно верно для других типов хранилищ ключей, таких как PKCS11.)

Сертификаты в JCEKS или JKS не зашифрованы и могут быть доступны без (дополнительного) пароля.Закрытые ключи (если таковые имеются) индивидуально зашифрованы паролем, и для доступа к закрытому ключу необходимо указать правильный пароль уровня ключа, который может совпадать с паролем хранилища или другим.Обычно проще сделать пароль (и) ключа таким же, как пароль хранилища, и, как правило, менее запутанно, но это не обязательно.

У вас, очевидно, есть JCEKS, пароль хранилища которого отличается от пароля хранилища.значение, которое вы знаете, но содержит ключ, пароль которого соответствует этому значению.Если вы хотите изменить это, после .load(instream,null) перепишите его с .store(outstream,desiredpassword).

...