HTTP CONNECT:HTTP 代理如何处理 HTTPS
跟着 HTTPS 请求走一遍 HTTP 代理,分清 CONNECT 响应与源站响应,并定位隧道在哪一步失败。
“200 Connection Established”表示代理接受了隧道请求,网站此时还没有返回页面。接下来才是与目标端建立 TLS,再发送 HTTPS 请求本身。
从连接代理到收到网站响应
- 客户端连接代理端点。
- 客户端请代理连接目标主机及端口。
- 代理接受或拒绝该请求。
- 请求获准后,客户端通过隧道与目标端协商 TLS。
- 客户端在 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 会话的代理无法读取。受客户端信任的受管理拦截代理,则采用另一种信任关系。