PHP Curl (с NSS), вероятно, использует SSLv3 вместо 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 я понимаю, установка 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 используется для подключения? Или я что-то упустил?

Ответ 1

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

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

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

Ответ 2

У меня есть Curl 7.21.7 и PHP 5.4.34, и это, похоже, делает трюк для меня:

curl_setopt($curl_request, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);

Подробнее здесь, хотя он не говорит, когда был введен CURL_SSLVERSION_TLSv1.

Ответ 4

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

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