Jak zignorować certyfikat SSL (zaufać wszystkim) dla Apache HttpClient 4.3 ?
Wszystkie odpowiedzi, które znalazłem na SO dotyczą poprzednich wersji, a API się zmieniło.
Związane z:
- Jak zignorować błędy certyfikatów SSL w Apache HttpClient 4.0
- Jak obsługiwać nieprawidłowe certyfikaty SSL za pomocą Apache HttpClient?
- Musisz ufać wszystkim certyfikatom podczas tworzenia aplikacji za pomocą Springa
- Ignoruj błędy certyfikatu SSL w Javie
Edytować:
- Służy tylko do celów testowych. Dzieci, nie próbujcie tego w domu (ani w produkcji)
java
ssl
apache-httpcomponents
Jakub M.
źródło
źródło
SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER
SSLContextBuilder
Idea wyszukuje wiele wywołanych klas .Jeśli używasz procedury PoolingHttpClientConnectionManager powyżej nie działa, niestandardowy SSLContext jest ignorowany. Podczas tworzenia PoolingHttpClientConnectionManager musisz przekazać socketFactoryRegistry w contructor.
źródło
HttpClients.custom().setConnectionManager(cm).build()
iHttpClients.custom().setSSLSocketFactory(connectionFactory).build()
będą działać, więc nie musisz tworzyćPoolingHttpClientConnectionManager
Jako dodatek do odpowiedzi @mavroprovato, jeśli chcesz ufać wszystkim certyfikatom zamiast tylko samopodpisywanym, zrób to (w stylu swojego kodu)
lub (bezpośrednie kopiowanie i wklejanie z mojego własnego kodu):
A jeśli chcesz również pominąć weryfikację nazwy hosta, musisz ustawić
także. (ALLOW_ALL_HOSTNAME_VERIFIER jest przestarzały).
Obowiązkowe ostrzeżenie: naprawdę nie powinieneś tego robić, akceptowanie wszystkich certyfikatów jest złą rzeczą. Istnieją jednak rzadkie przypadki użycia, w których chcesz to zrobić.
Jako uwaga do podanego wcześniej kodu, będziesz chciał zamknąć odpowiedź, nawet jeśli httpclient.execute () zgłosi wyjątek
Powyższy kod został przetestowany przy użyciu
A dla zainteresowanych mój pełny zestaw testowy:
(działający projekt testowy w github )
źródło
Jeden mały dodatek do odpowiedzi przez vasekt:
Rozwiązanie dostarczone z SocketFactoryRegistry działa podczas korzystania z PoolingHttpClientConnectionManager.
Jednak połączenia przez zwykły http nie działają już wtedy. Musisz dodatkowo dodać PlainConnectionSocketFactory dla protokołu http, aby ponownie działały:
źródło
http
protokół jest używanyPlainConnectionSocketFactory
domyślnie. Zarejestrowałem się tylkohttps
ihttpclient
nadal mogę otrzymywać zwykłe adresy URL HTTP. więc nie sądzę, aby ten krok był konieczny.PoolingHttpClientConnectionManager
Po wypróbowaniu różnych opcji następująca konfiguracja działała zarówno dla protokołu http, jak i https:
Używam klienta http 4.3.3:
compile 'org.apache.httpcomponents:httpclient:4.3.3'
źródło
Prostszy i krótszy działający kod:
źródło
Oto destylacja robocza powyższych technik, odpowiednik „curl --insecure”:
źródło
Korzystając z klienta http 4.5 musiałem użyć javasx.net.ssl.HostnameVerifier, aby zezwolić na dowolną nazwę hosta (do celów testowych). Oto, co ostatecznie zrobiłem:
źródło
SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContextBuilder.build(), hostnameVerifierAllowAll);
zSSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContextBuilder.build(), (hostName, sslSession) -> true);
. Pozwala uniknąć anonimowych klas i sprawia, że kod jest trochę bardziej czytelny.Na szczycie
PoolingHttpClientConnectionManager
wraz zRegistry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create().register("https", sslFactory).build();
Jeśli chcesz asynchroniczny httpclient używającPoolingNHttpClientConnectionManager
kodu shoudl być podobny do następującegoźródło
Jeśli używasz
HttpClient 4.5.x
, Twój kod może być podobny do następującego:źródło
źródło
Ufaj wszystkim certyfikatom w kliencie HTTP Apache
źródło
(Dodałbym komentarz bezpośrednio do odpowiedzi vasekt, ale nie mam wystarczającej liczby punktów reputacji (nie jestem pewien, jaka jest tam logika)
W każdym razie ... chciałem powiedzieć, że nawet jeśli nie tworzysz jawnie / nie pytasz o połączenie PoolingConnection, nie oznacza to, że go nie otrzymujesz.
Szalałem, próbując dowiedzieć się, dlaczego oryginalne rozwiązanie nie działa dla mnie, ale zignorowałem odpowiedź vasekt, ponieważ „nie dotyczyło mojego przypadku” - źle!
Wpatrywałem się w mój ślad stosu, gdy był nisko, a oto zobaczyłem połączenie PoolingConnection w środku. Bang - zmęczyłem się jego dodatkiem i sukcesem !! (nasze demo jest jutro i byłem zdesperowany) :-)
źródło
Możesz użyć następującego fragmentu kodu, aby uzyskać wystąpienie HttpClient bez sprawdzania certyfikatu ssl.
źródło
Drobne poprawki, aby odpowiedzieć od @divbyzero powyżej, aby naprawić ostrzeżenia dotyczące bezpieczeństwa sonaru
źródło
Początkowo mogłem wyłączyć dla hosta lokalnego przy użyciu strategii zaufania, później dodałem NoopHostnameVerifier. Teraz będzie działać zarówno dla localhost, jak i dla dowolnej nazwy komputera
źródło