it-swarm.com.de

Proxy kann nicht getunnelt werden. Der Proxy gibt "HTTP / 1.1 407" über https zurück

Ich bin mit einem merkwürdigen Verhalten von Java6/8 konfrontiert. Ich versuche, durch einen Proxy zu tunneln, der eine grundlegende Benutzerauthentifizierung benötigt. Dies geschieht standardmäßig mit dem Java Authenticator. Wenn ich versuche, als erste URL auf eine https-URL zuzugreifen, wird eine Ausnahme ausgelöst:

Java.io.IOException: Durch Proxy kann nicht getunnelt werden. Proxy gibt "HTTP/1.1 407-Proxyauthentifizierung erforderlich" zurück

Wenn ich jedoch zuerst auf eine http-URL und dann auf die https-URL zugreife, funktioniert der https-Zugriff einwandfrei.

Angesichts dieses Codes:

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

Anregungen, Ideen?

17
PPr

Sie müssen die Variablen jdk.http.auth.tunneling.disabledSchemes und jdk.http.auth.proxying.disabledSchemes so bearbeiten, dass sie wie folgt leer bleiben:

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

In meinem Fall habe ich in dieser Datei gefunden

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

21
linhadiretalipe

Änderung in Java 8 Update 111:

Proxys, für die beim Einrichten eines Tunnels für HTTPS eine Standardauthentifizierung erforderlich ist, sind nun standardmäßig nicht mehr erfolgreich. Bei Bedarf kann dieses Authentifizierungsschema reaktiviert werden, indem Basic aus der Netzwerkeigenschaft jdk.http.auth.tunneling.disabledSchemes entfernt oder eine gleichnamige Systemeigenschaft in der Befehlszeile auf "" (leer) gesetzt wird.

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

Deine Optionen:

  • lösen Sie das Problem (aus Sicherheitsgründen), indem Sie das Authentifizierungsschema Ihres Proxys aktualisieren, z. Digest-Zugriffsauthentifizierung
  • oder umgehen Sie das Problem einfach, indem Sie Java with

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