【问题标题】:How can I configure HTTPClient to authenticate against a SOCKS proxy?如何配置 HTTPClient 以针对 SOCKS 代理进行身份验证?
【发布时间】:2009-09-07 11:08:12
【问题描述】:

我需要针对 SOCKS 代理设置代理身份验证。 我发现 this post 给出的说明似乎可以与常见的 HTTP 代理一起使用。

        httpclient.getHostConfiguration().setProxy("proxyserver.example.com", 8080);

        HttpState state = new HttpState();
        state.setProxyCredentials(new AuthScope("proxyserver.example.com", 8080), 
           new UsernamePasswordCredentials("username", "password"));
        httpclient.setState(state);

这是否也适用于 SOCKS 代理,还是我必须做一些不同的事情?

【问题讨论】:

    标签: java http proxy apache-commons-httpclient


    【解决方案1】:

    Java 通过首选项支持 Socks 代理配置:

    • socksProxyHost 为 SOCKS 代理服务器的主机名
    • socksProxyPort为端口号,默认为1080

    例如

    java -DsocksProxyHost=socks.mydomain.com
    

    (edit) 以您的示例为例,如果 socks 代理按照前面所述的方式进行配置:

    httpclient.getHostConfiguration().setProxy("proxyserver.example.com", 8080);
    Credentials cred = new UsernamePasswordCredentials("username","password");
    httpclient.getState().setProxyCredentials(AuthScope.ANY, cred); 
    

    你也可以使用这个变种(不带httpclient):

    SocketAddress addr = new
    InetSocketAddress("webcache.mydomain.com", 8080);
    Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr); // Type.HTTP for HTTP
    

    所以完成前面的例子,我们现在可以添加:

    URL url = new URL("http://java.sun.com/");
    URConnection conn = url.openConnection(proxy);
    

    HTH

    【讨论】:

      【解决方案2】:

      Apache HTTPClient 的Features page 说:

      使用原生 Java 套接字支持通过 SOCKS 代理(版本 4 和 5)进行透明连接。

      对于“透明”,我猜他们的意思是它可以在你不需要做任何特别的事情的情况下工作。你在某处有可用的 SOCKS 代理吗?你不能试试看它是否有效吗?

      【讨论】:

      • 我无法在我的工作场所安装 SOCKS 代理,但我很快会在客户站点进行测试。谢谢
      【解决方案3】:

      HttpClient 3 本身不支持 SOCKS。您可以按照其他人的建议尝试 JDK 中的 SOCKS 支持。副作用是您的整个 JVM 将通过相同的 SOCKS 代理。

      Java 5 支持 SOCKS(类型 2)中的用户名/密码验证。您所要做的就是像这样设置身份验证器,

      Authenticator.setDefault(new Authenticator() {
          protected PasswordAuthentication getPasswordAuthentication() {
              return new PasswordAuthentication(username, password.toCharArray());
          }
      });
      

      同样,这可能对您不起作用,因为它会影响 JVM 中的所有身份验证(HTTP 身份验证、代理身份验证)。

      【讨论】:

        【解决方案4】:

        您可以提供实现 SOCKS 协议的自定义套接字工厂,并将其注册为您的默认 HTTP 协议处理程序。该解决方案的限制类似于上面 tuergeist 的答案 - 它适用于全局,适用于您将通过 HttpClient 建立的任何 HTTP 连接。

        如果您发现这是一个问题,请查看 this correspondence,其中 Oleg 建议使用 HttpClient 4.0,但也指的是 HttpClient 3.x 的 HostConfiguration 类中可能存在的补丁。

        另一种可能的解决方案是我个人最喜欢的,它是为 socks 代理编写一个包装 HTTP 代理。

        【讨论】:

        • 链接好像失效了
        【解决方案5】:

        我试过了

        System.setProperty("socksProxyHost", "socks.xyz.com");
        System.setProperty("socksProxyPort", "1000");
        

        它工作正常。

        【讨论】:

        • 如果你在 Tomcat 中这样做,它会为整个 Tomcat JVM 设置属性。其他应用可能不希望这样。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-03
        • 2018-11-16
        • 1970-01-01
        • 2018-01-18
        相关资源
        最近更新 更多