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

Posted

技术标签:

【中文标题】通过 socks 代理的 SSL 套接字 - 客户端 <---> 服务器数据是不是加密?【英文标题】:SSL Socket over socks proxy - Is client <---> server data encrypted?通过 socks 代理的 SSL 套接字 - 客户端 <---> 服务器数据是否加密? 【发布时间】:2017-11-29 08:53:35 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

但在 Wireshark 中,我只看到 TLSV1.2 数据包在代理和服务器之间传输。应用程序数据显示为已加密。但是在客户端和代理之间,我看到 TCP 数据包正在传输,其中有一个未加密的数据字段。我正在为 SOCKS 服务器使用无字符代理。 @user3202934:您看到 TLS 1.2 消息是因为您在 SOCKS 连接“内部”使用 TLS。 SOCKS 连接实际上只是连接上的一些初始数据,让代理知道在哪里连接以及可能的身份验证。握手之后,原始(TLS)消息被发送,这就是为什么它们也可以在wireshark中看到。【参考方案2】:

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

【讨论】:

我在 Wireshark 中没有看到任何 CONNECT 数据包。我发送的数据是一些自定义数据(不是 HTTP)。

以上是关于通过 socks 代理的 SSL 套接字 - 客户端 <---> 服务器数据是不是加密?的主要内容,如果未能解决你的问题,请参考以下文章

通过 SOCKS5 代理的 SSL 连接

是否存在支持 SSL 的 SOCKS 代理服务器?

没有 SslStream 的 SSL,因为我想通过 SOCKS5 代理连接

使用 SSLSocket 的 SOCKS5 代理

天气 SSL SOCKS5 代理加密的 TCP/IP 标头信息

Java Socks 代理套接字错误