2012-03-19 134 views
9

我一直在我的開發服務器上遇到問題,其中cURL在完全適用於任何HTTP的情況下,無法正常使用任何HTTPS - 甚至是具有不同協議的完全相同的資源(用於測試I'我一直在使用http和https請求google.com)。PHP cURL不能使用HTTPS

返回的cURL錯誤是35:「SSL/TLS握手中某處發生了問題。」

我已經梳理了Web和SO以獲得解決方案,並且它們都將CURLOPT_SSL_VERIFYPEER設置爲false,這不會改變任何內容,或者下載證書文件並將CURLOPT_CAINFO設置爲其路徑,這也不會改變任何內容。

設置證書時,我按照this tutorialthis tutorial的說明嘗試同時爲我請求的資源下載證書,然後下載證書包。對於我的問題的徹底性,我設置的其他選項是CURLOPT_VERBOSE = true,CURLOPT_RETURNTRANSFER = true,和CURLOPT_SSL_VERIFYHOST = 2(我已經嘗試了1和2的每個組合與VERIFYPEER都是真的和假的)。我也已經在phpinfo()中確認我有OpenSSL並且已啓用。

我使用了很多舊代碼,這些代碼在我的上一個生產服務器上運行完美,所以此代碼已工作過。但是,託管是共享主機,我不知道那裏的大部分配置。

+0

您訪問的網址是否相同?你遇到了我在處理這個問題時所做的大部分研究。 – Jason 2012-03-19 17:01:12

+0

我使用了http:// www.google.com,它工作;和https:// www.google.com,但沒有。 – spezied 2012-03-19 19:08:23

+0

@Spezied,如果提供的答案回答你的問題,你可以選擇它作爲你的答案,所以問題可以被關閉?謝謝。 – 2012-03-24 21:33:14

回答

8

這個怎麼樣。它爲我提取HTTPS Google主頁。它應該爲你做詭計。

<?PHP 

// connect via SSL, but don't check cert 
$handle=curl_init('https://www.google.com'); 
curl_setopt($handle, CURLOPT_VERBOSE, true); 
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false); 
$content = curl_exec($handle); 

echo $content; // show target page 
?> 
+1

看到我上面的答案,忽略cert不是最好的選擇。 – Ray 2013-07-01 16:36:42

+3

這就是INSECURE。不要這樣做。始終驗證對等和主機。查看其他答案。 – 2013-09-18 15:19:02

+5

@Matt。取決於你在做什麼。移動重要的財務資源,肯定會驗證HTTPS。從零售商網站刮擦鞋子品牌...... MITM應該不成問題。顯然考慮問題的上下文。 – 2013-09-18 17:37:12

16

Curl沒有內置的根證書(像大多數現代瀏覽器一樣)。你需要明確地將它指向一個cacert.pem文件:

curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cert/file/cacert.pem'); 

如果沒有這個,捲曲無法驗證證書通過SSL送回。每次在curl中使用SSL時,都可以使用相同的根證書文件。

你可以在這裏得到cacert.pem文件:http://curl.haxx.se/docs/caextract.html

+0

爲什麼不使用相同的'--insecure'標誌?有一個嗎? – Pacerier 2016-01-17 21:25:09

+1

@Pacerier將'CURLOPT_SSL_VERIFYPEER'設置爲false,正好是'--insecure'標誌在命令行上執行的操作。如果您關心目標服務器 – Ray 2016-01-18 16:57:17

+0

的真實性,則不想執行任何操作。雖然'CURLOPT_SSL_VERIFYPEER'爲'false'。 – n8bar 2017-05-18 16:34:43

2

找到,如果你的操作系統包括證書的目錄。如果是這樣,那麼所需的CA證書通常已經包含在內。例如,在Ubuntu上,它通常是/etc/ssl/certs。如果此目錄存在,請設置CA路徑參數:

curl_setopt($ch, CURLOPT_CAPATH, '/etc/ssl/certs'); 

或者,您可以引用單個CA證書文件。在您的項目中包含一個cacert.pem文件或將其安裝在您的服務器上。從可信來源下載,例如cacert.org。對於單個文件不設置CAPATH,而是隻設置CAINFO:

curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem'); 

關閉同行和主機驗證是一個快速而不安全解決方法,以真正的問題。這些功能的存在是有原因的:所以您可以通過第三方相信您連接的系統是您期望的系統。

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);