Я пытаюсь использовать Apache httpclient-4.5.5 (с httpcore-4.4.9) для получения сертификата сервера от сервера, который применяет «взаимный SSL».Я создаю SSLContext следующим образом:
final String keystorePass = Configuration.getInstance().getItem(EmittentProperties.keystorePass);
final String kmopEncKeyPass = Configuration.getInstance().getItem(EmittentProperties.kmopEncKeyPass);
final String kmopEncKeyAlias = Configuration.getInstance().getItem(EmittentProperties.kmopEncKeyAlias);
//1.Create the SSLContext and SSLConnectionSocketFactory
SSLContext sslContext;
try {
sslContext = SSLContexts.custom()
.loadKeyMaterial(keystoreFile.getFile(), keystorePass.toCharArray(), kmopEncKeyPass.toCharArray(), new PrivateKeyStrategy() {
@Override
public String chooseAlias(Map<String, PrivateKeyDetails> aliases, Socket socket) {
return kmopEncKeyAlias;
}})
.loadTrustMaterial(new TrustStrategy() {
@Override
public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
return true;
}})
.build();
} catch (Exception e) {
logger.error("Error initializing SSLContext: " + e.getMessage(), e);
throw new FatalException(e.getMessage(), e);
}
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
Однако он всегда возвращает «java.security.UnrecoverableKeyException: Невозможно восстановить ключ» на loadKeyMaterial(...)
.При отладке этого метода я вижу, что он успешно загружает хранилище ключей и что оно содержит ключи, которые я создал в нем.Однако при последующей попытке загрузить запись ключа, связанную с паролем kmopEncKeyPass, он возвращает исключение UnrecoverableKeyException.
В хранилище ключей My (JKS) есть две (самозаверяющие) записи «kmop-enc», используемые для рукопожатия SSL, и «kmop-sign 'для SSL-подписи сообщений.Пароль для псевдонима kmop-enc (параметр kmopEncKeyPass) совпадает с паролем для хранилища ключей (параметр keystorePass).С помощью CustomKeyStrategy я хочу убедиться, что kmop-enc возвращается как псевдоним, а не как kmop-sign (с другим паролем).
Проверка моего хранилища ключей с помощью keystore-explorer.org показывает, что все в порядке с моим хранилищем ключей.Любые идеи о том, почему он вызывает исключение UnrecoverableKeyException?