socks 代理上的 SSL 套接字 - 客户端 <---> 服务器数据是否加密?

SSL Socket over socks proxy - Is client <---> server data encrypted?

我正在使用以下 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 中,我看到只有代理和服务器之间的数据被加密。谁能告诉我,为什么会这样,我们如何加密客户端和代理之间的数据?

已编辑 SOCKS 握手未加密。建立上游连接后,您的代码与上游对等点之间会发生 SSL 握手,SSL 从那里开始是端到端的。 SOCKS 代理不知道发生了什么。

SOCKS 本身不会加密任何东西,也不会破坏任何加密。它所做的只是在不做任何更改的情况下在客户端和目标服务器之间转发数据。因此,如果您的数据已经加密,它将保持不变。如果它没有加密,那么它将被打开以供嗅探和修改,因为 SOCKS 不会为传输添加任何保护。

在您的特定情况下,您在 SOCKS 连接中使用 SSL,这意味着应用程序数据将以与没有 SOCKS 代理的情况相同的方式加密:如果您正确使用 SSL(强密码、正确的服务器身份验证),它也会使用 SOCKS 代理时受到严格保护。相反,如果您未能正确执行 SSL(例如未正确验证服务器证书),SOCKS 将无助于保护数据。相反,在这种情况下,SOCKS 服务器的操作员可能很容易将您的不安全 SSL 连接置于中间,因为他已经在网络中处于正确的位置来执行此操作。