强制cURL在HTTPs请求的代理上使用GET

Ben*_*min 10 php curl http-proxy

我正在尝试在我的本地计算机上使用转发代理服务器(Apache Traffic Server或Squid)作为我的cURL调用的本地HTTP缓存.

我使用以下方法设置了代理:

curl_setopt($ch, CURLOPT_PROXY, 'http://localhost:8080');
Run Code Online (Sandbox Code Playgroud)

当我查询HTTP网站时,cURL执行标准HTTP GET代理请求,可以正确缓存:

GET http://example.com/ HTTP/1.1
Run Code Online (Sandbox Code Playgroud)

但是,在查询HTTPs网站时,cURL执行CONNECT代替,有效地使用代理作为TCP隧道,并阻止它缓存响应:

CONNECT example.com:80 HTTP/1.1
Run Code Online (Sandbox Code Playgroud)

有没有办法迫使cURL GET甚至为HTTPs网站执行请求?

我可以理解在HTTP代理上使用TCP隧道进行HTTP隧道安全性的基本原理,但由于我的代理服务器在localhost上,我不关心使用不安全的HTTP连接到代理,并希望cURL执行GET请求:

GET https://example.com/ HTTP/1.1
Run Code Online (Sandbox Code Playgroud)

我试过用:

curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, false);
Run Code Online (Sandbox Code Playgroud)

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

Bor*_*aMa 12

我不相信这可以使用客户端上的一些常见配置设置来完成,因为它会否定HTTPS的整个目的(没有人可以窃听您的HTTPS流量).

因此,您唯一的选择是将代理配置为基本上创建一个中间人攻击来解密通过它的HTTPS流量.Squid代理应该使用他们的"SSL bump"功能来支持这一点.这个维基上有一个很好的介绍,这里有更多的设置文档.

在这种情况下,鱿鱼做的是它从客户端的CONNECT请求获取远程服务器的地址,而不是仅创建到服务器的盲隧道,它自己向服务器启动新的直接HTTPS请求并保存回复.因此Squid可以访问所有流量,可以缓存它或者做任何其他事情Squid可以做的事情.

将回复发送回客户端时,它本身需要提供HTTPS证书(客户端需要HTTPS流量),因此在Squid中有一项功能可以自动为所有代理域生成证书.要配置它,您基本上必须创建本地证书颁发机构.请注意,这些自动生成的证书将是简单的自签名证书,因此,在客户端,这将看起来像不受信任的证书,您需要关闭对等验证(CURLOPT_SSL_VERIFYPEER = false).

我在Apache流量服务器中找不到任何类似的功能.它们似乎仅支持反向代理模式下的SSL终止.

最后请注意:请记住,这仍然是一个黑客攻击,解密HTTPS可能会带来法律或道德问题.未经客户同意,切勿这样做!

  • http://stackoverflow.com/questions/14656/can-a-proxy-server-cache-ssl-gets-if-not-would-response-body-encryption-suffic (2认同)