必须先确认have_ssl值为yes,否则ssl配置无效;再检查tls_version支持tlsv1.2+;用mysql_ssl_rsa_setup生成证书并确保路径绝对、权限600、属主为mysql;在[mysqld]段配置证书路径;重启服务后创建require ssl用户,并客户端指定--ssl-mode=required验证加密连接。

确认 MySQL 是否已启用 SSL 支持
直接执行 SHOW VARIABLES LIKE 'have_ssl';,返回值必须是 YES。如果为 DISABLED 或空,说明 SSL 模块根本没加载——此时所有证书配置都无效。常见原因包括:MySQL 是精简版(如某些 MariaDB)、编译时未启用 OpenSSL、或进程以错误用户启动(比如 root 启动但证书属主是 mysql)。顺带查一下 SHOW VARIABLES LIKE 'tls_version';,确认支持 TLSv1.2 或更高版本,避免旧客户端连不上。
用 mysql_ssl_rsa_setup 生成证书并检查权限
MySQL 8.0+ 自带工具比手写 OpenSSL 命令更可靠,能自动处理 CN 匹配和密钥格式问题。进入数据目录后执行:mysql_ssl_rsa_setup --datadir=/var/lib/mysql --uid=mysql。生成后立刻验证三件事:
-
sudo -u mysql ls -l /var/lib/mysql/ca.pem /var/lib/mysql/server-key.pem——server-key.pem必须是-rw-------(即 600),否则 mysqld 启动失败 - 所有路径必须是绝对路径,
./ca.pem或~/ca.pem会被静默忽略 - 证书不能放在
/tmp、/home等非 mysql 用户默认可读目录,否则启动时报错“SSL error: Unable to get private key”
在 [mysqld] 段正确配置证书路径
编辑 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.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
常见错误:
- 把配置写进
[client]或[mysql]段——那是给客户端工具用的,对服务端无意义 - 漏掉
require_secure_transport=ON(可选但推荐),否则即使证书配好了,普通明文连接仍被允许 - 改完配置不重启服务:
systemctl restart mysqld,systemctl reload mysqld不生效
强制用户走 SSL 并验证实际连接状态
服务端配证书 ≠ 连接就加密。必须让账号显式绑定规则:
- 新建用户:
CREATE USER 'app'@'%' IDENTIFIED BY 'pwd' REQUIRE SSL; - 已有用户:
ALTER USER 'app'@'%' REQUIRE SSL; - 连接后立刻查:
SHOW STATUS LIKE 'Ssl_cipher';—— 返回非空值(如ECDHE-ECDSA-AES256-SHA)才表示当前会话确实在加密
客户端连接时必须指定 --ssl-mode=REQUIRED(或 VERIFY_CA/VERIFY_IDENTITY),否则默认可能降级为明文。容易被忽略的是:即使服务端开了 SSL、用户设了 REQUIRE SSL,若客户端没加 --ssl-mode 参数,连接仍会拒绝——不是静默降级,而是直接报错 Access denied for user ... (using password: YES)。











