PHP curl : enforce low TLS version

标签 php ssl curl php-curl

目标是为 TLS v1.2 连接编写 PHP 代码测试。获得成功的答案不是问题,但我不能通过在 PHP 中使用旧的 TLS 版本来产生失败。显然需要测试失败来证明代码的正确性(在某种合理程度上)。

在命令行上我可以想出这个,给出一个明确的区别:

$ curl -X POST https://api.paypal.com/v1/oauth2/token 
{"name":"AUTHENTICATION_FAILURE", [...]

$ curl --tls-max 1.1 -X POST https://api.paypal.com/v1/oauth2/token 
curl: (35) error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure

在 PHP 中我试过这个...

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.paypal.com/v1/oauth2/token');
curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
// $response: '{"name":"AUTHENTICATION_FAILURE", [...]

... 这意味着成功的 TLS v1.2 连接,正如在上面的 CLI 示例中所见,尽管请求的是 TLS v1.1。这与请求 CURL_SSLVERSION_TLSv1_2 时的结果相同。

这是带有 cURL 7.64.0 的 PHP 7.3.7,我希望我可以不用为了禁用 TLS v1.2 支持而重新编译 PHP。

最佳答案

要回答我自己的问题,文档位于 https://www.php.net/function.curl-setopt是/已经过时了。 cURL 7.54 更改了 CURL_SSLVERSION_ 宏的行为,这些现在设置了连接的最低可接受 TLS 版本。它还引入了 CURL_SSLVERSION_MAX_ 宏,它设置了尝试的最大 TLS 版本。在更新 PHP 文档之前,请参阅 https://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html .

因此,限制与 TLS v1.1 的连接是这样的:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.paypal.com/v1/oauth2/token');
curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_MAX_TLSv1_1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);

关于PHP curl : enforce low TLS version,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57297524/

相关文章:

php - php数组的空返回值

php - Codeigniter 库中的短函数

ssl - nginx ssl 配置,服务器证书与 url 不匹配

laravel - 通过 homestead box 的 ssl 导致 chrome 阻止该站点

curl - Elasticsearch:无法通过 curl 连接,奇怪的不一致行为

php - 我可以单独使用 iframe、HTML 和 CSS 在另一个外部网站上显示我的博客的博客标题吗

php - 从 mssql 触发器运行 php 脚本

c# - wcf 为什么我看不到我的 https 站点

php - 如何将命令行中的curl文件post转换为PHP cURL

git - 如何使用 curl 下载 gitlab CI/CD 工件?