使用 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 代理的主要内容,如果未能解决你的问题,请参考以下文章

Https 代理 sslsocket

java开发Socks5代理C/S

C SOCKS5 代理接口未从代理服务器接收任何内容。

怎么开socks5代理,!

虚拟机中使用本机的socks5代理

如何正确认识socks5代理ip