php - 如何将 php 设置为默认为 curl 请求使用特定的 TLS 版本?
问题描述
在互联网上搜索,我发现了以下脚本来确定我在服务器上使用的版本:
<?php
function get_tls_version($sslversion = null)
{
$c = curl_init();
curl_setopt($c, CURLOPT_URL, "https://www.howsmyssl.com/a/check");
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
if ($sslversion !== null) {
curl_setopt($c, CURLOPT_SSLVERSION, $sslversion);
}
$rbody = curl_exec($c);
if ($rbody === false) {
$errno = curl_errno($c);
$msg = curl_error($c);
curl_close($c);
return "Error! errno = " . $errno . ", msg = " . $msg;
} else {
$r = json_decode($rbody);
curl_close($c);
return $r->tls_version;
}
}
echo "<pre>\n";
echo "OS: " . PHP_OS . "\n";
echo "uname: " . php_uname() . "\n";
echo "PHP version: " . phpversion() . "\n";
$curl_version = curl_version();
echo "curl version: " . $curl_version["version"] . "\n";
echo "SSL version: " . $curl_version["ssl_version"] . "\n";
echo "SSL version number: " . $curl_version["ssl_version_number"] . "\n";
echo "OPENSSL_VERSION_NUMBER: " . dechex(OPENSSL_VERSION_NUMBER) . "\n";
echo "TLS test (default): " . get_tls_version() . "\n";
echo "TLS test (TLS_v1): " . get_tls_version(1) . "\n";
echo "TLS test (TLS_v1_2): " . get_tls_version(6) . "\n";
echo "</pre>\n";
?>
该脚本提供以下结果:
OS: Linux
uname: Linux ....
PHP version: 5.6.11
curl version: 7.19.7
SSL version: NSS/3.27.1
SSL version number: 0
OPENSSL_VERSION_NUMBER: 1000105f
TLS test (default): TLS 1.0
TLS test (TLS_v1): TLS 1.2
TLS test (TLS_v1_2): TLS 1.2
请注意,我在执行系统或软件包升级方面受到限制。我在 CentOS 6.6 版(最终版)服务器上。
如何在 PHP 中设置(因为它可用) TLS 测试(默认): TLS 1.0 变为 TLS 1.2 ?
我想避免设置类似:
curl_setopt ($curl, CURLOPT_SSLVERSION, 6);
// 5 (for CURL_SSLVERSION_TLSv1_1) or 6 (for CURL_SSLVERSION_TLSv1_2)
...每次我需要在我的 php 项目中实例化一个 curl。
我想覆盖php使用的默认值而不是SSLVERSION(某处,在哪里?)
解决方案
不,没有强制 curl 使用 tls1.2/tls1.3 的全局选项(没有全局变量,没有全局函数,没有全局 ini 配置)。您可以修补 curl 扩展以满足您的要求,但您说您在执行系统或软件包升级方面受到限制。
一种可能的方法是编写自己的curl_init
,例如:
function curl_init_tls12()
{
$c = curl_init();
curl_setopt($c, CURLOPT_SSLVERSION, ...);
return $c;
}
并记住在任何地方都使用自己的curl_init_tls13
。
推荐阅读
- r - 抑制输出,在 R markdown 中保持 pander 和绘图
- javascript - Res.download() 使用 html 表单提交但不是 Axios 后调用
- php - 无法在 MACOSX 上启动 MAMP
- spring-security-oauth2 - 如何使用 oauth2 在 Spring 应用程序中创建 WebClient 对象
- javascript - [@angular/compiler 和 @angular/core] 中的 Ionic 3 到 4 升级构建错误
- python - 为什么 cv2.resize() 不适用于整数数组?
- jenkins - Jenkins Pipelines 下载工具
- python - 有没有办法在一个圆圈周围(或内部)旋转文本?
- python - 使用 wxPython + pymupdf 抗锯齿渲染的 PDF
- ionic-framework - 带有cordova-plugin-ionic-keyboard的工具栏按钮是否存在?