Ścigałem ten problem do dostawcy certyfikatu, który nie jest częścią domyślnych zaufanych hostów JVM JDK 8u74
. Dostawcą jest www.identrust.com , ale to nie była domena, z którą próbowałem się połączyć. Ta domena otrzymała certyfikat od tego dostawcy. Zobacz Czy cross-root pokrywa zaufanie domyślną listą w JDK / JRE? - przeczytaj kilka wpisów. Zobacz także Które przeglądarki i systemy operacyjne obsługują Let's Encrypt .
Aby połączyć się z domeną, która mnie zainteresowała, na której wydano certyfikat identrust.com
, wykonałem następujące kroki. Zasadniczo musiałem uzyskać identrust.com (DST Root CA X3
certyfikat ), aby zaufać JVM. Byłem w stanie to zrobić za pomocą Apache HttpComponents 4.5 w następujący sposób:
1: Uzyskaj certyfikat od indettrust w Instrukcji pobierania łańcucha certyfikatów . Kliknij link DST Root CA X3 .
2: Zapisz ciąg do pliku o nazwie „DST Root CA X3.pem”. Należy dodać wiersze „----- ROZPOCZNIJ CERTYFIKAT -----” i „----- KONIEC CERTYFIKAT -----” w pliku na początku i na końcu.
3: Utwórz plik kluczy Java, cacerts.jks, za pomocą następującego polecenia:
keytool -import -v -trustcacerts -alias IdenTrust -keypass yourpassword -file dst_root_ca_x3.pem -keystore cacerts.jks -storepass yourpassword
4: Skopiuj wynikowy plik kluczy cacerts.jks do katalogu zasobów aplikacji java / (maven).
5: Użyj poniższego kodu, aby załadować ten plik i dołączyć go do klienta Apache 4.5 HttpClient. To rozwiąże problem dla wszystkich domen, dla których certyfikaty zostały wydane przez indetrust.com
util oracle, zawiera certyfikat w domyślnym magazynie kluczy 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();
Gdy projekt zostanie skompilowany, plik cacerts.jks zostanie skopiowany do ścieżki klas i załadowany stamtąd. W tym momencie nie testowałem na innych stronach ssl, ale jeśli powyższy kod „łańcuchuje” w tym certyfikacie, to one również będą działać, ale znowu nie wiem.
Odwołanie: niestandardowy kontekst SSL i jak zaakceptować samopodpisany certyfikat za pomocą Java HttpsURLConnection?