0

我正在python中创建一个基于BaseHTTPServer的代理服务器。它所做的是创建与 squid 代理的连接,识别浏览器请求(GET、CONNECT、POST 等)并向其添加代理授权标头,然后将此请求转发给 squid 代理。

问题是,据我了解,当我发送连接请求时,我应该将所有相应的流量中继到 squid 代理。但是,正如我在 Wireshark 中看到的那样,squid 代理没有回复握手的“Client Hello”部分,我认为这是由于 squid 代理不理解我只是转发给它的 SSL 的二进制数据。

在这种情况下如何处理 HTTPS 请求?

该代码或多或少类似于 TinyHTTPProxy :http ://www.oki-osk.jp/esc/python/proxy/

4

1 回答 1

1

RFC 2817定义了该CONNECT方法。它与其他 HTTP 方法的不同之处在于接收代理(您的 Python 代理)直接建立一个原始 TCP隧道到目标主机(在 RFC 中称为授权)。

代理不能对将通过该隧道发送的数据做出任何假设;它不一定是 HTTP——客户端可以使用隧道来使用它喜欢的任何协议。事实上,SSL ≠ HTTP。

你有两个选择:

  • 直接打开到请求的目标主机的 TCP 连接。
  • CONNECT向您的上游代理 (Squid) 发出请求。这在规格范围内:

    可能是代理本身只能通过另一个代理到达请求的源服务器。在这种情况下,第一个代理应该CONNECT向下一个代理发出请求,请求一条通往权威的隧道。代理不得以任何 2xx 状态码进行响应,除非它与权威机构建立了直接或隧道连接。

    确保您的请求包含所需的Host标头。

    CONNECT www.google.com:443 HTTP/1.1
    Host: www.google.com:443
    Proxy-Authorization: ...
    ​
    
于 2013-03-03T21:41:46.930 回答