当前位置: 首页 > 知识库问答 >
问题:

如何将HTTPS流量从SOCKS代理转发到HTTP代理

马魁
2023-03-14

我编写了一个SOCKS代理,如果关闭链接,它可以同时处理HTTP和HTTPS流量。

如果链接已打开并且转发主机和端口属于过滤HTTP代理,则只有HTTP流量可以流动。HTTPS流量不流动并报告SSL错误。

请注意,当请求直接来自浏览器而不是SOCKS服务器时,HTTP代理会处理HTTPS流量。

例如,如果我向https://www.google.com出现以下情况:

1)客户端发送SOCKS 5问候,让我们知道哪些身份验证方法是可以接受的。

2)服务器响应NO_AUTH

3) 客户端发送连接请求(包括预期的目标主机和端口)。

4) 服务器创建一个套接字并将其连接到HTTP代理服务器,并以授权响应客户端

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) 这个新构造的连接被发送到我们链接到的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\u NOT\u CONNECTED,对套接字运行另一个检查可确认客户端套接字确实不再连接。

为什么我的插座会在第7步和第8步之间关闭?我没有正确遵守协议吗?我看不出我错过了什么。我想我在某种程度上处理连接方法时出错了?

如果我没有修改SOCKS服务器接收到的请求(即将其转换为连接请求),而是将无法读取的数据直接转发给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

共有2个答案

郎泰平
2023-03-14

6) 这个新构造的连接被发送到HTTP代理。。。此代理。。。响应方式:

7)这在我们的SOCKS服务器中接收并转发(未修改)到客户端...

这是错误的。您在SOCKS代理中生成连接请求,因此您应该将此请求的响应保留给自己,而不是转发给客户端。您应该做什么:

  • 如果从客户端收到SSL握手的开始(“\x16\x03…”)你应该缓冲一下
钦宏义
2023-03-14

正确的顺序是:

>

客户端向www.google发送SOCKS连接请求以创建隧道。通讯:443。

SOCKS代理连接到HTTP代理

SOCKS代理向www.google发送HTTP连接请求以创建隧道。通讯:443。

SOCKS代理从HTTP代理接收回复。

SOCKS代理向客户端发送适当的SOCKS回复。

如果HTTP代理成功,请在客户端和HTTP代理之间传递未修改的数据,直到其中一个断开连接。

关闭客户端连接和HTTP代理连接。

当您链接代理时,您必须协商隧道,然后才能开始通过它们传递应用程序数据。在下一个代理首先回复其隧道状态之前,不要向客户端发送隧道回复。

 类似资料:
  • 我用的是k8s和istio。而且,我有带有httpsendpoint的外部api(相互tls) 我不希望k8s pod的每个api请求都实现相互tls调用,所以如果istio特使代理可以处理相互tls,那就太好了。pod可以通过http调用api,特使将请求转换为https mtls请求。 我设法找到了与特使共同解决tls的办法。如何将自定义客户端证书用于istio的外部服务? 现在我应该找到如何

  • 问题内容: 最近,我一直在扭曲使用HTTP代理。经过反复试验,我想我终于可以正常工作了。我想知道的是,如果可能的话,如何扩展此代理以使其也能够处理HTTPS页面?到目前为止,这是我得到的: 如该代码所示,为了示例,我现在仅打印通过连接进行的操作。是否可以使用相同的类来处理HTTPS?如果没有,我应该如何实施这样的事情? 问题答案: 如果要通过HTTP代理连接到HTTPS网站,则需要使用HTTP动词

  • 下面是使用“ProxyPass”和“ProxyPassReverse”的apache反向代理配置片段 当我在wget命令下面运行时,它不知何故重定向到http: 如果我使用“/artifactory/webapp/#/home”运行wget命令,它可以在HTTPS上工作: 我没有在代理配置文件的任何地方定义重定向。 有人能提出这种行为背后的原因吗??如何避免将其重定向到HTTP?

  • 问题内容: 我想为SOCKS5代理设置列表,即应使用直接连接的主机名列表。 正如oracle docs所描述的,有一些名为的选项,可以为HTTP和FTP设置代理排除,但没有针对SOCKS代理的特定设置。 我试过了,但这不会影响SOCKS连接。 SOCKS代理是通过以下方式设置的: 但这导致即使数据库连接也正在使用SOCKS代理,这是不可接受的。 应该如何使用?如何从代理连接中排除某些主机? 问题答

  • 我正在使用ssh-D创建套接字代理,想知道如何使用pip(或easy\u install)吗?我找到了这个问题,但那是一个http代理。 另外,请给我一个在OS X下工作的解决方案。(我尝试了proxifier,它可以与pip安装一起工作,但不能与sudo pip安装一起工作)

  • 问题内容: 我正在尝试创建通过 SOCKS5* 代理 通过Apache HC 4 发送请求的应用。我无法使用应用程序全局代理,因为应用程序是多线程的(我需要为每个实例使用不同的代理)。我没有发现HC4使用SOCKS5的示例。如何使用? * 问题答案: SOCK是TCP / IP级别的代理协议,而不是HTTP。开箱即用不支持HttpClient。 可以使用自定义连接套接字工厂自定义HttpClien