配置mysql ssl连接需先确认ssl支持,生成证书和密钥,配置文件中指定路径并重启服务,最后设置用户强制使用ssl。具体步骤包括检查have_ssl变量,用mysql_ssl_rsa_setup或openssl生成证书,正确设置文件权限与归属,在my.cnf中添加ssl-ca、ssl-cert、ssl-key配置项,重启mysql后通过show variables验证,创建或修改用户require ssl,并用mysql命令加--ssl-mode=required测试连接,status查看ssl协议信息。整个过程关键在于证书路径正确且mysqld可读。

phpEnv 中 MySQL 默认不启用 SSL,必须手动配置证书并修改服务启动参数,否则 mysql_ssl_set() 会静默失效、连接仍走明文。
确认 MySQL 是否支持 SSL
进入 phpEnv 自带的 MySQL(通常是 MariaDB 或 MySQL 5.7+),执行:
mysql -u root -p -e "SHOW VARIABLES LIKE '%ssl%';"
关键看 have_ssl 是否为 YES;若为 DISABLED 或空值,说明未编译 SSL 支持或未加载证书。phpEnv 的精简版 MySQL 常默认关闭 SSL,需替换为完整版或重新编译。
生成并放置 SSL 证书文件
phpEnv 通常使用 mysql\bin\ 下的 mysqld.exe 启动服务,证书需放在其可读路径(如 mysql\ssl\),且权限不能过于宽松(Windows 下可忽略组权限,但需确保 mysqld 进程能读取)。
用 OpenSSL 生成(推荐自签名,仅用于内网开发环境):
- 生成 CA 私钥和证书:
openssl genrsa 2048 > ca-key.pem && openssl req -new -x509 -nodes -days 3650 -key ca-key.pem -out ca.pem - 生成服务器私钥和 CSR:
openssl req -newkey rsa:2048 -days 3650 -nodes -keyout server-key.pem -out server-req.pem - 签发服务器证书:
openssl x509 -req -in server-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem - 生成客户端私钥与证书(可选,但
mysql_ssl_set()调用时需提供):openssl req -newkey rsa:2048 -days 3650 -nodes -keyout client-key.pem -out client-req.pem && openssl x509 -req -in client-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -set_serial 02 -out client-cert.pem
将 ca.pem、server-cert.pem、server-key.pem 放入 mysql\ssl\ 目录(不存在则新建),确保路径不含中文和空格。
修改 my.ini 并重启 MySQL 服务
编辑 phpEnv 对应 MySQL 实例的配置文件(如 mysql\my.ini),在 [mysqld] 段落下添加:
[mysqld] ssl-ca=D:/phpEnv/mysql/ssl/ca.pem ssl-cert=D:/phpEnv/mysql/ssl/server-cert.pem ssl-key=D:/phpEnv/mysql/ssl/server-key.pem
⚠️ 注意:D:/phpEnv/mysql/ssl/ 必须是绝对路径,且反斜杠要写成正斜杠或双反斜杠;Windows 下路径中若含空格(如 Program Files),必须用英文引号包裹整个路径值。
保存后,通过 phpEnv 控制面板「重启 MySQL」——不是只停止再启动,必须触发完整 reload。验证是否生效仍用 SHOW VARIABLES LIKE '%ssl%',此时 ssl_ca、ssl_cert、ssl_key 应显示对应路径,have_ssl 为 YES。
PHP 连接时启用强制 SSL 并验证证书
仅设置 mysql_ssl_set() 不够,必须配合 MYSQLI_CLIENT_SSL 标志,并确保 mysqli 实例创建时传入该标志。常见错误是调用 mysql_ssl_set() 后仍用普通 mysqli_connect(),导致 SSL 不启用。
正确写法示例:
$mysqli = mysqli_init();
mysqli_options($mysqli, MYSQLI_OPT_SSL_CA, 'D:/phpEnv/mysql/ssl/ca.pem');
mysqli_options($mysqli, MYSQLI_OPT_SSL_CERT, 'D:/phpEnv/mysql/ssl/client-cert.pem');
mysqli_options($mysqli, MYSQLI_OPT_SSL_KEY, 'D:/phpEnv/mysql/ssl/client-key.pem');
$mysqli->real_connect('127.0.0.1', 'root', 'password', 'test', 3306, NULL, MYSQLI_CLIENT_SSL);
连接成功后,执行 SELECT @@session.ssl_cipher;,返回非空字符串即表示已走加密通道。若返回空,检查:MySQL 错误日志是否有 SSL error: Unable to get private key 类报错;PHP 进程是否对证书文件有读取权限;路径是否拼写错误(尤其大小写和扩展名)。
容易被忽略的是:phpEnv 多实例环境下,每个 MySQL 实例可能有独立的 my.ini 和证书路径,切勿复用主配置;且部分 phpEnv 版本打包的 MySQL 不含 openssl.dll 依赖,需手动从 MySQL 官方压缩包中提取并放入 mysql\bin\ 目录。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











