php – 强制cURL使用GET代理HTTP请求

前端之家收集整理的这篇文章主要介绍了php – 强制cURL使用GET代理HTTP请求前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图在本地机器上使用转发代理服务器(Apache Traffic Server或Squid),作为本地的HTTP缓存用于我的cURL调用.

我已经设置了代理:

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);

但这并没有改变任何事情.

我不相信这可以在客户端使用一些常见的配置设置,因为它会拒绝HTTPS的全部目的(没有人可以窃听你的HTTPS流量).

因此,您唯一的选择是配置您的代理基本上创建一个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可能带来法律或伦理问题.没有客户的同意,永远不要这样做!

猜你在找的PHP相关文章