PHP Curl (с NSS), вероятно, использует SSLv3 insted TLS при подключении к https

Я использую библиотеку 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 «nss: разрешить использование шифров ECC, если NSS реализует их» .

Поскольку вы используете curl 7.19.7, ваш завиток слишком старый, чтобы использовать необходимые шифры вместе с библиотекой NSS. Это означает, что вам нужно обновить свою библиотеку завитушек.

У меня есть 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 ..? ).

Как хорошо прокомментировано, это применимо к библиотеке rots rotsl , а не к nss .

Ответ для меня состоял в том, чтобы использовать целое значение вместо строки .. ie: Change:

 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