2015-01-12 25 views
24

Trong ứng dụng PHP của tôi, tôi sử dụng CURL và openssl của PHP, để kết nối và nói chuyện bằng cách sử dụng SOAP. Cho đến nay, máy chủ từ xa hỗ trợ SSL và TLS nhưng do lỗi "poodle", quản trị viên đã quyết định tắt SSL và chỉ sử dụng TLS. SSL được hỗ trợ cho đến cuối tháng 1.Xác minh nếu curl đang sử dụng TLS

tôi đã thay đổi mã của tôi bằng cách thêm:

curl_setopt($objCurl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2); 

Đó trong lý thuyết nên buộc curl sử dụng TLSv1.2.

Nhưng đó là lý thuyết - tôi cần phải xác minh rằng nó thực sự sử dụng TLS - có phương pháp nào cho điều đó không? Có một phương pháp gọi là curl_getinfo(), nhưng thông tin nó sẽ trả về không phải là hữu ích cho tôi:

[url] => https://www.example.com/soap/MessagingPort 
[content_type] => text/xml;charset=utf-8 
[http_code] => 200 
[header_size] => 293 
[request_size] => 882 
[filetime] => -1 
[ssl_verify_result] => 0 
[redirect_count] => 0 
[total_time] => 0.164487 
[namelookup_time] => 3.4E-5 
[connect_time] => 3.4E-5 
[pretransfer_time] => 0.000122 
[size_upload] => 604 
[size_download] => 178 
[speed_download] => 1082 
[speed_upload] => 3672 
[download_content_length] => 178 
[upload_content_length] => 604 
[starttransfer_time] => 0.164477 
[redirect_time] => 0 

Big Cảm ơn trước

+0

Bạn có thể kiểm tra cái bắt tay với một số loại sniffer mạng, hoặc nếu bạn có thể, vô hiệu hóa SSL và TLS 1.0 và 1.1 trên máy chủ nên nó * có * để kết nối với TLS 1.2. – vcsjones

+1

Kịch bản hoạt động trên một lưu trữ được chia sẻ để không có cách nào để đánh hơi nó.Tôi đã buộc Apache trên máy chủ dev của tôi sử dụng TLS và nó hoạt động nhưng tôi không có cách nào để kiểm tra nó trong sản xuất. Sau một vài năm sử dụng php, bạn bắt đầu không chấp nhận mọi thứ. Tôi vẫn cần một cách để có được "bạn đang sử dụng TLS" trên màn hình. Tôi cũng gặp sự cố trên Debian của mình với CURL_SSLVERSION_TLSv1_2 không được xác định và phải thay đổi dòng thành: curl_setopt ($ objCurl, CURLOPT_SSLVERSION, 6); – kayo

Trả lời

58

ngắn trả lời

Thực hiện một yêu cầu với curl để https://www.howsmyssl.com/

<?php 
$ch = curl_init('https://www.howsmyssl.com/a/check'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$data = curl_exec($ch); 
curl_close($ch); 

$json = json_decode($data); 
echo $json->tls_version; 

nên xuất phiên bản TLS nào được sử dụng để kết nối.

Đào sâu

Curl dựa trên thư viện OpenSSL cơ bản (hay NSS) để thực hiện việc đàm phán các kết nối an toàn. Vì vậy, tôi tin rằng câu hỏi đúng để hỏi ở đây là thư viện OpenSSL có khả năng là gì. Nếu nó có thể xử lý một kết nối TLS, thì curl có thể xử lý một kết nối TLS.

Vậy làm thế nào để tìm ra thư viện openssl (hoặc NSS) nào có khả năng?

<?php  
$curl_info = curl_version(); 
echo $curl_info['ssl_version']; 

đó là sẽ đổ ra một cái gì đó giống như

OpenSSL/1.0.1k 

Sau đó, bạn có thể đi và có một cái nhìn tại các ghi chú phát hành cho phiên bản đó và xem nếu nó bao gồm hỗ trợ TLS.

OpenSSL Ghi chú phát hành - https://www.openssl.org/news/openssl-1.0.1-notes.html

NSS Ghi chú phát hành - https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/NSS_Releases

Spoiler Alert

  • openssl bao gồm hỗ trợ cho TLS v1.1 và TLS v1.2 trong OpenSSL 1.0.1 [14 Mar 2012]
  • NSS bao gồm hỗ trợ cho TLS v1.1 trong 3.14
  • NSS bao gồm hỗ trợ TLS v1.2 trong 3,15
+0

Tôi đã làm curl để howsmyssl và nó trả về 'lỗi: 1407742E: SSL thói quen: SSL23_GET_SERVER_HELLO: tlsv1 giao thức cảnh báo phiên bản'. Nó từ chối ssl v2/3? https://twitter.com/jmhodges/status/420614636606468096. Tôi phải làm gì trong trường hợp này? –

+0

Với logic php thứ hai, máy chủ của tôi chỉ ra "NSS/3.19.1 ECC cơ bản" có nghĩa là hỗ trợ cho TLS v1.2, tuy nhiên logic php đầu tiên trả về "TLS 1.0"? Tôi cần làm gì để hỗ trợ TLS 1.2? – panofish

+0

Nevermind để bình luận trước đây của tôi ... Tôi chỉ cần thêm mã sau trong logic php # 1 và bây giờ tôi nhận được TLS 1.2 'curl_setopt ($ ch, CURLOPT_SSLVERSION, 6); ' – panofish

Các vấn đề liên quan