“200 Connection Established”表示代理接受了隧道请求,网站此时还没有返回页面。接下来才是与目标端建立 TLS,再发送 HTTPS 请求本身。

从连接代理到收到网站响应

  1. 客户端连接代理端点。
  2. 客户端请代理连接目标主机及端口。
  3. 代理接受或拒绝该请求。
  4. 请求获准后,客户端通过隧道与目标端协商 TLS。
  5. 客户端在 TLS 内发送 HTTPS 请求,并接收网站响应。

代理连接被拒绝、隧道被拒绝、证书出错,发生在这条流程中的不同位置。改设置前,先找出最后完成的是哪一步。

CONNECT 的请求与响应

在 HTTP/1.1 中,简化后的交互如下:

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

HTTP/1.1 200 Connection Established

请求目标只有主机和端口,不带网站路径或查询参数。CONNECT 响应成功后,这条连接传输的是隧道字节。若目标使用 HTTPS,客户端接下来进行的是 TLS 握手。

应读取数字状态码,而不是匹配英文原因短语。同一个状态,不同代理可能使用不同文字。

用 curl 看完整过程

假设 HTTP 代理监听本机端口 8080:

curl --noproxy '' --proxy http://127.0.0.1:8080 --connect-timeout 5 --max-time 15 --verbose https://example.com/

把监听地址换成你的端点;如果需要候选,可以浏览HTTP 代理列表,再测试选中的条目。空的绕过列表确保本次调用选择代理。按时间顺序查找代理连接、CONNECT 响应、目标证书验证和网站响应。日志中的具体措辞取决于 curl 构建版本。

代理接受隧道后,目标端仍可能返回 404、429 或 500。也可能在 TLS 阶段就失败,还没来得及返回任何 HTTP 响应。

停在哪一步?

观察结果接下来查什么
连接代理时被拒绝代理地址、监听端口、进程及网络访问。
代理返回 407代理账号与认证方案。
代理拒绝目标或端口访问策略及允许 CONNECT 连接的目标。
隧道打开后,TLS 验证失败目标名称、信任库、时钟,以及是否存在受管理的 TLS 拦截。
TLS 成功,网站返回错误网站的响应。

做对照时,固定其中一端:通过同一代理尝试其他目标,或在获准的直连路径上访问同一目标进行比较。

隧道仍有运营者

代理知道 CONNECT 的目标,并处理流量的时序和规模。常规的端到端 TLS 能保护网站应用内容,使未终止该 TLS 会话的代理无法读取。受客户端信任的受管理拦截代理,则采用另一种信任关系。

相关文章