Ho inseguito questo problema a un provider di certificati che non fa parte degli host attendibili JVM predefiniti a partire da JDK 8u74
. Il provider è www.identrust.com , ma non era il dominio a cui stavo cercando di connettermi. Quel dominio aveva ottenuto il suo certificato da questo provider. Vedere La copertura della radice incrociata si fida dell'elenco predefinito in JDK / JRE? - leggi un paio di voci. Vedi anche Quali browser e sistemi operativi supportano Let's Encrypt .
Quindi, per connettermi al dominio che mi interessava, che aveva un certificato rilasciato da, identrust.com
ho fatto i seguenti passaggi. Fondamentalmente, ho dovuto ottenere il DST Root CA X3
certificato identrust.com ( ) per essere considerato attendibile dalla JVM. Sono stato in grado di farlo utilizzando Apache HttpComponents 4.5 in questo modo:
1: ottenere il certificato da indettrust in Istruzioni per il download della catena di certificati . Fare clic sul collegamento DST Root CA X3 .
2: Salva la stringa in un file denominato "DST Root CA X3.pem". Assicurati di aggiungere le righe "----- BEGIN CERTIFICATE -----" e "----- END CERTIFICATE -----" nel file all'inizio e alla fine.
3: Crea un file keystore java, cacerts.jks con il seguente comando:
keytool -import -v -trustcacerts -alias IdenTrust -keypass yourpassword -file dst_root_ca_x3.pem -keystore cacerts.jks -storepass yourpassword
4: Copia il keystore cacerts.jks risultante nella directory delle risorse della tua applicazione java / (maven).
5: utilizzare il codice seguente per caricare questo file e allegarlo a Apache 4.5 HttpClient. Questo risolverà il problema per tutti i domini che hanno certificati emessi da indetrust.com
util oracle che include il certificato nell'archivio chiavi predefinito JRE.
SSLContext sslcontext = SSLContexts.custom()
.loadTrustMaterial(new File(CalRestClient.class.getResource("/cacerts.jks").getFile()), "yourpasword".toCharArray(),
new TrustSelfSignedStrategy())
.build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
sslcontext,
new String[] { "TLSv1" },
null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLSocketFactory(sslsf)
.build();
Quando il progetto viene compilato, cacerts.jks verrà copiato nel classpath e caricato da lì. A questo punto non ho provato con altri siti SSL, ma se il codice sopra "concatena" in questo certificato allora funzionerà anche loro, ma ancora una volta, non lo so.
Riferimento: contesto SSL personalizzato e come si accetta un certificato autofirmato con una connessione Java HttpsURLC?