验证 curl 是否正在使用 TLS

2022-08-30 10:50:59

在我的PHP应用程序中,我使用PHP的CURL和opensl,使用SOAP进行连接和交谈。到目前为止,远程服务器支持SSL和TLS,但由于“贵宾犬”错误,管理员决定禁用SSL并仅使用TLS。在 1 月底之前支持 SSL。

我通过添加以下内容更改了我的代码:

curl_setopt($objCurl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);

从理论上讲,这应该迫使curl使用TLSv1.2。

但这是理论 - 我需要验证它是否真的使用TLS - 有什么方法可以做到这一点吗?有一个名为curl_getinfo()的方法,但它返回的信息对我来说没有用:

[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

提前致谢


答案 1

简答题

使用 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;

应输出用于连接的 TLS 版本。

深入挖掘

Curl 依靠底层的 OpenSSL(或 NSS)库来执行安全连接的协商。因此,我认为这里要问的正确问题是OpenSSL库能够做什么。如果它可以处理 TLS 连接,则 curl 可以处理 TLS 连接。

那么如何弄清楚openssl(或NSS)库的功能呢?

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

这将抛弃类似的东西

OpenSSL/1.0.1k

然后,您可以查看该版本的发行说明,看看它是否包含TLS支持。

OpenSSL 发行说明 - https://www.openssl.org/news/changelog.html

NSS 发行说明 - https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/NSS_Releases

剧透预警

  • openssl 包括对 OpenSSL 1.0.1 中的 TLS v1.1 和 TLS v1.2 的支持 [2012 年 3 月 14 日]
  • NSS 在 3.14 中包括对 TLS v1.1 的支持
  • NSS 在 3.15 中包括对 TLS v1.2 的支持

答案 2

使用 https://tlstest.paypal.com

例如:

$ curl https://tlstest.paypal.com/
ERROR! Connection is using TLS version lesser than 1.2. Please use TLS1.2

$ ./src/curl https://tlstest.paypal.com/
PayPal_Connection_OK

推荐