J'ai pourchassé ce problème à un fournisseur de certificats qui ne fait pas partie des hôtes de confiance JVM par défaut JDK 8u74
. Le fournisseur est www.identrust.com , mais ce n'était pas le domaine auquel j'essayais de me connecter. Ce domaine avait obtenu son certificat de ce fournisseur. Voir Est-ce que la couverture cross root est approuvée par la liste par défaut dans le JDK / JRE? - lisez quelques entrées. Voir également Quels navigateurs et systèmes d'exploitation prennent en charge Let's Encrypt .
Donc, afin de me connecter au domaine qui m'intéressait, qui avait un certificat émis par, identrust.com
j'ai fait les étapes suivantes. Fondamentalement, je devais obtenir le identrust.com (DST Root CA X3
certificat ) pour être approuvé par la JVM. J'ai pu le faire en utilisant Apache HttpComponents 4.5 comme ceci:
1: Obtenez le certificat d'indettrust dans les instructions de téléchargement de la chaîne de certificats . Cliquez sur le lien DST Root CA X3 .
2: enregistrez la chaîne dans un fichier nommé "DST Root CA X3.pem". Assurez-vous d'ajouter les lignes "----- BEGIN CERTIFICATE -----" et "----- END CERTIFICATE -----" dans le fichier au début et à la fin.
3: Créez un fichier de clés Java, cacerts.jks avec la commande suivante:
keytool -import -v -trustcacerts -alias IdenTrust -keypass yourpassword -file dst_root_ca_x3.pem -keystore cacerts.jks -storepass yourpassword
4: Copiez le fichier de clés cacerts.jks résultant dans le répertoire des ressources de votre application java / (maven).
5: Utilisez le code suivant pour charger ce fichier et le joindre à Apache 4.5 HttpClient. Cela résoudra le problème pour tous les domaines pour lesquels des certificats émis par indetrust.com
util oracle incluent le certificat dans le magasin de clés par défaut 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();
Lorsque le projet est généré, le fichier cacerts.jks sera copié dans le chemin de classe et chargé à partir de là. Je n'ai pas, à ce stade, testé contre d'autres sites SSL, mais si le code ci-dessus "chaînes" dans ce certificat alors ils fonctionneront aussi, mais encore une fois, je ne sais pas.
Référence: contexte SSL personnalisé et comment puis-je accepter un certificat auto-signé avec une connexion Java HttpsURLConnection?