2015-02-09 124 views
4

我正在嘗試在PHP中向URL發出cURL請求。無論我嘗試什麼,我總是得到一個cURL errno 35(針對特定的URI)。捲曲文檔有以下說:如何調試或修復cURL errno 35

你真的想錯誤緩衝區,並在那裏讀取消息,因爲它稍微查明問題。可能是證書(文件格式,路徑,權限),密碼等。

但是,當試圖捕獲這些信息似乎沒有任何回報。

$client = curl_init('https://dev.kelunik.com/css/all.min.css') 

$log = fopen('/srv/www/Requestable/data/curl-log.txt', 'a+'); 

curl_setopt($client, CURLOPT_VERBOSE, 1); 
curl_setopt($client, CURLOPT_STDERR, $log); 
curl_setopt($client, CURLOPT_SSL_VERIFYPEER, true); 
curl_setopt($client, CURLOPT_SSL_VERIFYHOST, 2) 
curl_setopt($client, CURLOPT_CAINFO, __DIR__ . '/../../../../data/default.pem'); 
curl_setopt($client, CURLOPT_FAILONERROR, false); 
curl_setopt($client, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($client, CURLOPT_HEADER, true); 
curl_setopt($client, CURLINFO_HEADER_OUT, true); 
curl_setopt($client, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($client, CURLOPT_CUSTOMREQUEST, 'GET'); 
curl_setopt($client, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); 

if (!$response = curl_exec($client)) { 
    throw new CurlException('Making request failed: ' . curl_error($client) . '(' . curl_errno($client) . ')'); 
} 

fclose($log); 

上面的代碼始終引發的CurlException,並將errno 35,然而所定義的日誌文件保持爲空。

嘗試a different URI(帶有來自同一CA的證書)時,它只是起作用。我還檢查我的根CA束這是相當up2date的:從Mozilla的

證書數據下載上:週三09月03日3時12分03秒2014

還有什麼可以我檢查,以找出在具體是導致錯誤?

備註:URI既可以從瀏覽器中,以及從我的本地開發環境蠻好的請求

注2:我也嘗試過它無需手動設置這就造成了一個自定義的CA根束同樣的錯誤。

OpenSSL的版本:

Installed Packages 
Name  : openssl 
Arch  : x86_64 
Version  : 1.0.1e 
Release  : 30.el6_6.5 

捲曲版本:

curl 7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.16.2.3 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2 
Protocols: tftp ftp telnet dict ldap ldaps http file https ftps scp sftp 
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz 
+0

錯誤35是「未知的ssl錯誤」。你沒有從'curl_error()'調用中得到任何更具體的消息? – 2015-02-09 21:04:23

+0

我只得到超級有用的[「SSL連接錯誤」](https://requestable.pieterhordijk.com/4GCuvc)錯誤。 :( – PeeHaa 2015-02-09 21:09:45

+0

你使用的是什麼版本的OpenSSL? – 2015-02-09 21:34:56

回答

17

的問題是無關的證書鏈,它在dev.kelunik.com服務器配置。服務器只接受ECDHE密碼(ssllabs)。另一臺服務器接受更廣泛的密碼。 (ssllabs)。雖然你的OpenSSL支持ECDHE,但你使用的cURL版本是用NSS編譯的,而NSS並不支持。

您可以

curl https://dev.kelunik.com 

openssl s_client -connect dev.kelunik.com:443 -servername dev.kelunik.com 

你有這裏有兩個解決方案,輸出比較不改變你的發行版。如果您可以訪問其他服務器的配置,則可以將SSL密碼更改爲使用DHE/RSA密碼。確切的密碼列表將取決於服務器配置 - ssllabs在該主題上有一個很好的blog post

否則,您需要針對OpenSSL重新編譯cURL以訪問所有可用的密碼。基本說明請見http://curl.haxx.se/docs/install.html

+1

是的,這就是我所猜測的,我們目前使用Mozilla的這個列表:https ://wiki.mozilla.org/Security/Server_Side_TLS#Modern_compatibility – kelunik 2015-02-10 02:14:25

-1

我把你的代碼放在一個文件test.php中,並在命令行 php test上運行它。它運行得很好(在命令行上打印「完成」)。

以下是test.php的內容(從您的代碼中進行小修改)。我的PHP版本Zend Engine v2.4.0,它運行在Ubuntu 12.04上。

<?php> 
$client = curl_init('https://dev.kelunik.com/css/all.min.css'); 
$log = fopen('/tmp/curl-log.txt', 'a+'); 

curl_setopt($client, CURLOPT_VERBOSE, 1); 
curl_setopt($client, CURLOPT_STDERR, $log); 
curl_setopt($client, CURLOPT_SSL_VERIFYPEER, true); 
curl_setopt($client, CURLOPT_SSL_VERIFYHOST, 2); 
curl_setopt($client, CURLOPT_CAINFO, "/etc/ssl/certs/ssl-cert-snakeoil.pem"); 
curl_setopt($client, CURLOPT_FAILONERROR, false); 
curl_setopt($client, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($client, CURLOPT_HEADER, true); 
curl_setopt($client, CURLINFO_HEADER_OUT, true); 
curl_setopt($client, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($client, CURLOPT_CUSTOMREQUEST, 'GET'); 
curl_setopt($client, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); 

if (!$response = curl_exec($client)) { 
    throw new CurlException('Making request failed: ' . curl_error($client) . '(' . curl_errno($client) . ')'); 
} else { 
    echo "done!\n"; 
} 

fclose($log); 
?>