SSLContextBuilder не удается загрузить KeyMaterial - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь использовать 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?

1 Ответ

0 голосов
/ 11 июня 2018

Необходимо добавить .setKeyStoreType("JKS") перед вызовом .loadKeyMaterial(...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...