W aplikacji Apache HttpClient 4 cel HTTPS nie oznacza, że każde połączenie zaczyna się od TLS. Do zwykłego proxy HTTP dociera się przez niezaszyfrowane połączenie, zanim CONNECT otworzy tunel i TLS zostanie nałożony w stronę celu.

Jeśli niestandardowy menedżer połączeń rejestruje tylko https, pierwszy skok przez proxy może się nie powieść z UnsupportedSchemeException: http protocol is not supported.

Dla API 4.5 uwzględnij obie fabryki podczas budowania tego menedżera:

var registry = RegistryBuilder.<ConnectionSocketFactory>create()
    .register("http", PlainConnectionSocketFactory.getSocketFactory())
    .register("https", tlsFactory)
    .build();

var manager = new PoolingHttpClientConnectionManager(registry);
var client = HttpClients.custom()
    .setConnectionManager(manager)
    .setProxy(new HttpHost("proxy.example.net", 8080, "http"))
    .build();

tlsFactory to istniejący SSLConnectionSocketFactory aplikacji z zamierzonym sprawdzaniem zaufania i nazwy hosta. Pokazane typy należą do pakietów org.apache.http Apache 4. Fragment zakłada wnioskowanie typów zmiennych lokalnych w Javie; starszy kod Java może używać jawnych typów.

Podłącz poprawiony menedżer do klienta faktycznie używanego do żądania. Dla dozwolonego publicznego żądania HTTPS bez uwierzytelniania proxy wpis HTTP z listy proxy HTTP może wypełnić adres proxy w HttpHost. Skonfigurowanie innego buildera nie aktualizuje już zbudowanego klienta.

Sprawdź także własność buildera: HttpClientBuilder dokumentuje, że jawnie dostarczony menedżer połączeń może nadpisać jego osobne wejścia konfiguracji SSL. Umieść potrzebne fabryki w rejestrze menedżera, zamiast zakładać, że późniejsze wywołanie setSSLContext zastąpi jego wnętrze.

Ta diagnoza dotyczy lokalnego rejestru schematów. Wyzwanie uwierzytelniania proxy lub odrzucony cel to późniejszy, inny wynik. Zachowaj oba wpisy fabryk, badając te odpowiedzi.

Powiązane artykuły