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

时间:2016-03-20 02:00:51

标签: php curl http-proxy

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

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

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代理上使用TCP隧道进行HTTP隧道安全的原因,但是由于我的代理服务器在localhost上,我不在乎使用不安全的HTTP连接到代理,并且想要cURL执行GET请求:

GET https://example.com/ HTTP/1.1

我尝试使用:

curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, false);

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

2 个答案:

答案 0 :(得分:12)

我不相信这可以使用客户端上的一些常见配置设置来完成,因为它会否认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可能会带来法律或道德问题。未经客户同意,切勿这样做!

答案 1 :(得分:0)

我不认为这里的其他答案明白你想做什么。但它可能。

你想发一个https请求并让它像这样完成:

client <--http--> cache <--https--> remote server

因此,您不安全地将https请求通过本地网络上的http发送到本地缓存,然后让缓存在开放式互联网上以https形式安全地获取它。

要做到这一点,你只需要破解第一跳。您的客户端程序向缓存发出一个简单的http请求,但添加了一个标题,表示在下一跳转换为https,如:

x-use-protocol: https

创建您喜欢的任何标题。为此,客户端和缓存都必须了解此标头才能进行转换。这不适合一般的网页浏览 - 或任何无法控制客户端的时间。但如果您同时编写客户端和缓存,这是一个很好的答案。