mysql服务端启用ssl必须同时满足四点:证书有效且路径正确、server-key.pem权限为600、require_secure_transport=on强制启用、重启mysqld生效;仅have_ssl=yes不代表真正启用。

MySQL 服务端配 SSL 不是“开了就行”,必须同时满足证书有效、路径正确、权限合规、require_secure_transport 强制启用这四点,缺一不可。
确认 MySQL 是否真正支持并已加载 SSL
别只查 have_ssl 是不是 YES——它只表示编译时带了 OpenSSL 支持。真正关键的是:
-
SHOW VARIABLES LIKE 'ssl_ca';、ssl_cert、ssl_key必须返回非空的绝对路径,且文件真实存在 -
SHOW VARIABLES LIKE 'require_secure_transport';必须为ON(MySQL 5.7.12+),这是强制走 SSL 的开关;旧版本用skip_ssl=OFF不够可靠 - 如果
ssl_mode显示DISABLED或为空,说明配置未生效,大概率是证书路径错、权限不对或 MySQL 启动时静默跳过
生成证书:优先用 mysql_ssl_rsa_setup,别手写 OpenSSL 命令
MySQL 5.7.6+ 自带工具能绕过 CN 匹配、subjectAltName 缺失、私钥加密等常见坑,比手动 openssl 更稳:
- 执行:
mysql_ssl_rsa_setup --datadir=/var/lib/mysql(路径必须和你的datadir完全一致) - 检查生成的文件:
ca.pem、server-cert.pem、server-key.pem是否都在指定目录下 - 立刻修正权限:
chown mysql:mysql /var/lib/mysql/*.pem && chmod 600 /var/lib/mysql/server-key.pem(MySQL 拒绝读取组/其他可读的私钥) - 手动生成的证书常因
subjectAltName缺失导致客户端报X509_V_ERR_IP_ADDRESS_MISMATCH,而mysql_ssl_rsa_setup默认兼容 localhost 和 127.0.0.1
配置 my.cnf 并重启 mysqld:路径、段落、重启方式都不能错
编辑 /etc/my.cnf 或 /etc/mysql/my.cnf,只在 [mysqld] 段落里加:
ssl_ca = /var/lib/mysql/ca.pem ssl_cert = /var/lib/mysql/server-cert.pem ssl_key = /var/lib/mysql/server-key.pem require_secure_transport = ON
- 路径必须是绝对路径,不能用
~/或相对路径 - 不要写在
[client]或[mysql]段——那是客户端配置,对服务端无效 - 改完必须
systemctl restart mysqld(不是reload),SSL 配置不支持热加载 - 重启后立刻检查错误日志:
tail -n 50 /var/log/mysqld.log | grep -i ssl,出现Failed to set up SSL就说明证书或权限有问题
验证连接是否真走 SSL:STATUS 比 SHOW VARIABLES 更可信
SHOW VARIABLES 只告诉你“配了什么”,STATUS(或 \s)才反映当前连接实际状态:
- 用客户端连:
mysql -u user -p --ssl-mode=REQUIRED -h your-host - 登录后执行:
STATUS;,看输出中SSL:行是否显示类似Cipher in use is TLS_AES_256_GCM_SHA384 - 如果显示
SSL: Not in use,说明连接仍是明文——哪怕服务端证书全配对,客户端没强制或用户没REQUIRE SSL就白搭 - 生产环境建议对关键用户执行:
ALTER USER 'app_user'@'%' REQUIRE SSL;,从服务端卡死非 SSL 连接
最容易被忽略的是:证书文件放在 /root/ 下、server-key.pem 权限是 644、require_secure_transport 没开、或者客户端连的时候压根没加 --ssl-mode=REQUIRED——这四个点任一出错,SSL 就形同虚设。











