Я использую библиотеку curl (с NSS) в PHP для подключения к моему другому серверу. Все было хорошо до прошлой недели, когда сервер назначения прекратил поддержку SSLv3 из-за уязвимости пуделя (кстати, CloudFlare). Сейчас я пытаюсь установить соединение, используя TLS, но я все еще получаю «Ошибка SSL-соединения».
Вот пример кода, я использую:
$ch = curl_init();
curl_setopt_array( $ch, array(
CURLOPT_URL => 'https://www.lumiart.cz',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSLVERSION => 1,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_VERBOSE => true
) );
$output = curl_exec( $ch );
echo $output;
print_r( curl_getinfo( $ch ) );
echo 'error:' . curl_error( $ch );
curl_close($ch);
Из моего понимания, установка CURLOPT_SSLVERSION
в 1
должен форсировать соединение через TLS.
Примечание: у меня есть CURLOPT_SSL_VERIFYPEER => false
просто для отладки, и я не собираюсь оставлять это там, как только я решу эту проблему.
Это вывод:
Array
(
[url] => https://www.lumiart.cz
[content_type] =>
[http_code] => 0
[header_size] => 0
[request_size] => 0
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0
[namelookup_time] => 2.3E-5
[connect_time] => 0.005777
[pretransfer_time] => 0
[size_upload] => 0
[size_download] => 0
[speed_download] => 0
[speed_upload] => 0
[download_content_length] => -1
[upload_content_length] => -1
[starttransfer_time] => 0
[redirect_time] => 0
[certinfo] => Array
(
)
[primary_ip] => 2400:cb00:2048:1::681c:86f
[redirect_url] =>
)
error:SSL connect error
У меня есть все это у провайдера виртуального хостинга, поэтому я не могу изменить конфигурацию php.ini или обновить какие-либо компоненты. Все, что у меня есть, это phpinfo (). Я проверил поддержку TLS на этих версиях компонентов, и все должно быть в порядке. Вот выдержка из phpinfo:
PHP Version 5.4.32
System Linux wl42-f262 2.6.32-431.5.1.el6.x86_64 #1 SMP Wed Feb 12 00:41:43 UTC 2014 x86_64
curl:
cURL support enabled
cURL Information 7.19.7
Age 3
Features
AsynchDNS No
Debug No
GSS-Negotiate Yes
IDN Yes
IPv6 Yes
Largefile Yes
NTLM Yes
SPNEGO No
SSL Yes
SSPI No
krb4 No
libz Yes
CharConv No
Protocols tftp, ftp, telnet, dict, ldap, ldaps, http, file, https, ftps, scp, sftp
Host x86_64-redhat-linux-gnu
SSL Version NSS/3.15.3
ZLib Version 1.2.3
libSSH Version libssh2/1.4.2
Я думаю, что проблема заключается в использовании SSLv3 вместо TLS, но я не уверен на 100%. Все, что я получаю, это «ошибка подключения SSL», и я не знаю, как узнать, какая версия SSL использовалась для подключения.
Есть ли способ, как проверить, какая версия SSL используется для подключения? Или я что-то упустил?
Спасибо за любой совет!
Это интересная проблема.
Если вы запросите SSLLabs для этого сайта вы увидите, что он поддерживает только различные шифры ECDHE-ECDSA- * и никаких других шифров. Но в версия истории curl вы найдете ошибку с шифрами ECC и библиотекой NSS (которую вы используете), которая исправлена только в curl версии 7.36 msgstr «nss: разрешить использование шифров ECC, если NSS их реализует».
Поскольку вы используете curl 7.19.7, ваш curl слишком стар, чтобы использовать необходимые шифры вместе с библиотекой NSS. Это означает, что вам нужно обновить библиотеку curl.
У меня есть Curl 7.21.7 и PHP 5.4.34, и это казалось сделать трюк для меня:
curl_setopt($curl_request, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
Больше информации Вот, хотя это не говорит, когда CURL_SSLVERSION_TLSv1 был представлен.
Двойной ответ Ошибка SSL не может измениться на TLS предложил :
Попробуйте добавить CURLOPT_SSL_CIPHER_LIST => ‘TLSv1’ в ваш файл PPHttpConfig.php.
(и обсуждается здесь Обновить запрос PHP cURL с SSLv3 на TLS ..? тоже ).
Как полезно прокомментировано, это относится к OpenSSL библиотека скручивания, не NSS.
Для меня ответом было использование целочисленного значения вместо строки .. т.е.
Изменить:
curl_setopt($ch, CURLOPT_SSLVERSION_TLSv1_2);
Для того, чтобы:
curl_setopt($ch, CURLOPT_SSLVERSION, 6);
Или для tlsv1_1:
curl_setopt($ch, CURLOPT_SSLVERSION, 5);
Вот полный список:
CURL_SSLVERSION_DEFAULT (0)
CURL_SSLVERSION_TLSv1 (1)
CURL_SSLVERSION_SSLv2 (2)
CURL_SSLVERSION_SSLv3 (3)
CURL_SSLVERSION_TLSv1_0 (4)
CURL_SSLVERSION_TLSv1_1 (5)
CURL_SSLVERSION_TLSv1_2 (6)
Кстати, я запускаю следующее:
curl-7.19.7-46.el6.x86_64
nss-3.21.0-0.3.el6_7.x86_64