PHP连接MySQL启用SSL需先开启php.ini的openssl扩展,确认MySQL服务端have_ssl=YES并配置ssl-ca等证书路径,客户端优先用PDO设置SSL验证参数,mysqli则直接传MYSQLI_CLIENT_SSL标志。

php.ini里启用openssl扩展是前提
PHP 8.5.5 默认不强制开启 openssl 扩展,哪怕它自带 OpenSSL 1.1.1+ 支持。没开这个扩展,curl、file_get_contents、PDO、mysqli 等所有依赖 SSL/TLS 的功能都会直接失败或降级为明文。
打开你的 php.ini(通常在 C:\phpEnv\php\php.ini 或 /etc/php/8.5/apache2/php.ini),找到这行:
;extension=openssl
删掉开头的分号,改成:
extension=openssl
注意:Windows 下还要确认 php_openssl.dll 文件真实存在且路径正确;Linux/macOS 一般无需额外操作。改完后必须重启 Web 服务(Apache/Nginx)或 PHP-FPM 进程,否则无效。
立即学习“PHP免费学习笔记(深入)”;
验证是否生效:
- 运行
php -m | grep openssl(命令行) - 或写个
<?php phpinfo(); ?>页面,搜索 “OpenSSL support”,值必须是enabled
MySQL 连接启用 SSL 要绕过 mysqli::ssl_set()
PHP 8.5.5 的 mysqli 支持直接传 MYSQLI_CLIENT_SSL 标志连接,不需要、也不该调用 mysqli::ssl_set() —— 这是 phpEnv 用户最常踩的坑。一调就报 tlsv1 alert unknown ca,因为 phpEnv 没预置客户端证书,硬塞路径反而触发校验失败。
正确写法(仅加密,不校验证书):
$link = mysqli_init();<br>mysqli_real_connect($link, 'localhost', 'user', 'pass', 'db', 3306, null, MYSQLI_CLIENT_SSL);
如果要校验证书(推荐),需确保服务端已配好 ssl-ca,并在连接时传入 CA 路径(PDO 更常用,见下条):
-
mysqli_real_connect()不支持传 CA 路径,只能靠全局mysqli_ssl_set(),但该函数在 phpEnv 下极易因路径权限失败 - 更稳妥的做法是换用 PDO:用
PDO::MYSQL_ATTR_SSL_CA+PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true
ThinkPHP 6 配置 MySQL SSL 必须显式开启证书校验
ThinkPHP 默认只加密不校验,即使你填了 CA 路径,连接也可能是“假加密”——攻击者中间人劫持后仍能建立 TLS 连接。
在 config/database.php 的数据库连接 params 数组里,必须同时满足三项:
-
PDO::MYSQL_ATTR_SSL_CA => '/absolute/path/to/ca.pem'(绝对路径,Windows 用正斜杠或双反斜杠) -
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true(缺这个等于没校验) -
PDO::MYSQL_ATTR_SSL_CERT和PDO::MYSQL_ATTR_SSL_KEY不填(phpEnv 不需要客户端证书)
TP5.1 不支持 PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT,强行加会忽略,必须升级到 TP6 或打补丁。
验证是否真校验:临时删掉 CA 文件末尾几行,如果连接仍成功,说明校验根本没起作用,回头检查参数名是否拼错、路径是否可读、PHP 进程是否有权限。
phpEnv 下 MySQL SSL 服务端配置容易失效
phpEnv 自带的 MySQL 默认 have_ssl=DISABLED,光改 PHP 代码没用。必须先让服务端真正跑起来:
- 执行
mysql -u root -p -e "SHOW VARIABLES LIKE 'have_ssl';",返回YES才算启用 - 证书路径必须是绝对路径,且文件真实存在:
ssl-ca=C:/phpEnv/MySQL/ssl/ca.pem(注意 Windows 下用正斜杠) - 生成证书用
mysql_ssl_rsa_setup --datadir="C:/phpEnv/MySQL/data",生成后手动把ca.pem、server-cert.pem、server-key.pem复制到指定目录 -
server-key.pem权限必须是 600(Windows 下右键 → 属性 → 安全 → 取消继承,只留 Administrators 和 SYSTEM)
改完 my.ini 后一定要重启 MySQL 服务,不能只 reload。
最后提醒一句:SSL 加密 ≠ 证书校验。很多配置只做到前者,后者才是防中间人攻击的关键,而它恰恰最容易被跳过或配错。



















