我使用以下java代码在socks代理上创建一个ssl套接字。
SocketAddress addr = new InetSocketAddress(proxy_ip, prox_port);
Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr);
Socket plainSocket = new Socket(proxy);
InetSocketAddress dest = new InetSocketAddress(server_ip, 443);
plainSocket.connect(dest);
socket = (SSLSocket) sslSocketFactory.createSocket(plainSocket, config.getApiHost(), config.getApiPort(), true);
socket.startHandshake();
此代码有效;但我不确定代理数据的客户端是否加密。在wireshark中,我看到只有代理和服务器之间的数据才被加密。任何人都可以说,为什么会这样,我们如何加密客户端和代理之间的数据?
答案 0 :(得分:3)
SOCKS本身不会对任何内容进行加密,也不会破坏任何加密。它所做的只是在客户端和目标服务器之间转发数据而不做任何更改。因此,如果您的数据已经加密,它将保持不变。如果它没有加密,那么它将被打开以进行嗅探和修改,因为SOCKS不会为传输添加任何保护。
在您的特定情况下,您在SOCKS连接中使用SSL,这意味着应用程序数据将以与没有SOCKS代理相同的方式加密:如果您正确使用SSL(强密码,正确的服务器身份验证),它也将是强大的使用SOCKS代理时受保护。如果您无法正确执行SSL(例如未正确验证服务器证书),SOCKS将无助于保护数据。相反,在这种情况下,SOCKS服务器的运营商可能很容易将您的不安全的SSL连接放在中间位置,因为他在网络中处于正确的位置时可以做到这一点。
答案 1 :(得分:1)
已编辑 SOCKS握手未加密。建立上游连接后,代码与上游对等体之间会发生SSL握手,SSL从那里开始端到端。 SOCKS代理不知道它正在经历什么。