2014-10-19 15 views
10

Tôi đang sử dụng thư viện curl (có NSS) trong PHP để kết nối với máy chủ khác của tôi. Mọi thứ đều ổn cho đến tuần trước, khi máy chủ đích dừng hỗ trợ SSLv3 do lỗ hổng của kẻ xáo trộn (CloudFlare bằng cách này). Bây giờ, tôi đang cố gắng để làm cho kết nối bằng cách sử dụng TLS, nhưng tôi vẫn nhận được "lỗi kết nối SSL".PHP Curl (có NSS) có thể đang sử dụng SSLv3 được tạo bởi TLS khi kết nối với https

Có mẫu mã, Tôi đang sử dụng:

$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); 

Từ hiểu biết của tôi, thiết CURLOPT_SSLVERSION để 1 nên buộc kết nối thông qua TLS.

Lưu ý: Tôi có CURLOPT_SSL_VERIFYPEER => false chỉ để gỡ lỗi và tôi không có ý định để nó ở đó, khi tôi tìm ra vấn đề này.

Đây là kết quả:

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 

Tôi có tất cả những điều này tại nhà cung cấp lưu trữ chia sẻ, vì vậy tôi không thể thay đổi bất kỳ cấu hình php.ini hoặc cập nhật bất kỳ thành phần. Tất cả những gì tôi có là phpinfo(). Tôi đã kiểm tra hỗ trợ TLS trên các phiên bản thành phần này và nó sẽ ổn. Đây là trích đoạn của 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 

Tôi nghĩ rằng, vấn đề đó là sử dụng SSLv3 thay vì TLS, nhưng tôi không chắc chắn 100%. Tất cả tôi nhận được là "lỗi kết nối SSL" và tôi không biết, làm thế nào để tìm hiểu, phiên bản SSL nào được sử dụng để kết nối.

Có cách nào hay không, cách kiểm tra, phiên bản SSL nào được sử dụng để kết nối? Hay tôi đang thiếu một cái gì đó?

Cảm ơn lời khuyên nào!

+0

"Tôi không thể thay đổi bất kỳ cấu hình php.ini hoặc cập nhật bất kỳ thành phần" - nhưng máy chủ của bạn có thể, và có nhiều hoặc ít hơn bắt buộc đối với các vấn đề bảo mật như thế này, do đó bạn cũng nên nói chuyện với họ. Tôi đã có một vấn đề tương tự trong Java một thời gian trở lại nơi nó mặc định để sử dụng bắt tay SSLv3 ngay cả khi nó chỉ được phép sử dụng nó thương lượng TLSv1 +, và máy chủ tôi đã nói để từ chối chấp nhận SSLv3 ngay cả cho cái bắt tay, để có thể vấn đề ở đây nhưng tôi sẽ không biết làm thế nào để nói xin lỗi. – Rup

+0

Cảm ơn, tôi đã kiểm tra phiên bản của những thành phần đó (php, curl, NSS), và tất cả chúng đều tốt với hỗ trợ TLS. Họ không phải là lỗi thời, vì vậy tôi không biết, nếu cập nhật sẽ làm cho bất kỳ sự khác biệt ngay cả khi tôi thuyết phục chủ nhà của tôi để làm điều đó. – Lapak

+0

@Lapak bạn đã tìm ra điều này? Tôi đang cố gắng để kết nối với một máy chủ với TLS vì nó vô hiệu hóa SSL nó chỉ sẽ không có vẻ để cho tôi. – LefterisL

Trả lời

20

Đó là một vấn đề thú vị.

Nếu bạn truy vấn SSLLabs cho trang web này, bạn sẽ thấy, rằng nó chỉ hỗ trợ các thuật toán mã hóa ECDHE-ECDSA- * khác nhau và không có mật mã khác. Nhưng, trong version history of curl bạn sẽ tìm thấy một lỗi với mật mã ECC và thư viện NSS (mà bạn sử dụng) mà chỉ được sửa trong phiên bản curl 7.36 "nss: allow to use ECC ciphers if NSS implements them".

Vì bạn đang sử dụng curl 7.19.7 curl của bạn quá cũ để sử dụng mật mã cần thiết cùng với thư viện NSS. Điều này có nghĩa là bạn cần nâng cấp thư viện curl của mình.

+1

Tôi sẽ không bao giờ kết nối tất cả những điều đó với nhau :) cảm ơn! Tôi sẽ cố gắng để lỗi máy chủ của tôi về điều đó. – Lapak

+0

Điều này đang trở thành một vấn đề lớn với rất nhiều nhà cung cấp dịch vụ giết SSL và yêu cầu bạn chuyển sang TLS. Tôi nhận được rất nhiều yêu cầu hỗ trợ từ người dùng các công cụ mà máy chủ web của họ có phiên bản cURL trước và không sẵn sàng cập nhật nó (vì bất kỳ lý do gì). –

+0

Tôi nghĩ rằng tôi đã tìm ra điều này khi tôi tìm thấy câu trả lời của bạn ở đây, nhưng bây giờ tôi có người đang chạy cURL 7.38.0 đang gặp lỗi này khi tôi đặt TLSv1 cụ thể: "Mật mã không xác định trong danh sách: TLSv1". Làm thế nào tôi có thể nhận được điều này làm việc cho tất cả mọi người bất kể phiên bản cURL của họ? Rất bối rối ngay bây giờ. –

12

Tôi có Curl 7.21.7 và PHP 5.4.34, và này dường như để làm các trick cho tôi:

curl_setopt($curl_request, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);

Thông tin thêm here, mặc dù nó không nói khi CURL_SSLVERSION_TLSv1 là giới thiệu.

+0

Cảm ơn bạn, nhưng điều này không hoạt động trong thiết lập của tôi. Tôi vẫn gặp lỗi "Lỗi kết nối SSL". Tôi đã thử cũng CURL_SSLVERSION_TLSv1_0 và như vậy, nhưng họ không làm việc, hoặc, như mong đợi (kể từ khi chúng được thêm vào trong các phiên bản sau) – Lapak

2

Duplicate câu trả lời SSL error can not change to TLS đề xuất:

Hãy thử thêm CURLOPT_SSL_CIPHER_LIST => 'TLSv1' để PPHttpConfig.php của bạn.

(và được thảo luận tại đây Update PHP cURL request from SSLv3 to TLS..? quá).

Như đã nhận xét một cách hữu ích, điều này áp dụng cho openssl thư viện curl, không phải nss.

+0

Tôi đã cố gắng đó, nhưng nó không phải là trường hợp của tôi. Cài đặt chính xác này chỉ hoạt động cho OpenSSL.Đối với NSS, danh sách các cyphers có thể được tìm thấy ở đây: https://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html nhưng không ai trong số các cyphers ECDHE không làm việc cho tôi. Rất có thể là do phiên bản curl/NNS mà máy chủ của tôi có, như đã đề cập trước đây. Cảm ơn bạn đã đánh giá! – Lapak

2

Câu trả lời cho tôi là sử dụng một giá trị số nguyên thay vì một chuỗi .. ví dụ: Thay đổi:

curl_setopt($ch, CURLOPT_SSLVERSION_TLSv1_2); 

Để:

curl_setopt($ch, CURLOPT_SSLVERSION, 6); 

Hoặc cho tlsv1_1:

curl_setopt($ch, CURLOPT_SSLVERSION, 5); 

Đây là danh sách đầy đủ:

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) 

Tôi đang chạy sau bằng cách này:

curl-7.19.7-46.el6.x86_64 
nss-3.21.0-0.3.el6_7.x86_64 
Các vấn đề liên quan