web-dev-qa-db-fra.com

Impossible d'établir un tunnel via un proxy. Le proxy renvoie «HTTP / 1.1 407» via https

Je suis confronté à un comportement curieux de Java6/8. J'essaie de passer par un proxy qui requiert une authentification d'utilisateur de base. Faire cela par le standard Java Authenticator. Si j'essaie d'accéder à une URL https en tant que première URL, une exception est levée:

Java.io.IOException: impossible de tunneler via un proxy. Le proxy renvoie "Authentification du proxy HTTP/1.1 407 requise"

Mais si j'accède d'abord à une URL http, puis à l'URL https, l'accès https fonctionne correctement.

Étant donné ce code:

import Java.io.BufferedReader;
import Java.io.IOException;
import Java.io.InputStream;
import Java.io.InputStreamReader;
import Java.net.Authenticator;
import Java.net.HttpURLConnection;
import Java.net.InetSocketAddress;
import Java.net.PasswordAuthentication;
import Java.net.Proxy;
import Java.net.URL;

public class ProxyPass {
    public ProxyPass( String proxyHost, int proxyPort, final String userid, final String password, String url ) {

    try {
            /* Create a HttpURLConnection Object and set the properties */
            URL u = new URL( url );
            Proxy proxy = new Proxy( Proxy.Type.HTTP, new InetSocketAddress( proxyHost, proxyPort ) );
            HttpURLConnection uc = (HttpURLConnection) u.openConnection( proxy );

            Authenticator.setDefault( new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    if (getRequestorType().equals( RequestorType.PROXY )) {
                        return new PasswordAuthentication( userid, password.toCharArray() );
                    }
                    return super.getPasswordAuthentication();
                }
            } );
            uc.connect();
            /* Print the content of the url to the console. */
            showContent( uc );
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void showContent( HttpURLConnection uc ) throws IOException {
        InputStream i = uc.getInputStream();
        char c;
        InputStreamReader isr = new InputStreamReader( i );
        BufferedReader br = new BufferedReader( isr );
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println( line );
        }
    }

    public static void main( String[] args ) {
        String proxyhost = "proxyHost";
        int proxyport = proxyPort;
        final String proxylogin = proxyUser;
        final String proxypass = proxyPass;

        String url = "http://www.google.de";
        String surl = "https://www.google.de";

//            new ProxyPass( proxyhost, proxyport, proxylogin, proxypass, url );  // uncomment this line to see that the https request works!
//            System.out.println( url + " ...ok" );   // uncomment this line to see that the https request works!
        new ProxyPass( proxyhost, proxyport, proxylogin, proxypass, surl );
        System.out.println( surl + " ...ok" );
    }

Des suggestions, des idées?

17
PPr

Vous devez éditer les variables jdk.http.auth.tunneling.disabledSchemes et jdk.http.auth.proxying.disabledSchemes à blanc comme ceci:

jdk.http.auth.tunneling.disabledSchemes=
jdk.http.auth.proxying.disabledSchemes=

Dans mon cas, j'ai trouvé dans ce fichier

jdk1.8.0_111/jre/lib/net.properties

21
linhadiretalipe

Changement dans Java 8 Mise à jour 111:

Désormais, les mandataires nécessitant une authentification de base lors de la configuration d'un tunnel pour HTTPS ne réussiront plus par défaut. Si nécessaire, ce schéma d'authentification peut être réactivé en supprimant Basic de la propriété réseau jdk.http.auth.tunneling.disabledSchemes ou en définissant une propriété système du même nom sur "" (vide) sur la ligne de commande.

http://www.Oracle.com/technetwork/Java/javase/8u111-relnotes-3124969.html

Vos options:

  • résolvez le problème (dans un souci de sécurité) en mettant à niveau le schéma d'authentification de votre proxy, par exemple. digérer l'authentification d'accès
  • ou simplement contourner le problème en exécutant Java avec

    Java -Djdk.http.auth.tunneling.disabledSchemes=""
    
35
Marcus