监听 8443 端口的 HTTPS 服务可以经由 8080 端口的 HTTP 代理访问。这两个数字描述的是两条不同的连接:

$handle = curl_init('https://api.example:8443/status');
curl_setopt($handle, CURLOPT_PROXY, 'http://proxy.example:8080');
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);

执行、错误处理和句柄生命周期仍由应用掌握。这段代码把路由所需的输入放在一起,同时不改变证书校验。

cURL 首先连接 proxy.example:8080。对于这个 HTTPS 目标,隧道请求中给出的是 api.example:8443,TLS 身份仍然是 api.example。

CURLOPT_PORT 覆盖的是目标端口,而不是代理的端口。只要 URL 以 https 开头就把它设成 443,可能会覆盖掉刻意托管在 8443 上的服务。libcurl 建议在 URL 中选择端口,而不是使用该选项。

复用句柄时,也要考虑此前任何显式的端口覆盖。新的 URL 并不会让相互矛盾的遗留选项更容易解释。

中间人必须允许 CONNECT 到选定的目标端口。8443 被拒绝,并不是挪动代理监听端口或关闭 TLS 校验的理由。

相关文章