2016-03-20 70 views
10

我想在我的本地機器上使用轉發代理服務器(Apache Traffic Server或Squid),作爲我的cURL調用的本地HTTP緩存。強制cURL使用GET代理HTTP請求

我已經設置了使用代理:

curl_setopt($ch, CURLOPT_PROXY, 'http://localhost:8080'); 

當我查詢一個HTTP網站,嫋嫋執行標準的HTTP代理GET要求,可適當進行緩存:

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

然而,當查詢HTTPs網站時,cURL會執行CONNECT,而不是有效地將代理用作TCP隧道,並防止它緩存響應:

CONNECT example.com:80 HTTP/1.1 

有沒有辦法強制cURL執行GET請求甚至HTTP網站?

我可以理解使用TCP通道爲HTTPs請求通過HTTP代理進行安全性的基本原理,但由於我的代理服務器位於本地主機上,因此我不在意使用不安全的HTTP連接到代理,像捲曲執行GET要求:

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

我試着使用:

curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, false); 

但這並沒有改變任何東西。

+1

沒有好辦法AFAIK;你需要一個假SSL證書和一個智能攔截(SOCKS?)代理 - 用它自己的代替目標網站的ssl - 一個例子是telerik.com/fiddler上的Fiddler代理 – hanshenrik

+0

並且你檢查了'curl_setopt($ ch,CURLOPT_SSL_VERIFYPEER,false);'選項? ;) –

回答

12

我不相信這可以使用客戶端上的一些常見配置設置作爲它會否認HTTPS(沒有人可以竊聽您的HTTPS流量)的整個目的。

因此,您的唯一選擇是配置您的代理,以基本創建一個man-in-the-middle attack來解密通過它的HTTPS流量。魷魚代理應該支持這個使用他們的"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解密可能帶來法律或道德問題。切勿在未經客戶同意的情況下做這件事

+0

感謝您的回答。解密HTTPS沒有問題,因爲除了複雜性和性能問題之外,它們都是在同一臺計算機上以本地流量的形式發生的。我很驚訝cURL不允許覆蓋這種行爲(對於本地主機上的代理),因爲在技術方面,絕對沒有什麼能夠阻止我想實現的目標。 – Benjamin

+2

http://stackoverflow.com/questions/14656/can-a-proxy-server-cache-ssl-gets-if-not-would-response-body-encryption-suffic – Axalix

+0

看起來你是對的,這是對我來說沒有好消息:-) – Benjamin

0

我不認爲在這裏的其他答案明白你想要做什麼。但它可能。

你想使一個HTTPS請求,並將它完成這樣的:

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

所以你不安全發送HTTPS請求通過HTTP本地網絡上,到本地緩存中,則有緩存獲取它在開放式互聯網上安全地使用https。

要做到這一點,你只需要破解第一跳。您的客戶端程序發出一個普通的HTTP請求到高速緩存,但增加了一個頭,說要轉換到https的下一跳,如:

x-use-protocol: https 

創造任何你喜歡的標題。爲此,客戶端和緩存都必須理解此頭才能進行轉換。這對於一般的網頁瀏覽來說並不好 - 或者任何時候你無法控制客戶端。但是,如果您正在編寫客戶端和緩存,這是一個很好的答案。

+1

你正確地解決了我的問題。不過,我並沒有寫緩存。我正在使用股票軟件,目前是Apache Traffic Server。真正的問題是cURL不允許強制GET請求而不是https URL上的CONNECT請求。 – Benjamin