代码之家  ›  专栏  ›  技术社区  ›  PPr

无法通过代理进行隧道传输。代理通过https返回HTTP/1.1 407

  •  30
  • PPr  · 技术社区  · 8 年前

    我面临着java6/8的一种奇怪行为。 我尝试通过需要基本用户身份验证的代理进行隧道传输。 这是通过标准java验证器实现的。 如果尝试访问https url作为第一个url,则会引发异常:

    java.io。IOException:无法通过代理进行隧道传输。代理返回“需要HTTP/1.1 407代理身份验证”

    但是,如果我先访问http URL,然后访问https URL,则https访问工作正常。

    鉴于该代码:

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

    有什么建议吗?

    3 回复  |  直到 8 年前
        1
  •  46
  •   Marcus    7 年前

    Java 8更新111中的更改:

    现在,设置隧道时需要基本身份验证的代理 默认情况下,for HTTPS将不再成功。如果需要 身份验证方案可以通过从 jdk.http.auth.tunneling。disabledSchemes网络属性,或 在上将同名的系统属性设置为“”(空) 命令行。

    http://www.oracle.com/technetwork/java/javase/8u111-relnotes-3124969.html

    您的选择:

    • 通过升级代理的身份验证方案来解决问题(出于安全考虑), e、 g.摘要访问认证
    • 或者只是通过使用运行Java来解决这个问题

      java -Djdk.http.auth.tunneling.disabledSchemes=""
      
        2
  •  35
  •   abarisone    7 年前

    您必须编辑变量 jdk.http.auth.tunneling.disabledSchemes jdk.http.auth.proxying.disabledSchemes 像这样空白:

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

    在我的情况下,我在这个文件中找到

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

        3
  •  2
  •   Apostolos Nirjal Mahat    5 年前

    这可能有帮助:

    System.setProperty("jdk.http.auth.tunneling.disabledSchemes", "false");
    System.setProperty("jdk.http.auth.proxying.disabledSchemes", "false");