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

Я использую curl library (с 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 используется для подключения? Или я что-то упускаю?

Спасибо за любой совет!

4 ответа

Это интересная проблема.

Если вы запросите SSLLabs для этого сайта, вы увидите, что он поддерживает только различные шифры ECDHE-ECDSA- * и никакие другие шифры. Но в истории версий curl вы найдете ошибку с шифрами ECC и библиотекой NSS (которую вы используете), которая фиксируется только в curl версии 7.36 "nss: разрешить использование шифров ECC, если NSS реализует их" .

Поскольку вы используете curl 7.19.7, ваш завиток слишком старый, чтобы использовать необходимые шифры вместе с библиотекой 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 библиотеке curl, а не к nss.


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

curl_setopt($ch, CURLOPT_SSLVERSION_TLSv1_2);

To:

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

licensed under cc by-sa 3.0 with attribution.