Erreur 407 lors de la tentative d'accès au site HTTPS via un proxy authentifié en Java

introduction

Depuis Java 8 Update 111, il semble que le paramètre par défaut est que l'authentification de base ne peut pas être utilisée pour le tunneling lors de la connexion à HTTPS dans le package java.net. Il semble qu'il soit nécessaire de définir une chaîne de caractères vide dans jdk.http.auth.tunneling.disabledSchemes pour l'éviter.

un événement

Contexte

Lorsque vous essayez d'accéder au site https depuis l'environnement à l'intérieur du proxy authentifié à l'aide de Java java.net.HttpURLConnection, l'erreur 407 Proxy Authentication Required se produit quelle que soit la manière dont les informations d'authentification du proxy sont données. Impossible de résoudre.

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énomène

Lorsque j'exécute le code Java ci-dessus, j'obtiens l'erreur suivante:

$ 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)

J'ai essayé ce qui suit ainsi que les paramètres de proxy d'authentification dans le code, mais le résultat est le même.

  1. Définissez le proxy dans l'option de démarrage Java
  1. Configurer pour faire référence aux paramètres par défaut du système

environnement

Le système d'exploitation est Ubuntu 16.04 et la version Java est la suivante.

$ 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)

Conclusion

À partir de 8u111 publié en octobre 2016, l'authentification de base ne peut plus être utilisée pour le tunneling lors de la connexion via HTTPS comme paramètre par défaut.

Modifications de la version Java 8 (https://www.java.com/en/download/faq/release_changes.xml)

Désactiver l'authentification de base pour le tunnel HTTPS Dans certains environnements, certains schémas d'authentification peuvent être inappropriés lors du proxy HTTPS. Par conséquent, le schéma d'authentification de base est désactivé par défaut dans Oracle Java Runtime en ajoutant Basic à la propriété réseau jdk.http.auth.tunneling.disabledSchemes. Les proxy qui nécessitent une authentification de base lors de la configuration des tunnels HTTPS ne réussiront plus par défaut. Si nécessaire, réactivez ce schéma d'authentification en supprimant Basic de la propriété réseau jdk.http.auth.tunneling.disabledSchemes ou en définissant la propriété système du même nom sur "" (vide) sur la ligne de commande. Peut être converti. En outre, les propriétés système portant les mêmes noms que les propriétés réseau jdk.http.auth.tunneling.disabledSchemes et jdk.http.auth.proxying.disabledSchemes sont activées lors de la configuration du tunnel HTTPS ou lors du proxy HTTP, respectivement. Il peut être utilisé pour invalider d'autres schémas d'authentification qui auraient pu l'être. JDK-8160838 (privé)

Si vous regardez la version anglaise de la note de publication, il est dit «core-libs / java.net». , Cela semble être un changement dans le comportement par défaut lors de la connexion à HTTPS en utilisant la fonctionnalité des classes dans le package java.net.

solution de contournement

  1. Définissez l'option JVM jdk.http.auth.tunneling.disabledSchemes =" ".
  1. Utilisez une autre bibliothèque

Supplément

J'ai essayé sysout System.getProperty (" jdk.http.auth.tunneling.disabledSchemes ") et le résultat était null.

Recommended Posts

Erreur 407 lors de la tentative d'accès au site HTTPS via un proxy authentifié en Java
Solution qui donne une erreur lors de la tentative de connexion à DB (MySQL) avec Java
Résumé en essayant d'utiliser Solr en Java et en obtenant une erreur (Solr 6.x)
[Java] Utilisez jsoup pour accéder à HTTPS via un proxy nécessitant une authentification
Résolution d'une erreur survenue lors de la tentative d'utilisation de Spark dans un environnement où Java 8 et Java 11 coexistent
Comment résoudre l'erreur inconnue apparue lors de l'utilisation de slf4j en Java
Je souhaite afficher un message d'erreur lors de l'inscription dans la base de données
Comment passer un proxy lors du lancement de REST avec SSL en Java
[Résolution d'erreur] Se produit lors de la tentative de création d'un environnement pour le printemps avec docker
Lorsque vous souhaitez notifier une erreur quelque part lors de l'utilisation de graphql-spring-boot avec Spring Boot
Lors de l'utilisation d'une liste en Java, java.awt.List sort et une erreur se produit
NoClassDefFoundError s'est produit lors de la tentative d'appel d'une fonction Android à partir de Unity via jar
Je souhaite envoyer un e-mail en Java.
Comment résoudre les problèmes d'expression en Java
J'ai eu une erreur en essayant d'installer sbt pour créer un environnement de développement Scala
Résumé de l'utilisation du jeu de proxy dans IE lors de la connexion avec Java
Lorsque vous souhaitez remplacer dynamiquement l'annotation dans Java 8
Résoudre l'erreur CreateProcess = 206 lors de l'exécution de Java dans un environnement Windows
Que s'est-il passé dans «Java 8 to Java 11» et comment créer un environnement
Éléments à prendre en compte lors de l'écriture de code en Java
Comment changer dynamiquement les JDK lors de la construction de Java avec Gradle
Une erreur se produit lorsque codedeploy-agent est installé dans Ubuntu Server 20.04
Afficher une erreur détaillée dans Logger lors de l'exécution de Java sur le serveur
Que faire si vous obtenez une erreur de bibliothèque partagée JNI lorsque vous essayez de créer avec Eclipse