mysql启用ssl需满足:have_ssl= yes,且ssl_ca、ssl_cert、ssl_key三项均为非空绝对路径;证书文件属主为mysql、权限600;配置须在[mysqld]段,重启mysqld生效;用户需显式require ssl并客户端指定--ssl-mode=required。

确认 MySQL 是否已启用 SSL 支持
直接登录 MySQL 执行 SHOW VARIABLES LIKE '%ssl%';,重点看三个值:have_ssl 必须为 YES;ssl_ca、ssl_cert、ssl_key 应显示非空路径。如果 have_ssl 是 DISABLED 或 NO,说明配置未生效或证书路径不可读——此时不要急着生成证书,先检查 MySQL 进程是否以正确用户(如 mysql)运行,且证书文件权限是否为 600、属主是否为 mysql。
用 mysql_ssl_rsa_setup 一键生成测试证书(MySQL 8.0+)
这是最省错的起点,尤其适合内网或开发环境。操作前确保进入数据目录并修正权限:
-
cd /var/lib/mysql,然后chown mysql:mysql . - 执行
mysql_ssl_rsa_setup --datadir=/var/lib/mysql --uid=mysql - 生成后检查关键文件:
ca.pem、server-cert.pem、server-key.pem—— 客户端连接只需前两者(服务端私钥必须严格保留在服务器上)
注意:mysql_ssl_rsa_setup 默认不生成 client-cert.pem 和 client-key.pem,除非加 --create-client-certs 参数;普通客户端连接无需客户端证书,只要服务端配好 + 客户端指定 --ssl-mode=REQUIRED 即可加密通信。
在 my.cnf 中正确配置 ssl-ca / ssl-cert / ssl-key
编辑 /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
常见错误包括:
- 路径写成相对路径(如
./ca.pem),MySQL 启动时会静默忽略 - 证书文件放在
/tmp或用户家目录下,MySQL 进程因权限限制无法读取 - 配置写在
[client]或[mysql]段——那是给客户端工具用的,对服务端无效
改完必须 systemctl restart mysqld,不能只 reload。
强制用户走 SSL 连接并验证实际加密状态
仅服务端配证书不够,还得让账号“守规矩”:
- 创建新用户时加
REQUIRE SSL:CREATE USER 'appuser'@'10.0.2.%' IDENTIFIED BY 'p4ssw0rd' REQUIRE SSL; - 已有用户用
ALTER USER 'appuser'@'10.0.2.%' REQUIRE SSL; - 连接后立即查加密状态:
SHOW STATUS LIKE 'Ssl_cipher';—— 返回非空值(如ECDHE-ECDSA-AES256-SHA)才表示当前连接确实在用 TLS
容易被忽略的一点:即使服务端开了 SSL、客户端用了 --ssl-mode=REQUIRED,如果用户没设 REQUIRE SSL,MySQL 仍允许该用户走非加密连接(取决于客户端是否主动启用)。生产环境务必双保险——服务端配证书 + 用户级强制。











