如何配置HTTPClient以对SOCKS代理进行身份验证?

时间:2009-09-07 11:08:13

标签: java http proxy apache-commons-httpclient

我需要针对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 代理,还是我必须做一些不同的事情?

5 个答案:

答案 0 :(得分:6)

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

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

e.g。

java -DsocksProxyHost=socks.mydomain.com

编辑)对于您的示例,如果使用之前概述的方式配置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

答案 1 :(得分:4)

原生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身份验证,代理身份验证)。

答案 2 :(得分:3)

Apache HTTPClient的Features page说:

  

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

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

答案 3 :(得分:3)

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

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

另一个可能的解决方案是我个人最喜欢的解决方案是将一个包装器HTTP代理写入socks代理。

答案 4 :(得分:1)

我试过

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

它工作正常。