我已经设置了代理:
curl_setopt($ch,CURLOPT_PROXY,'http://localhost:8080');
当我查询HTTP网站时,cURL执行标准的HTTP GET代理请求,可以正确缓存:
GET http://example.com/ HTTP/1.1
但是,当查询HTTPs网站时,cURL会执行CONNECT,有效地使用代理作为TCP隧道,并阻止它缓存响应:
CONNECT example.com:80 HTTP/1.1
有没有办法强制cURL执行GET请求,即使是HTTPs网站?
我可以理解背后使用HTTP隧道的HTTP隧道协议通过HTTP代理进行安全的理由,但是由于我的代理服务器在本地主机上,所以我不在乎使用与代理不一致的HTTP连接,并且希望cURL执行GET请求:
GET https://example.com/ HTTP/1.1
我试过使用:
curl_setopt($ch,CURLOPT_HTTPPROXYTUNNEL,false);
但这并没有改变任何事情.
因此,您唯一的选择是配置您的代理基本上创建一个man-in-the-middle attack来解密通过它的HTTPS流量. squid代理应该使用他们的“SSL bump” feature支持这个.有一个很好的介绍,它在this wiki和更多的setup docs here.
这种方式中的鱿鱼是从客户端的CONNECT请求中获取远程服务器的地址,而不是只创建一个到服务器的盲目隧道,它会自动向服务器发起一个新的直接HTTPS请求并保存回复.因此,Squid可以访问所有的流量,并可以缓存它,或者做任何其他Squid可以做的事情.
当将回复发送回客户端时,它本身需要提供HTTPS证书(客户端期望HTTPS流量),因此在Squid中,所有代理域都有一个automatically generate certificates的功能.要配置它,您将基本上必须创建本地证书颁发机构.请注意,这些自动生成的证书将是简单的自签名证书,因此在客户端,这将被视为不受信任的证书,您需要关闭对等验证(CURLOPT_SSL_VERIFYPEER = false).
我在Apache流量服务器中找不到任何类似的功能.他们似乎只支持SSL termination在反向代理模式.
最后一点:请记住,这仍然是一个黑客和解密HTTPS可能带来法律或伦理问题.没有客户的同意,永远不要这样做!