Ignorer les certificats auto-signés dans Apache HTTPClient 4.5
Je suis en train de accepter tous les certificats et/ou d'accepter des certificats auto-signés à l'aide de Apache HTTPClient version 4.5 (tutoriel lien ici)
J'ai été en passant par des solutions à ce problème à partir d'un tas de posts sur. Pour l'instant aucun d'entre eux ont travaillé.
Je reçois cette erreur: Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
Apache Docs:
- Apache v4.5 tutoriel
- SSL/TLS de personnalisation
- Apache a un guide pour la version 3, mais pas la version 4.
Liées StackOverflow Questions - Voici quelques liens des solutions que j'ai essayé:
- Ignorant certificat SSL dans Apache HttpClient 4.3
- Comment ignorer certificat SSL erreurs dans Apache HttpClient 4.0
- Ignorer Certificat SSL Erreurs avec Java
- Besoin de faire confiance à tous les certificats au cours du développement à l'aide de Printemps
- Comment gérer les certificats SSL non valides avec Apache HttpClient?
Noter que dans tous ces exemples, je suis également le passage d'un cookie magasin et un proxy informations d'identification fournisseur que j'ai défini plus haut. Ce sont de travail, je suis juste essayer d'ajouter le support de SSL.
Essayer #1
Créer mon propre ssl contexte avec SSLContextBuilder
et de faire confiance à tous les auto-signé stratégies avec TrustSelfSignedStrategy
.
SSLContextBuilder sshbuilder = new SSLContextBuilder();
sshbuilder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sshbuilder.build());
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCredentialsProvider(credsProvider)
.setDefaultCookieStore(cookieStore)
.setSSLSocketFactory(sslsf)
.build();
RÉSULTAT: N'a pas fonctionné. Obtenu Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
Essayer #2
Même que ci-dessus, mais ajouter un PoolingHttpClientConnectionManager
SSLContextBuilder builder = new SSLContextBuilder();
builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build(),SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", new PlainConnectionSocketFactory())
.register("https", sslsf)
.build();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
cm.setMaxTotal(2000);//max connection
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCredentialsProvider(credsProvider)
.setDefaultCookieStore(cookieStore)
.setSSLSocketFactory(sslsf)
.setConnectionManager(cm)
.build();
RÉSULTAT: N'a pas fonctionné. Obtenu Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
Essayer #3
Simplement accepter TOUS les certificats en remplaçant la TrustStrategy
(ce n'est pas recommandé)
SSLContextBuilder builder = new SSLContextBuilder();
builder.loadTrustMaterial(null, new TrustStrategy() {
@Override
public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
return true;
}
});
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build(),
SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCredentialsProvider(credsProvider)
.setDefaultCookieStore(cookieStore)
.setSSLSocketFactory(sslsf)
.build();
RÉSULTAT: N'a pas fonctionné. Obtenu Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
Essayer #4
J'ai trouvé quelque chose d'utile à partir de cette réponse:
À partir de la version 4.5 HttpClient désactive le protocole SSLv3 version par
par défaut
Voici la solution qu'il a donné:
SSLContext sslcontext = SSLContexts.createSystemDefault();
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
sslcontext, new String[] { "TLSv1", "SSLv3" }, null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.INSTANCE)
.register("https", sslConnectionSocketFactory)
.build();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
httpclient = HttpClients.custom()
.setDefaultCredentialsProvider(credsProvider)
.setDefaultCookieStore(cookieStore)
.setSSLSocketFactory(sslConnectionSocketFactory)
.setConnectionManager(cm)
.build();
RÉSULTAT: N'a pas fonctionné. Obtenu Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
OriginalL'auteur Katie S | 2016-10-07
Vous devez vous connecter pour publier un commentaire.
L'une des méthodes ci-dessus devrait fonctionner dans le cas de certificats auto-signés, mais la chose étrange est que vous obtenez même une exception dans toutes les approches.
Je me sens au cours de la session SSL de l'établissement ou de handshake protocole n'est pas accepté par le client ou par le serveur.
La meilleure solution est ici pour déboguer l'application.
En cas de tomcat, ajouter -Djavax.net.debug=tous les dans setenv.sh ou setenv.les fichiers bat, puis redémarrez le serveur.
Ou vous pouvez suivre ce tutoriel.
L'OP a juste besoin de changer le port lors de la connexion SSL:
OriginalL'auteur Azim
J'utilise Apache HttpClient 4.5.3 et aucune des solutions ci-dessus aidé. J'ai toujours eu de l'erreur
.
J'ai trouvé la solution dans http://www.baeldung.com/httpclient-ssl
Voici mon code:
OriginalL'auteur Martin Pabst
Très souvent, vous avez besoin non seulement de soutenir les certificats auto-signés, mais également invoquer le multi-thread demandes, et donc d'utiliser une mise en commun du gestionnaire de connexion. Voici comment je le fais:
OriginalL'auteur Yaniv Nahoum
OriginalL'auteur Oleg Maksymuk