Я преследовал эту проблему до поставщика сертификатов, который не является частью доверенных хостов JVM по умолчанию с JDK 8u74
. Поставщик www.identrust.com , но это не тот домен, к которому я пытался подключиться. Этот домен получил свой сертификат от этого провайдера. См. Будет ли доверять перекрестному корню список по умолчанию в JDK / JRE? - прочитать пару записей. Также см. Какие браузеры и операционные системы поддерживают Let Encrypt .
Итак, чтобы подключиться к интересующему меня домену, у которого был выдан сертификат identrust.com
, я сделал следующие шаги. По сути, мне нужно было получить сертификат identrust.com (DST Root CA X3
), которому 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?