Błędy 407 proxy w Javie: sprawdź uwierzytelnianie Basic dla CONNECT
Ogranicz dane logowania Javy do właściwego proxy i sprawdź osobne zasady JDK dotyczące uwierzytelniania Basic w tunelach HTTPS CONNECT.
Powtarzający się 407 nie zawsze oznacza, że Java wysłała błędne hasło. Implementacja referencyjna JDK zwykle wyłącza uwierzytelnianie Basic dla tuneli HTTPS CONNECT. Proxy oferujące tylko Basic może zostać odrzucone, zanim funkcja zwrotna uwierzytelniania dostarczy dane logowania.
Ogranicz zakres funkcji zwrotnej dostarczającej dane logowania
Przypisz Authenticator do klienta HTTP Javy i ogranicz jego działanie do skonfigurowanego proxy:
String proxyHost = "203.0.113.10";
int proxyPort = 8080;
String password = System.getenv("PROXY_PASSWORD");
if (password == null) {
throw new IllegalStateException("Set PROXY_PASSWORD");
}
java.net.Authenticator auth = new java.net.Authenticator() {
@Override
protected java.net.PasswordAuthentication getPasswordAuthentication() {
if (getRequestorType() == RequestorType.PROXY
&& proxyHost.equals(getRequestingHost())
&& proxyPort == getRequestingPort()) {
return new java.net.PasswordAuthentication(
"proxy-user", password.toCharArray());
}
return null;
}
};
java.net.http.HttpClient client = java.net.http.HttpClient.newBuilder()
.proxy(java.net.ProxySelector.of(
new java.net.InetSocketAddress(proxyHost, proxyPort)))
.authenticator(auth)
.connectTimeout(java.time.Duration.ofSeconds(5))
.build();
To kod konfigurujący jednego klienta, a nie globalny domyślny mechanizm uwierzytelniania. Zastąp adres przeznaczony do dokumentacji i użyj danych rzeczywiście przydzielonych dla tej usługi. Sprawdzanie typu żądającego i punktu końcowego zapobiega pochopnemu przekazaniu konta proxy przez tę samą funkcję zwrotną w odpowiedzi na wyzwanie uwierzytelniania witryny.
Sprawdź, który etap uwierzytelniania zawodzi
JDK ma osobne ustawienia wyłączonych schematów dla zwykłego ruchu HTTP przez proxy i tuneli CONNECT. Odpowiednie nazwy to jdk.http.auth.proxying.disabledSchemes oraz jdk.http.auth.tunneling.disabledSchemes.
Wyjaśnia to, dlaczego uwierzytelnianie ruchu HTTP może działać, a tunel HTTPS przez to samo proxy nie. Sprawdź plik conf/net.properties środowiska wykonawczego i zasady wdrożenia, zamiast zakładać, że na innym komputerze obowiązują te same wartości domyślne.
Globalne opróżnienie listy wyłączonych schematów nie jest uniwersalną naprawą proxy. Danych Basic wysłanych do nieszyfrowanego proxy HTTP nie chroni późniejsze połączenie TLS z celem. Przed zatwierdzeniem zmiany przeanalizuj transport do proxy, metodę uwierzytelniania i zasady wdrożenia.
Udokumentowane działanie wbudowanego uwierzytelniania JDK również nie gwarantuje obsługi każdego schematu ogłaszanego przez proxy. Ręcznie podany nagłówek Authorization lub Proxy-Authorization zmienia automatyczny przebieg uwierzytelniania, więc sprawdź własne nagłówki, jeśli funkcja zwrotna zachowuje się inaczej niż w przykładzie.