簡體   English   中英

當連接到https時,PHP Curl(使用NSS)可能使用SSLv3而不是TLS

[英]PHP Curl (with NSS) is probably using SSLv3 instead of TLS when connecting to https

我在PHP中使用curl庫(使用NSS)連接到我的其他服務器。 直到上周,由於poodle漏洞(順便說一下CloudFlare),目標服務器停止支持SSLv3,一切都很好。 現在,我正在嘗試使用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_SSLVERSION1應強制通過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,但我不是百分百肯定。 所有我得到的是“SSL連接錯誤”,我不知道,如何找出,用於連接的SSL版本。

有沒有辦法,如何檢查,哪個SSL版本用於連接? 或者我錯過了什么?

這是一個有趣的問題。

如果您查詢此站點的SSLLabs ,您將看到它只支持各種ECDHE-ECDSA- *密碼而不支持其他密碼。 但是,在curl版本歷史中,你會發現ECC密碼和NSS庫(你使用的)的一個錯誤,它只在curl版本7.36 “nss中修復:如果NSS實現它們,允許使用ECC密碼”

由於您使用的是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。

我的答案是使用整數值而不是字符串..即:更改:

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

重復答案SSL錯誤無法更改為建議的TLS

嘗試將CURLOPT_SSL_CIPHER_LIST =>'TLSv1'添加到PPHttpConfig.php。

(並在此處討論將SSL cURL請求從SSLv3更新到TLS ..? )。

有用的評論,這適用於openssl curl庫,而不是nss

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM