ThinkPHP 6 启用 MySQL SSL 证书校验需手动配置 PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,否则仅加密不校验;TP5.1 不支持该参数,须升级或手动 patch;sslmode 参数对 MySQL 无效。

ThinkPHP 6 连接 MySQL 启用 SSL 时证书校验不生效
默认情况下,ThinkPHP 的 PDO 连接不会主动启用服务端证书校验,即使你配置了 sslca、sslcert 等参数,只要没显式要求验证,MySQL 客户端(即 PDO)就只做加密连接,不校验证书有效性。
根本原因在于:PDO 的 MySQL 驱动依赖底层 libmysqlclient 或 mysqlnd,而 ThinkPHP 的数据库配置项只是透传给 PDO 构造函数,是否校验由 PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT 控制——这个选项 ThinkPHP 没有封装,也不在文档里提。
- 必须手动在
database.php的params中加入PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true - 同时确保
sslca指向有效的 CA 证书文件路径(如/etc/ssl/certs/ca.pem),且 PHP 进程有读取权限 - 若用的是自签名证书,CA 文件必须包含该证书的根或中间 CA,不能只放服务端证书
- Windows 下路径反斜杠需转义或改用正斜杠,否则
file_get_contents失败会导致连接静默回退到非 SSL
ThinkPHP 5.1 不支持 PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT 直接配置
TP5.1 的数据库配置解析逻辑硬编码了可透传参数白名单,PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT 不在其中,直接写进 params 会被忽略。
绕过方法只有两个:一是升级到 TP6;二是手动 patch 连接创建过程,在 think\db\connector\Mysql::connect() 中插入该属性。不推荐后者,维护成本高且易被框架更新覆盖。
- TP5.1 即使配置了
sslca,也仅等效于mysqli_ssl_set(),不触发证书链校验 - 错误现象:连接能成功,但抓包可见 TLS 握手后未发送 CertificateVerify,服务端日志无校验失败记录
- 临时验证方式:把 CA 文件内容故意删掉几行,如果连接仍成功,说明校验根本没启用
sslmode=require 在 ThinkPHP 中无效
PostgreSQL 用户熟悉的 sslmode=require 是 libpq 特性,MySQL 协议没有这个概念。ThinkPHP 数据库配置里写 'sslmode' => 'require' 不会报错,但也不会起作用——PDO MySQL 忽略所有未知键。
真正起作用的是三个组合:是否启用 SSL(sslca 存在即启用)、是否校验(PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT)、以及 CA 路径是否有效。
- 不要在 MySQL 配置里写
sslmode,它只对think\db\connector\Pgsql有意义 - 误写
sslmode=verify-full反而可能掩盖真实问题,因为配置项被丢弃,你还以为自己启用了严格模式 - 检查是否生效最简单的方式:在 MySQL 服务端开启
general_log,看连接时是否有SSL cipher和SSL verify相关日志
证书路径错误导致连接降级但无提示
ThinkPHP 不会对 sslca 路径做存在性或可读性校验。如果路径写错、权限不足、或文件为空,PDO 会静默放弃 SSL 连接,自动回落到普通 TCP 连接,且不抛异常、不打日志。
这种“静默降级”是最危险的情况:你以为连的是加密通道,实际流量明文传输。
- 务必在部署前用
php -r "echo file_get_contents('手动验证路径和内容/path/to/ca.pem');" - 避免使用相对路径,ThinkPHP 工作目录不固定(CLI/Web/Swoole 场景不同),一律用
__DIR__ . '/certs/ca.pem'这类绝对路径 - 若用 Docker,确认证书文件已挂载进容器内对应路径,且 SELinux/AppArmor 未拦截读取
证书校验链是否完整、路径是否真的可达、框架版本是否支持关键参数——这三个点串起来,才是 SSL 连接真正可信的最小闭环。漏掉任何一个,看着绿锁,其实没锁。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










