如何使用HTTP代理发送Socks请求?

4
我开发了一个名为Tun2Socks GUI的应用程序。它是一个可以使Socks代理透明化的程序。
通常情况下,它使用SSH端口转发或TOR作为SOCKS服务,但我希望它也可以使用HTTP代理。因此,我自己构建了一个连接到该HTTP代理的SOCKS5代理。它能够很好地捕获从客户端发送到HTTP代理的HTTP请求。
问题在于,当客户端发送SSL请求时,我无法捕获该请求进行转发。最佳方法如何使SOCKS代理通过HTTP代理发出SSL请求?
请求传输的架构如下: 客户端SSL请求 > SOCKS代理 > HTTP代理 > 互联网 谢谢。
1个回答

4
当客户端有意通过代理与目标服务器建立SSL会话时,它不会与代理本身建立SSL会话。客户端首先告诉代理建立到目标服务器的连接,然后客户端才启动与目标服务器的SSL会话。在这种情况下,代理无法嗅探流量,因为它是加密的,也不应该尝试这样做。代理只是一个通道,根据需要在客户端和服务器之间交换原始数据。代理不应关心客户端发送的请求类型,因为客户端告诉代理要连接哪里。
如果您已经将代理插入客户端和服务器之间,并且客户端不知道您的代理存在,那么客户端将不知道它需要调整其请求以使它们适合代理。客户端将连接到您的代理,但它会认为它连接到目标服务器,因此将启动SSL握手,您的代理将必须对其进行响应。只有在握手成功(例如,如果客户端未验证对等证书)的情况下,您的代理才能访问客户端的请求数据,然后根据需要将未加密的数据隧道传输到下一个代理。 更新:我刚想到另一种情况,适用于明文和SSL连接。无论您是在客户端不知道的情况下透明地重定向客户端的出站连接到SOCKS代理,还是客户端有意连接到SOCKS代理并告诉它要去哪里,SOCKS代理都知道客户端的目标主机/IP:端口。SOCKS代理可以直接连接到目标,也可以连接到HTTP代理,并要求通过HTTP CONNECT 方法创建到目标的隧道。如果成功,客户端就有了与目标的可行连接,客户端发送的任何数据(包括SSL)都将原样流向目标,反之亦然。SOCKS代理和HTTP代理都不需要知道客户端请求的任何信息,除了目标主机/IP:端口。这在初始的SOCKS请求中,可以从拦截的TCP头捕获,或者由客户端明确指定。

如果它只是通过SOCKS代理作为网关传递流量,我会说是的。但问题是我需要从SOCKS代理中也通过HTTP代理传递流量请求。HTTP代理服务器无法识别请求,因此无法建立与正确服务器目标的连接。 - user3444404
听起来你可能不完全理解HTTP代理的工作原理。也许你不知道CONNECT方法,或者不知道如何正确使用它。 - Remy Lebeau
我确实知道如何使用CONNECT方法。但是在我的SOCKS项目中,我无法捕获来自客户端的SSL请求数据包(仅限SSL数据包)。 对于另一个请求,我修改了头部命令,因为来自客户端的真实头部被SOCKS代理生成,而HTTP代理无法接受它。这是我的完整源代码项目: http://davidlorem.7uw.net/?258ceb85e3/davisocks.dpr请检查下面的一个过程,其中存在问题:procedure SocksProc(sock: Cardinal); stdcall; - user3444404
1
代理无法拦截SSL加密内容。客户端只有在与目标服务器的隧道创建后才创建SSL会话,因此只有目标服务器可以解密它。这确保了客户端和目标之间的加密完整性,并避免了中间人攻击(您是MITM)。拦截SSL内容的唯一方法是充当客户端与目标服务器通信的目标服务器,因此您需要与客户端建立自己的SSL会话,然后作为自己的客户端使用单独的SSL会话将数据转发到另一个服务器。例如,这就是Fiddler拦截HTTPS的方式。 - Remy Lebeau
@RemyLebeau,那么像目标服务器一样行事是TOR节点可以做到的吗?还是这个过程是基于“每个服务器网站”的方案的?除非目标域名被劫持并且目标服务器证书被复制,否则似乎不可能发生这种劫持。 - user952503
@EDENDEKKER 我不了解 TOR 的工作原理。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接