Comment ignorer le certificat SSL (tout faire confiance) pour Apache HttpClient 4.3 ?
Toutes les réponses que j'ai trouvées sur SO traitent des versions précédentes, et l'API a changé.
En relation:
- Comment ignorer les erreurs de certificat SSL dans Apache HttpClient 4.0
- Comment gérer les certificats SSL invalides avec Apache HttpClient?
- Besoin de faire confiance à tous les certificats pendant le développement en utilisant Spring
- Ignorer les erreurs de certificat SSL avec Java
Éditer:
- Ce n'est qu'à des fins de test. Les enfants, ne l'essayez pas à la maison (ou en production)
la source
SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER
SSLContextBuilder
sont trouvées par Idea.Si vous utilisez la procédure PoolingHttpClientConnectionManager ci-dessus ne fonctionne pas, SSLContext personnalisé est ignoré. Vous devez passer socketFactoryRegistry dans contructor lors de la création de PoolingHttpClientConnectionManager.
la source
HttpClients.custom().setConnectionManager(cm).build()
etHttpClients.custom().setSSLSocketFactory(connectionFactory).build()
fonctionneront, vous n'avez donc pas besoin de créer unPoolingHttpClientConnectionManager
En plus de la réponse de @mavroprovato, si vous voulez faire confiance à tous les certificats au lieu de simplement auto-signés, vous le feriez (dans le style de votre code)
ou (copier-coller direct à partir de mon propre code):
Et si vous souhaitez également ignorer la vérification du nom d'hôte, vous devez définir
ainsi que. (ALLOW_ALL_HOSTNAME_VERIFIER est obsolète).
Avertissement obligatoire: vous ne devriez pas vraiment faire cela, accepter tous les certificats est une mauvaise chose. Cependant, il existe de rares cas d'utilisation où vous souhaitez le faire.
Comme note au code précédemment donné, vous voudrez fermer la réponse même si httpclient.execute () lève une exception
Le code ci-dessus a été testé en utilisant
Et pour les intéressés, voici mon ensemble de tests complet:
(projet de test de travail dans github )
la source
Un petit ajout à la réponse de vasekt:
La solution fournie avec SocketFactoryRegistry fonctionne lors de l'utilisation de PoolingHttpClientConnectionManager.
Cependant, les connexions via http simple ne fonctionnent plus alors. Vous devez ajouter un PlainConnectionSocketFactory pour le protocole http en plus pour les faire fonctionner à nouveau:
la source
http
protocole utilisePlainConnectionSocketFactory
par défaut. Je ne me suis inscrit quehttps
et jehttpclient
peux toujours obtenir des URL HTTP simples. donc je ne pense pas que cette étape soit nécessaire.PoolingHttpClientConnectionManager
Après avoir essayé diverses options, la configuration suivante a fonctionné pour http et https
J'utilise http-client 4.3.3 -
compile 'org.apache.httpcomponents:httpclient:4.3.3'
la source
Code de travail plus simple et plus court:
la source
Voici une distillation fonctionnelle des techniques ci-dessus, équivalente à "curl --insecure":
la source
Lors de l'utilisation du client http 4.5, j'ai dû utiliser javasx.net.ssl.HostnameVerifier pour autoriser n'importe quel nom d'hôte (à des fins de test). Voici ce que j'ai fini par faire:
la source
SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContextBuilder.build(), hostnameVerifierAllowAll);
parSSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContextBuilder.build(), (hostName, sslSession) -> true);
. Cela évite les classes anonymes et rend le code un peu plus lisible.En plus de
PoolingHttpClientConnectionManager
long avecRegistry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create().register("https", sslFactory).build();
Si vous souhaitez un asynchrone httpclient en utilisantPoolingNHttpClientConnectionManager
le code shoudl similaire à la suitela source
Si vous utilisez
HttpClient 4.5.x
, votre code peut être similaire à ce qui suit:la source
la source
Faire confiance à tous les certificats dans le client HTTP Apache
la source
(J'aurais ajouté un commentaire directement à la réponse de vasekt mais je n'ai pas assez de points de réputation (je ne suis pas sûr de la logique)
Quoi qu'il en soit ... ce que je voulais dire, c'est que même si vous ne créez pas / ne demandez pas explicitement un PoolingConnection, cela ne signifie pas que vous n'en obtenez pas.
Je devenais fou en essayant de comprendre pourquoi la solution originale ne fonctionnait pas pour moi, mais j'ai ignoré la réponse de vasekt car elle "ne s'appliquait pas à mon cas" - faux!
Je regardais ma trace de pile quand j'étais bas et voici, j'ai vu un PoolingConnection au milieu. Bang - J'ai fatigué son ajout et son succès !! (notre démo est demain et je devenais désespéré) :-)
la source
Vous pouvez utiliser l'extrait de code suivant pour obtenir l'instance HttpClient sans vérification de certification SSL.
la source
Légère modification de la réponse de @divbyzero ci-dessus pour corriger les avertissements de sécurité du sondeur
la source
Au départ, j'ai pu désactiver pour localhost en utilisant la stratégie de confiance, plus tard j'ai ajouté NoopHostnameVerifier. Maintenant, cela fonctionnera à la fois pour l'hôte local et pour tout nom de machine
la source