HTTPQUERY
English

CONNECT

用法

CONNECT 请求告知 HTTP 代理与指定的主机和端口建立一个 TCP 连接,然后在两个方向上转发原始字节。请求目标使用 authority 形式(host:port),而非路径。

CONNECT 的主要用途是 HTTPS 隧穿。当处于代理之后的客户端需要访问某个 HTTPS 站点时,其流程如下:

由于隧道建立后代理转发的是原始字节,代理无法看到加密流量的内容。这正是企业和网络代理用来允许访问外部 HTTPS 服务器的机制。

如果代理需要身份验证,客户端会在 CONNECT 请求中包含 Proxy-Authorization 请求头。缺失或无效的凭据会导致 407 Proxy Authentication Required 响应。

WHATWG Fetch 标准将 CONNECT 列为禁止的方法,从而阻止 JavaScript 通过浏览器 API 发出 CONNECT 请求。

在 HTTP/2 和 HTTP/3 中,CONNECT 在单个流上创建隧道,而非在整个 TCP 连接上。HTTP/2 规范为单个流定义了基本的 CONNECT。扩展 CONNECT 协议升级添加了一个 :protocol 伪头,从而在多路复用连接上启用 WebSocket 及其他协议,HTTP/2 和 HTTP/3 均支持这一特性。基础流隧道与扩展 CONNECT 相辅相成:前者提供原始隧穿,后者则在多路复用连接上启用非 TCP 协议。

通过代理的 HTTPS 隧道

客户端请求通过代理与 example.com 的 443 端口建立一个 TLS 隧道。代理使用 Proxy-Authorization 请求头对客户端进行身份验证,打开 TCP 连接,并以 200 OK 确认。

请求

CONNECT example.com:443 HTTP/1.1
Host: example.com:443
Proxy-Authorization: Basic dXNlcjpwYXNz

响应

HTTP/1.1 200 Connection Established

在收到 200 响应后,客户端通过打开的隧道与 example.com 开始 TLS 握手。代理转发所有后续数据,不检查或修改其内容。

无身份验证的隧道

当代理不需要凭据时,请求仅包含目标主机和端口。

请求

CONNECT example.com:443 HTTP/1.1
Host: example.com:443

响应

HTTP/1.1 200 Connection Established

CORS

CONNECT 是 CORS 禁止的方法。浏览器会阻止一切通过 fetch() 和 XMLHttpRequest 等浏览器 API 发送 CONNECT 的尝试。

HTTP 隧穿

HTTP 隧穿将非 HTTP 流量封装在 HTTP 消息中,允许 HTTPS、SSH 和 FTP 等协议穿越 HTTP 代理。CONNECT 是建立这些隧道的主要机制。代理与目标主机和端口打开一个原始 TCP 连接,然后双向转发字节,而不检查其内容。

在客户端与服务器之间没有代理的情况下,CONNECT 是不必要的。客户端会使用目标协议直接连接到服务器。

安全

接受向任意端口发起 CONNECT 的开放代理会带来滥用风险:通过 SMTP(25 端口)中继垃圾邮件、对内部网络进行端口扫描,以及绕过网络访问控制。生产代理会将 CONNECT 限制到 443 端口(HTTPS)或一份经批准的目标白名单。

OWASP 将不受限制的 CONNECT 认定为安全风险。WHATWG Fetch 标准将 CONNECT 归类为禁止的方法,从而阻止浏览器直接通过 fetch() 或 XMLHttpRequest 发送 CONNECT 请求。