Java-Proxyfehler 407: Basic-Authentifizierung für CONNECT prüfen
Beschränken Sie Java-Proxy-Zugangsdaten auf den Proxy und prüfen Sie die separate Basic-Authentifizierungsrichtlinie des JDK für HTTPS-CONNECT-Tunnel.
Wiederholte 407 bedeuten nicht immer, dass Java das falsche Passwort gesendet hat. Die JDK-Referenzimplementierung deaktiviert normalerweise Basic-Authentifizierung für HTTPS-CONNECT-Tunnel. Ein Proxy, der nur Basic anbietet, kann abgelehnt werden, bevor Ihr Authentifizierungs-Callback Zugangsdaten liefert.
Den Zugangsdaten-Callback eingrenzen
Hängen Sie einen Authenticator an den Java-HTTP-Client und beschränken Sie ihn auf den konfigurierten 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();
Dies ist Einrichtungscode für einen Client, kein globaler Standard-Authenticator. Ersetzen Sie die Dokumentationsadresse und verwenden Sie tatsächlich für diesen Dienst bereitgestellte Zugangsdaten. Die Prüfung von Anfragertyp und Endpunkt verhindert, dass derselbe Callback das Proxykonto ohne Weiteres einer Website-Authentifizierungsanforderung anbietet.
Prüfen, welche Authentifizierungsstufe scheitert
Das JDK hat getrennte Einstellungen für deaktivierte Verfahren bei gewöhnlicher HTTP-Proxy-Nutzung und CONNECT-Tunneln. Die Namen sind jdk.http.auth.proxying.disabledSchemes und jdk.http.auth.tunneling.disabledSchemes.
Das erklärt, warum HTTP-Verkehr authentifiziert werden kann, während ein HTTPS-Tunnel durch denselben Proxy scheitert. Prüfen Sie conf/net.properties der Laufzeitumgebung und die Bereitstellungsrichtlinie, statt auf einem anderen Rechner dieselben wirksamen Standardwerte anzunehmen.
Eine Liste deaktivierter Verfahren global zu leeren ist keine allgemeine Proxyreparatur. Basic-Zugangsdaten an einen Klartext-HTTP-Proxy werden nicht durch die spätere TLS-Verbindung zum Ziel geschützt. Prüfen Sie den Proxytransport, Authentifizierungsmethode und Bereitstellungsrichtlinie, bevor Sie eine Änderung genehmigen.
Auch das dokumentierte integrierte Authentifizierungsverhalten des JDK verspricht nicht jedes Verfahren zu unterstützen, das ein Proxy anbietet. Ein manuell gesetzter Authorization- oder Proxy-Authorization-Header verändert den automatischen Authenticator-Ablauf. Prüfen Sie eigene Header, wenn sich der Callback anders als im Beispiel verhält.