Я преследовал эту проблему до поставщика сертификатов, который не является частью доверенных хостов JVM по умолчанию JDK 8u74
. Поставщик www.identrust.com , но это не тот домен, к которому я пытался подключиться. Этот домен получил свой сертификат от этого провайдера. См. Будет ли покрытие через корневой каталог доверять списку по умолчанию в JDK / JRE? - прочитайте пару записей. Также посмотрите, какие браузеры и операционные системы поддерживают Let's Encrypt .
Итак, чтобы подключиться к интересующему меня домену, у которого был выдан сертификат, identrust.com
я сделал следующие шаги. По сути, мне нужно было получить DST Root CA X3
сертификат identrust.com ( ) для доверия со стороны JVM. Я смог сделать это с помощью Apache HttpComponents 4.5 следующим образом:
1: Получите сертификат от недоверенного в Инструкции по загрузке цепочки сертификатов . Нажмите на ссылку DST Root CA X3 .
2. Сохраните строку в файл с именем «DST Root CA X3.pem». Обязательно добавьте в файл строки «----- BEGIN CERTIFICATE -----» и «----- END CERTIFICATE -----» в начале и конце файла.
3. Создайте файл хранилища ключей Java cacerts.jks с помощью следующей команды:
keytool -import -v -trustcacerts -alias IdenTrust -keypass yourpassword -file dst_root_ca_x3.pem -keystore cacerts.jks -storepass yourpassword
4: Скопируйте получившееся хранилище ключей cacerts.jks в каталог ресурсов вашего приложения java / (maven).
5: используйте следующий код, чтобы загрузить этот файл и прикрепить его к Apache 4.5 HttpClient. Это решит проблему для всех доменов, у которых есть сертификаты, выданные indetrust.com
утилитой Oracle. Включение сертификата в хранилище ключей JRE по умолчанию.
SSLContext sslcontext = SSLContexts.custom()
.loadTrustMaterial(new File(CalRestClient.class.getResource("/cacerts.jks").getFile()), "yourpasword".toCharArray(),
new TrustSelfSignedStrategy())
.build();
// Allow TLSv1 protocol only
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
sslcontext,
new String[] { "TLSv1" },
null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLSocketFactory(sslsf)
.build();
Когда проект будет собран, cacerts.jks будет скопирован в путь к классам и загружен оттуда. В данный момент я не тестировал другие ssl-сайты, но если приведенный выше код «цепочек» в этом сертификате, они тоже будут работать, но опять же, я не знаю.
Ссылка: пользовательский контекст SSL и как принять самозаверяющий сертификат с Java HttpsURLConnection?