2015-02-09 4 views
4

Я пытаюсь сделать запрос cURL в PHP на URL. Что бы я ни старался, я всегда получаю 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 сверток, который является довольно up2date:

Сертификат данные Mozilla скачать на: Ср Сен 3 03:12:03 2014

Что еще я могу проверить, чтобы выяснить, что в ошибка вызывает ошибку?

Примечание: URI может быть запрошено как из браузера, а также от моей местного Dev среды просто отлично

Примечание 2: Я также попробовал без установки вручную корневого пакета пользовательского ЦСА в результате которого та же ошибка.

версия OpenSSL:

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

Curl версия:

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()'? –

+0

Я получаю исключительно полезную ошибку [«Ошибка подключения SSL»] (https://requestable.pieterhordijk.com/4GCuvc). :( – PeeHaa

+0

Какая версия OpenSSL вы используете? –

ответ

17

Проблема не связана с вашей цепочки сертификатов, это конфигурация сервера на dev.kelunik.com. Сервер принимает только шифры ECDHE (ssllabs). Другой сервер принимает более широкий диапазон шифров. (ssllabs). Хотя ваш OpenSSL поддерживает ECDHE, версия cURL, которую вы используете, скомпилирована с помощью NSS, а это не так.

Вы можете сравнить вывод с

curl https://dev.kelunik.com 

и

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

У вас есть два решения здесь без изменения дистрибутива. Если у вас есть доступ к конфигурации другого сервера, вы можете изменить шифры SSL для использования шифров DHE/RSA. Точный список шифров будет зависеть от конфигурации сервера. Ssllabs имеет хороший blog post по этому вопросу.

В противном случае вам потребуется перекомпилировать cURL против OpenSSL для доступа ко всем доступным шифрам. Основные инструкции доступны по адресу http://curl.haxx.se/docs/install.html.

+1

Да, это то, что я бы догадался. В настоящее время мы используем этот список из Mozilla: https : //wiki.mozilla.org/Security/Server_Side_TLS#Modern_compatibility – kelunik

-1

Я поместил ваш код в файл test.php и запустил его в командной строке php test.php, он отлично работал (печатается «done» в командной строке).

Информация о файле 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); 
?> 
Смежные вопросы