使用SSLSocket的SOCKS5代理

时间:2011-04-25 22:09:53

标签: java sockets ssl proxy socks

我有一个客户端/服务器应用程序,通过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方法要求底层套接字已经连接,我的服务器不接受非SSL连接。

使用SOCKS连接到远程服务器的最佳方法是什么?此外,我接下来不知道如何在此系统中为经过身份验证的SOCKS提供用户名/密码。

谢谢!

1 个答案:

答案 0 :(得分:8)

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