【问题标题】:HTTP Connect request through a cascading proxy通过级联代理的 HTTP 连接请求
【发布时间】:2013-02-15 07:10:47
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python https proxy connect cascade


    【解决方案1】:

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

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

    你有两个选择:

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

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

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

      CONNECT www.google.com:443 HTTP/1.1
      Host: www.google.com:443
      Proxy-Authorization: ...
      ​
      

    【讨论】:

    • 我正在做同样的事情。下面是我实现的代码:PROXY_ADDR = ("172.16.27.25", 3128) #Squid proxy CONNECT = "CONNECT www.gooogle.com:443 HTTP/1.1\r\n" proxy_auth = "Proxy-Authorization: Basic " + str(encoded_user_pass) + "\r\n" CONNECT = CONNECT + proxy_auth + "\r\n" s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(PROXY_ADDR) s.send(CONNECT) 之后,它启动了一次握手,但未能从 Squid 服务器获得响应(Server hello)。
    • 我无法正确格式化上述代码。基本上,它连接到 squid 代理(内部 IP)并发送一个带有代理授权的 CONNECT 请求。 (握手失败)我在 urllib2 模块中使用了代理生成器,它与 squid 代理完美配合,但我不明白为什么上面的代码不起作用。
    • @Polymorph:您的CONNECT 请求中缺少Host 标头。 HTTP/1.1 requires 客户端必须在所有请求中包含 Host 标头。
    • 好的。我尝试使用 HTTP/1.1 请求中的主机标头。我还尝试了 HTTP/1.0 请求。他们都在握手部分失败了。
    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多