407 Fehler beim Versuch, über einen authentifizierten Proxy in Java auf die HTTPS-Site zuzugreifen

Einführung

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.

Veranstaltung

Hintergrund

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();
        }
}

Phänomen

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.

  1. Legen Sie den Proxy in der Java-Startoption fest
  1. Stellen Sie ein, dass auf die Systemstandards verwiesen wird

Umgebung

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)

Fazit

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.

Problemumgehung

  1. Setzen Sie die JVM-Option jdk.http.auth.tunneling.disabledSchemes =" ".
  1. Verwenden Sie eine andere Bibliothek

Ergänzung

Ich habe versucht, "System.getProperty (" jdk.http.auth.tunneling.disabledSchemes ")" zu sysouten, und das Ergebnis war "null".

Recommended Posts

407 Fehler beim Versuch, über einen authentifizierten Proxy in Java auf die HTTPS-Site zuzugreifen
Lösung, die beim Versuch, mit Java eine Verbindung zu DB (MySQL) herzustellen, einen Fehler verursacht
Zusammenfassung beim Versuch, Solr in Java zu verwenden und eine Fehlermeldung zu erhalten (Solr 6.x)
[Java] Verwenden Sie jsoup, um über einen Proxy, der eine Authentifizierung erfordert, auf HTTPS zuzugreifen
Es wurde ein Fehler behoben, der beim Versuch auftrat, Spark in einer Umgebung zu verwenden, in der Java 8 und Java 11 gleichzeitig vorhanden sind
So beheben Sie den unbekannten Fehler, der bei der Verwendung von slf4j in Java aufgetreten ist
Ich möchte bei der Registrierung in der Datenbank eine Fehlermeldung anzeigen
So übergeben Sie einen Proxy, wenn Sie REST mit SSL in Java auslösen
[Fehlerbehebung] Tritt auf, wenn versucht wird, mit Docker eine Umgebung für den Frühling zu erstellen
Wenn Sie irgendwo einen Fehler melden möchten, wenn Sie graphql-spring-boot mit Spring Boot verwenden
Bei Verwendung einer Liste in Java wird java.awt.List ausgegeben und ein Fehler tritt auf
NoClassDefFoundError trat auf, als versucht wurde, eine Android-Funktion von Unity über jar aufzurufen
Ich möchte eine E-Mail in Java senden.
So lösen Sie Ausdrucksprobleme in Java
Beim Versuch, sbt zu installieren, um eine Scala-Entwicklungsumgebung zu erstellen, ist ein Fehler aufgetreten
Zusammenfassung der Verwendung des im IE festgelegten Proxy-Sets bei der Verbindung mit Java
Wenn Sie Annotation in Java 8 dynamisch ersetzen möchten
Beheben Sie den CreateProcess-Fehler = 206, wenn Sie Java in einer Windows-Umgebung ausführen
Was ist in "Java 8 bis Java 11" passiert und wie wird eine Umgebung erstellt?
Dinge, die Sie beim Schreiben von Code in Java beachten sollten
Dynamisches Wechseln von JDKs beim Erstellen von Java mit Gradle
Ein Fehler tritt auf, wenn codedeploy-agent in Ubuntu Server 20.04 installiert ist
Zeigt einen detaillierten Fehler in Logger an, wenn Java auf dem Server ausgeführt wird
Was tun, wenn beim Versuch, mit Eclipse zu erstellen, ein Fehler in der gemeinsam genutzten JNI-Bibliothek auftritt?
Was tun, wenn beim Installieren von Axios in einem React + Typescript-Projekt ein Fehler auftritt?