使用 SSLSocket 的 SOCKS5 代理
Posted
技术标签:
【中文标题】使用 SSLSocket 的 SOCKS5 代理【英文标题】:SOCKS5 Proxy using SSLSocket 【发布时间】:2011-04-25 22:09:53 【问题描述】:我有一个客户端/服务器应用程序,它通过 Java 的 SSLSocket 远程连接到服务器。
我正在尝试实现一种可选模式,该模式通过经过身份验证的 SOCKS v5 代理启用连接。
我尝试使用relevant tutorial,但它没有具体提及 SSL。
我尝试设置系统范围的属性(“socksProxyHost”和“socksProxyPort”),但它似乎没有做任何事情。
我的下一个方法是在 SSLSocketFactory 中使用工厂方法:
String proxyHost = Config.prefs.get("PROXY_NAME", "localhost");
int proxyPort = Config.prefs.getInt("PROXY_PORT", 1080);
InetSocketAddress proxyAddr = new InetSocketAddress(proxyHost, proxyPort);
Socket underlying = new SSLSocket(new Proxy(Proxy.Type.SOCKS, proxyAddr));
underlying.connect(new InetSocketAddress(getHost(), getPort()));
socket = (SSLSocket) factory.createSocket(
underlying,
getHost(),
getPort(),
true);
但是这种方式的问题是createSocket方法要求底层socket已经连接,我的服务器不接受非SSL连接。
使用 SOCKS 连接到远程服务器的最佳方式是什么?另外,我几乎不知道如何在这个系统中为经过身份验证的 SOCKS 提供用户名/密码。
谢谢!
【问题讨论】:
【参考方案1】: String proxyHost = Config.prefs.get("PROXY_NAME", "localhost");
int proxyPort = Config.prefs.getInt("PROXY_PORT", 1080);
InetSocketAddress proxyAddr = new InetSocketAddress(proxyHost, proxyPort);
Socket underlying = new Socket(new Proxy(Proxy.Type.SOCKS, proxyAddr));
underlying.connect(new InetSocketAddress(getHost(), getPort()));
socket = (SSLSocket) factory.createSocket(
underlying,
proxyHost,
proxyPort,
true);
【讨论】:
即将 proxy 主机和端口传递给套接字构造函数,而不是实际的目标主机和端口。以上是关于使用 SSLSocket 的 SOCKS5 代理的主要内容,如果未能解决你的问题,请参考以下文章