[英]How to forward HTTPS traffic from a SOCKS proxy to HTTP proxy
我已经编写了一个SOCKS代理,如果链接已关闭,该代理可与HTTP和HTTPS通信同时使用。
如果启用了链接并且转发主机和端口属于过滤的HTTP代理,则仅HTTP流量可以流动。 HTTPS通信不流动,并报告SSL错误。
请注意,当请求直接来自浏览器而不是来自SOCKS服务器时,HTTP代理确实处理HTTPS通信。
例如,如果我向https://www.google.com发出请求,则会发生以下情况:
1)客户端发送一个SOCKS 5问候语,让我们知道哪些auth方法是可以接受的。
2)服务器以NO_AUTH响应
3)客户端发送一个连接请求(包括预期的目标主机和端口)。
4)服务器创建套接字并将其连接到HTTP代理服务器,并使用GRANTED响应客户端
5)然后,SOCKS服务器收到以下请求(不可见/控制字符已全部替换为其字符代码,因此您可以查看正在发生的情况):
\u0016\u0003\u0001\u0000Ñ\u0001\u0000\u0000Í\u0003\u0003áp¥@Ia¹\u0001„Ä\u0006 É;š‰‰4\u001dýà•J>Ü6¢Þ\fö\u001c%\u0000\u0000(À+À/\u0000žÌ\u0014Ì\u0013À\nÀ\tÀ\u0013À\u0014À\u0007À\u0011\u00003\u00002\u00009\u0000œ\u0000/\u00005\u0000\n\u0000\u0005\u0000\u0004\u0001\u0000\u0000|\u0000\u0000\u0000\u0013\u0000\u0011\u0000\u0000\u000ewww.google.comÿ\u0001\u0000\u0001\u0000\u0000\n\u0000\b\u0000\u0006\u0000\u0017\u0000\u0018\u0000\u0019\u0000\u000b\u0000\u0002\u0001\u0000\u0000#\u0000\u00003t\u0000\u0000\u0000\u0010\u0000\u001b\u0000\u0019\u0006spdy/3\bspdy/3.1\bhttp/1.1uP\u0000\u0000\u0000\u0005\u0000\u0005\u0001\u0000\u0000\u0000\u0000\u0000\u0012\u0000\u0000\u0000\r\u0000\u0012\u0000\u0010\u0004\u0001\u0005\u0001\u0002\u0001\u0004\u0003\u0005\u0003\u0002\u0003\u0004\u0002\u0002\u0002
如您所见,它完全不可读,但是我们已经从初始SOCKS连接消息(步骤3)中知道了用户打算去哪里,因此我们可以创建并发出以下连接请求:
CONNECT www.google.com:443 HTTP/1.1\r\nUser-Agent: MySocksServer\r\nProxy-Connection: keep-alive\r\nHost: www.google.com\r\n\r\n
6)这个新构建的CONNECT发送到我们链接到的HTTP代理,该代理检查其过滤规则并响应:
HTTP/1.1 200 Connection Established\r\nVia: 1.1 HTTPserverName\r\nX-WebMarshal-RequestID: AN_ID_STRING\r\n\r\n
7)这是在我们的SOCKS服务器中接收的,并转发(未修改)给客户端。 在调试中,我正在发送请求之前直接监视套接字,并且可以看到客户端套接字已连接。
8)引发的下一个事件是错误,错误SOCKET_NOT_CONNECTED,在套接字上运行另一个检查,确认客户端套接字确实不再连接。
为什么在这里的步骤7和步骤8之间我的套接字会关闭? 我是否没有正确遵守协议? 我看不到我想念的东西。 我想我以某种方式处理了CONNECT方法错误?
如果我不修改SOCKS服务器收到的请求(即将其转换为CONNECT请求),而是直接将不可读的数据转发到HTTP代理,则HTTP代理的日志显示以下任一:
Badly formated request: \u0016\u0003\u001
Bad request received.
要么
Failed to read request: Client closed connection. (0)
1Request took 0 ms + 23 ms idle time
正确的顺序是:
客户端连接到SOCKS代理,根据需要进行身份验证。
客户端发送SOCKS连接请求以创建到www.google.com:443
的隧道。
SOCKS代理连接到HTTP代理
SOCKS代理发送HTTP CONNECT
请求以创建到www.google.com:443
的隧道。
SOCKS代理收到来自HTTP代理的回复。
SOCKS代理向客户端发送适当的SOCKS答复。
如果HTTP代理成功,则在客户端和HTTP代理之间传递未修改的数据,直到其中之一断开连接。
关闭客户端连接和HTTP代理连接。
链接代理时,必须先协商隧道,然后才能开始通过它们传递应用程序数据。 在下一个代理首先回复其隧道状态之前,请勿将隧道回复发送给客户端。
6)这个新构建的CONNECT发送到HTTP代理...该代理...响应:
7)这是在我们的SOCKS服务器中接收的,并被转发(未修改)给客户端...
错了 您在SOCKS代理中生成CONNECT请求,因此应将对此请求的响应保留给自己,而不是将其转发给客户端。 您应该做什么:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.