以代理监听端文档注明的协议方案为准。从HTTP 代理列表挑选代理时,先确认监听端的协议方案,再配置客户端。访问 HTTPS 网站也可以使用 http://proxy.example:8080;把它改成 https://,要求的就是另一种连接代理的方式。

代理 URL网站 URL连接方式
http://proxy.example:8080http://example.com/到代理和目标网站均使用明文 HTTP。
http://proxy.example:8080https://example.com/先向代理发送 HTTP CONNECT,再通过隧道与目标网站建立 TLS 连接。
https://proxy.example:8443https://example.com/先与代理建立 TLS 连接,目标网站的隧道承载在这条连接内部。

对于允许 CONNECT 的普通 HTTP 监听端,下面的写法是匹配的:

curl --proxy http://127.0.0.1:8080 https://example.com/

代理接受隧道后,才会进行网站的 TLS 握手。如果把代理 URL 改成 https://,而监听端只识别明文 HTTP,那么与代理的 TLS 协商可能在联系网站之前就失败。

连接代理时使用 TLS,多保护了什么

启用 TLS 的代理会保护客户端到代理这一段链路,包括 CONNECT 交互和代理认证,防止这段路径上的被动监听。代理运营者仍然负责处理连接,也知道隧道的目标。客户端和监听端都必须支持这种模式:

curl --proxy https://proxy.example:8443 https://example.com/

使用服务实际的主机名;证书必须与主机名匹配,并且受到信任。目标地址和端口限制仍然有效。

两端都使用 HTTPS 时,会有两次证书检查。curl 允许分别配置:

curl --proxy https://proxy.example:8443 --proxy-cacert proxy-ca.pem --cacert origin-ca.pem https://example.com/

--proxy-cacert 指定信任代理所用的证书;--cacert 指定信任目标网站所用的证书。需要时使用管理员提供的证书包;系统的信任配置也可能已经够用。更改其中任何一项之前,先弄清失败的是哪一次握手。

代理列表中的“HTTPS”标签,可能只表示该端点通过了 CONNECT 测试。除非列表说明了测试方式,否则仅凭这个标签,无法判断监听端需要的是 http:// 还是 https://。

相关文章