Ab Java 8 Update 111 scheint die Standardeinstellung zu sein, dass die Standardauthentifizierung nicht für das Tunneln verwendet werden kann, wenn eine Verbindung zu HTTPS im Paket "java.net" hergestellt wird. Es scheint notwendig zu sein, eine leere Zeichenfolge in "jdk.http.auth.tunneling.disabledSchemes" zu setzen, um dies zu vermeiden.
Beim Versuch, von der Umgebung innerhalb des authentifizierten Proxys mit Javas java.net.HttpURLConnection
auf die https-Site zuzugreifen, tritt der Fehler 407 Proxy Authentication Required
auf, unabhängig davon, wie die Proxy-Authentifizierungsinformationen angegeben werden. Konnte nicht gelöst werden.
Sample.java
import java.util.*;
import java.net.*;
public class Sample {
private static String PROXY_HOST = "example.proxy.com";
private static String PROXY_PORT = "8080";
private static String PROXY_USER = "user";
private static String PROXY_PASSWORD = "password";
public static void main(String[] args) throws Exception {
String url = "https://news.google.com";
System.setProperty("proxySet", "true");
System.setProperty("proxyHost", PROXY_HOST);
System.setProperty("proxyPort", PROXY_PORT);
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(PROXY_USER, PROXY_PASSWORD.toCharArray());
}
});
HttpURLConnection urlconn = (HttpURLConnection) new URL(url).openConnection();
urlconn.setRequestMethod("GET");
urlconn.connect();
}
}
Wenn ich den obigen Java-Code ausführe, wird folgende Fehlermeldung angezeigt:
$ java Sample
Exception in thread "main" java.io.IOException: Unable to tunnel through proxy. Proxy returns "HTTP/1.1 407 Proxy Authentication Required"
at sun.net.www.protocol.http.HttpURLConnection.doTunneling(HttpURLConnection.java:2124)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:183)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:153)
at Sample.main(Sample.java:25)
Ich habe die folgenden Einstellungen sowie die Einstellungen für den Authentifizierungs-Proxy im Code ausprobiert, aber das Ergebnis ist das gleiche.
java -Dhttp.proxyHost =" example.proxy.com "-Dhttp.proxyPort = 8080 -Dhttp.proxyUser = Benutzer -Dhttp.proxyPassword = Passwort (gleiche Einstellung für https) Beispiel
java -Djava.net.useSystemProxies = true Sample
Das Betriebssystem ist Ubuntu 16.04 und die Java-Version ist wie folgt.
$ java -version
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
Ab 8u111, veröffentlicht im Oktober 2016, kann die Standardauthentifizierung nicht mehr für das Tunneln verwendet werden, wenn als Standardeinstellung eine Verbindung zu HTTPS hergestellt wird.
Java 8 Release-Änderungen (https://www.java.com/de/download/faq/release_changes.xml)
Deaktivieren Sie die Standardauthentifizierung für das HTTPS-Tunneling In einigen Umgebungen können bestimmte Authentifizierungsschemata während des HTTPS-Proxys ungeeignet sein. Daher wird das Standardauthentifizierungsschema in der Oracle Java Runtime standardmäßig deaktiviert, indem der Netzwerkeigenschaft jdk.http.auth.tunneling.disabledSchemes Basic hinzugefügt wird. Proxys, die beim Konfigurieren von HTTPS-Tunneln eine Standardauthentifizierung erfordern, sind standardmäßig nicht mehr erfolgreich. Aktivieren Sie dieses Authentifizierungsschema bei Bedarf erneut, indem Sie Basic aus der Netzwerkeigenschaft jdk.http.auth.tunneling.disabledSchemes entfernen oder die gleichnamige Systemeigenschaft in der Befehlszeile auf "" (leer) setzen. Kann konvertiert werden. Außerdem werden die Systemeigenschaften mit den gleichen Namen wie die Netzwerkeigenschaften jdk.http.auth.tunneling.disabledSchemes und jdk.http.auth.proxying.disabledSchemes beim Konfigurieren des HTTPS-Tunnels bzw. beim Proxying von einfachem HTTP aktiviert. Es kann verwendet werden, um andere möglicherweise vorhandene Authentifizierungsschemata ungültig zu machen. JDK-8160838 (privat)
Wenn Sie sich die englische Version des Versionshinweises ansehen, steht dort "core-libs / java.net". Es scheint eine Änderung des Standardverhaltens beim Herstellen einer Verbindung zu HTTPS mithilfe der Funktionalität der Klassen im Paket "java.net" zu sein.
jdk.http.auth.tunneling.disabledSchemes =" "
.java -Djdk.http.auth.tunneling.disabledSchemes =" "Sample
System.setProperty (" jdk.http.auth.tunneling.disabledSchemes "," ");
Ich habe versucht, "System.getProperty (" jdk.http.auth.tunneling.disabledSchemes ")" zu sysouten, und das Ergebnis war "null".
Recommended Posts