Java-proxyfout 407: controleer Basic-authenticatie voor CONNECT
Beperk Java-inloggegevens tot de proxy en controleer het aparte JDK-beleid voor Basic-authenticatie bij HTTPS-CONNECT-tunnels.
Een herhaalde 407 betekent niet altijd dat Java het verkeerde wachtwoord heeft verstuurd. De referentie-implementatie van de JDK schakelt Basic-authenticatie voor HTTPS-CONNECT-tunnels normaal gesproken uit. Een proxy die alleen Basic aanbiedt, kan worden afgewezen voordat je authenticatiecallback inloggegevens verstrekt.
Beperk het bereik van de callback voor inloggegevens
Koppel een Authenticator aan de Java-HTTP-client en beperk die tot de ingestelde 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();
Dit is instelcode voor één client, geen globale standaardauthenticator. Vervang het documentatieadres en gebruik inloggegevens die daadwerkelijk voor die dienst zijn verstrekt. De controles op het type aanvrager en het eindpunt voorkomen dat dezelfde callback zomaar het proxyaccount aanbiedt bij een authenticatieverzoek van een website.
Controleer welke authenticatiefase mislukt
De JDK heeft aparte instellingen voor uitgeschakelde authenticatieschema's bij gewoon HTTP-proxyverkeer en bij CONNECT-tunnels. De relevante namen zijn jdk.http.auth.proxying.disabledSchemes en jdk.http.auth.tunneling.disabledSchemes.
Dit verklaart waarom HTTP-verkeer wel kan authenticeren terwijl een HTTPS-tunnel via dezelfde proxy mislukt. Controleer conf/net.properties van de runtime en het uitrolbeleid; neem niet aan dat een andere machine dezelfde effectieve standaardwaarden heeft.
Een lijst met uitgeschakelde schema's globaal leegmaken is geen algemene proxyreparatie. Basic-inloggegevens die naar een onversleutelde HTTP-proxy worden gestuurd, worden niet beschermd door de latere TLS-verbinding met de bestemming. Beoordeel het proxytransport, de authenticatiemethode en het uitrolbeleid voordat je een wijziging goedkeurt.
Het gedocumenteerde ingebouwde authenticatiegedrag van de JDK belooft evenmin ondersteuning voor elk schema dat een proxy bekendmaakt. Een handmatig opgegeven Authorization- of Proxy-Authorization-header verandert het automatische authenticatieverloop. Controleer daarom aangepaste headers als de callback anders werkt dan in het voorbeeld.