【问题标题】:When should one use CONNECT and GET HTTP methods at HTTP Proxy Server?什么时候应该在 HTTP 代理服务器上使用 CONNECT 和 GET HTTP 方法?
【发布时间】:2012-07-28 03:12:00
【问题描述】:

我正在构建一个 WebClient 库。现在我正在实现一个代理功能,所以我正在做一些研究,我看到了一些使用CONNECT 方法请求 URL 的代码。

但是在我的网络浏览器中检查它,它没有使用CONNECT 方法,而是调用了 GET 方法。

所以我很困惑。什么时候应该同时使用这两种方法?

【问题讨论】:

    标签: proxy httpwebrequest http-request http-proxy proxy-server


    【解决方案1】:

    TL;DR Web 客户端仅在知道它与代理通信并且最终 URI 以 https:// 开头时才使用 CONNECT

    当浏览器说:

    CONNECT www.google.com:443 HTTP/1.1
    

    意思是:

    你好代理,请打开一个原始的 TCP 连接到谷歌;任何以下 我写的字节,你只是重复那个连接而没有任何 解释。哦,还有一件事。仅当您与之交谈时才这样做 直接谷歌,但如果你自己使用另一个代理,而不是你 告诉他们同样的CONNECT

    请注意,这对 TLS (https) 没有任何说明。事实上CONNECT 与 TLS 是正交的;你可以只有一个,你可以有另一个,或者你可以同时拥有它们。

    话虽如此,CONNECT 的意图是允许端到端加密 TLS 会话,因此代理(或整个代理链)无法读取数据。即使代理根本不理解 TLS,它也可以工作,因为CONNECT 可以在纯 HTTP 中发出,并且只需要从代理复制原始字节即可。

    但是到第一个代理的连接可以是 TLS (https),​​尽管这意味着你和第一个代理之间的流量双重加密。

    显然,在直接与最终服务器对话时,CONNECT 毫无意义。您只需开始使用 TLS,然后发出 HTTP GET。终端服务器通常会完全禁用CONNECT

    对于代理,CONNECT 支持会增加安全风险。任何数据都可以通过CONNECT 传递,甚至可以通过 ssh 黑客攻击 192.168.1.* 上的服务器,甚至 SMTP 发送垃圾邮件。外界将这些攻击视为由代理发起的常规 TCP 连接。他们不在乎是什么原因,他们无法检查 HTTP CONNECT 是否是罪魁祸首。因此,由代理来保护自己免受滥用。

    【讨论】:

    • 感谢您的详细回答,它为我确认了一些事情。
    • 这是我在网络上找到的第一个解释,它实际上帮助我理解了何时使用 CONNECT 以及为什么使用。谢谢!
    【解决方案2】:

    CONNECT 请求会促使您的代理建立到远程端点的 HTTP 隧道。 通常它用于 SSL 连接,尽管它也可以与 HTTP 一起使用(用于代理链和隧道)

    CONNECT www.google.com:443 
    

    以上行在端口 443 上打开了从您的代理到 www.google.com 的连接。 之后,客户端发送的内容由代理转发到www.google.com:443

    如果用户尝试检索页面http://www.google.com,代理可以代表他发送完全相同的请求并检索响应。

    使用 SSL(HTTPS),只有两个远程端点理解请求,代理无法解密它们。因此,它所做的只是使用 CONNECT 打开该隧道,并让两个端点(网络服务器和客户端)直接相互通信。

    代理链:

    如果您要链接 2 个代理服务器,这是要发出的请求序列。

    GET1 is the original GET request (HTTP URL)
    CONNECT1 is the original CONNECT request (SSL/HTTPS URL or Another Proxy)
    
    User Request ==CONNECT1==> (Your_Primary_Proxy ==CONNECT==> AnotherProxy-1 ... ==CONNECT==> AnotherProxy-n) ==GET1(IF is http)/CONNECT1(IF is https)==> Destination_URL
    

    【讨论】:

    • 那么,您是否告诉我 CONNECT 方法限制为 HTTPS(默认端口 443)请求?
    • 一点也不。 SSL 可能在不同的端口上运行。端口 443 是 SSL 最常用的端口。 CONNECT 用于强制代理 HTTPS 请求,也可以将其用于 HTTP,但不是必须的。
    • 很好,现在,如果我想实现一个链代理?客户端 -> 代理 -> 另一个代理 -> URL。我应该使用 CONNECT 还是 GET?
    • 查看更新的答案。您将首先按顺序向您链接到的每个代理发出 CONNECT。当您从您链接的每个代理收到200 Established 响应时,最后发送原始的GETCONNECT
    • 所以,我们可以说 CONNECT 是“通常它用于 SSL 连接和代理链”。好的!我会测试一下,提前谢谢。
    【解决方案3】:

    根据经验,GET 用于纯 HTTP,CONNECT 用于 HTTPS

    还有更多细节,所以您可能想阅读相关的 RFC-s

    http://www.ietf.org/rfc/rfc2068.txt http://www.ietf.org/rfc/rfc2817.txt

    【讨论】:

    • 谢谢@anttix,我真的只是做了一个测试,我看到请求HTTPS URL时使用了CONNECT方法。现在,我正在测试代理链,与上面的 DarkXphenomenon 交谈,CONNECT 方法将帮助我使用 CONNECT 对代理链进行操作,因为 GET 不起作用。
    【解决方案4】:

    CONNECT 方法将请求连接转换为透明的 TCP/IP 隧道,通常是为了通过未加密的 HTTP 代理促进 SSL 加密通信 (HTTPS)。

    【讨论】:

      猜你喜欢
      • 2019-08-22
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      • 2013-01-15
      • 1970-01-01
      • 2013-09-14
      • 1970-01-01
      • 2011-09-25
      相关资源
      最近更新 更多