Я вирішив цю проблему до постачальника сертифікатів, який не є частиною стандартних хостів 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: Отримайте сертифікат від indettrust в Інструкції з завантаження ланцюжка сертифікатів . Клацніть посилання 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
util 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?