如何让PHP中CURL请求默认使用TLS 1.2版本
从你的检测结果来看,当前环境里PHP的CURL默认只用到TLS 1.0,但手动指定CURLOPT_SSLVERSION=6可以正常使用TLS 1.2,下面给你几个不用重复写curl_setopt的全局解决方法:
方法1:封装全局CURL初始化函数(最安全可控)
创建一个自定义的CURL初始化函数,把默认TLS版本的设置封装进去,之后所有业务代码都调用这个函数代替原生的curl_init:
function custom_curl_init($url = null) { $ch = curl_init($url); // 强制默认使用TLS 1.2(6对应CURL_SSLVERSION_TLSv1_2) curl_setopt($ch, CURLOPT_SSLVERSION, 6); // 这里还可以添加其他你需要的全局默认选项,比如超时、SSL验证等 // curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); return $ch; }
使用的时候直接替换:
// 原来的代码 // $ch = curl_init('https://example.com'); // 替换成 $ch = custom_curl_init('https://example.com'); // 后续正常执行curl操作即可
这个方法的好处是不会影响其他系统或脚本的CURL行为,完全可控,也方便后续调整全局选项。
方法2:通过auto_prepend_file自动重写curl_init(无需修改业务代码)
如果你不想修改现有业务代码,可以利用PHP的auto_prepend_file配置,自动加载一个脚本重写原生的curl_init函数,自动注入TLS 1.2的设置:
- 创建一个全局配置脚本,比如
/usr/local/php/curl_global_setup.php,内容如下:
<?php // 保存原生curl_init的引用 $original_curl_init = 'curl_init'; function curl_init($url = null) { global $original_curl_init; // 调用原生函数创建句柄 $ch = $original_curl_init($url); // 自动设置TLS 1.2 curl_setopt($ch, CURLOPT_SSLVERSION, 6); return $ch; } ?>
- 编辑你的PHP配置文件(
php.ini,或者对应站点的php.d配置文件),添加一行:
auto_prepend_file = /usr/local/php/curl_global_setup.php
- 重启你的Web服务(Apache或PHP-FPM),让配置生效。
这样所有PHP脚本在执行前都会自动加载这个脚本,原生的curl_init会被替换成我们定义的函数,自动设置TLS 1.2。注意:如果有其他脚本也重写了curl_init,可能会出现冲突,建议测试后再上线。
方法3:系统级CURL配置(影响所有CURL客户端)
如果希望系统中所有使用CURL的程序(包括命令行curl和PHP的curl)都默认使用TLS 1.2,可以修改CURL的全局配置文件:
创建或编辑/etc/curlrc文件,添加以下内容:
tlsv1.2
保存后重启Web服务,PHP的CURL会读取这个配置,默认使用TLS 1.2。这个方法的缺点是会影响系统所有CURL调用,如果你只需要PHP的CURL生效,不建议用这个。
额外建议:考虑升级系统
CentOS 6.6已经是非常老旧的版本,官方早在2020年就停止了所有维护和安全更新,不仅加密协议支持有限,还存在很多安全隐患。如果条件允许,建议尽快升级到CentOS 7/8或者其他支持的发行版,从根本上解决这类兼容性和安全问题。
内容的提问来源于stack exchange,提问作者koalaok

