mysql_ssl_rsa_setup仅生成自签名证书,不配置mysql、不重启服务、不创建require ssl用户;必须手动配置my.cnf、重启mysqld、创建强制ssl用户才能启用ssl加密连接。

MySQL 8.0 配 SSL 加密连接,用 mysql_ssl_rsa_setup 是最省事的方案,但必须满足三个前提:数据目录可写、mysqld 进程能读取生成的文件、且没被 SELinux/AppArmor 拦截;否则看似成功,实际 have_ssl 仍是 DISABLED。
mysql_ssl_rsa_setup 能做什么、不能做什么
这个工具只负责生成一套自签名证书(ca.pem、server-cert.pem、server-key.pem 等),不修改配置、不重启服务、也不创建 REQUIRE SSL 用户。它只是把“证书生成”这步自动化了,后面三步你仍得手动做。
- 能:在指定目录下生成合规 PEM 文件,私钥无密码、格式正确、subjectAltName 包含
localhost和127.0.0.1 - 不能:自动写入
my.cnf;不能绕过文件权限检查;不能解决 TLS 协议版本不匹配问题 - 常见误判:执行完命令就以为 SSL 开启了——其实
SHOW VARIABLES LIKE 'have_ssl'依然返回DISABLED
执行 mysql_ssl_rsa_setup 的正确姿势
别直接跑命令就完事。路径、用户、权限三者错一个,证书就等于白生成。
- 先确认 MySQL 数据目录归属:
ls -ld /var/lib/mysql/,输出里属主必须是mysql(不是root) - 切换到
mysql用户再运行(避免生成文件属主错误):sudo -u mysql mysql_ssl_rsa_setup --datadir=/var/lib/mysql - 检查生成结果:
ls -l /var/lib/mysql/*.pem,确保server-key.pem权限是-rw-------(600),且属主为mysql - 如果报错
Permission denied或日志里有SSL_CTX_set_default_verify_paths failed,八成是 SELinux 拦截,临时关掉验证:sudo setenforce 0
配完 mysql_ssl_rsa_setup 后必须做的三件事
工具只走了一半路。剩下这三步漏掉任意一个,客户端连上来还是明文传输。
- 编辑
/etc/mysql/my.cnf(或/etc/my.cnf),在[mysqld]段落加:require_secure_transport = ON ssl_ca = /var/lib/mysql/ca.pem ssl_cert = /var/lib/mysql/server-cert.pem ssl_key = /var/lib/mysql/server-key.pem
- 重启 MySQL(不是 reload):
sudo systemctl restart mysql;require_secure_transport不支持热加载 - 创建强制加密用户:
CREATE USER 'app'@'%' IDENTIFIED BY 'pwd' REQUIRE SSL;;仅配服务端不设用户 REQUIRE,客户端加--ssl-mode=REQUIRED也可能被服务端拒绝(因require_secure_transport = ON会拦截所有非 SSL 连接)
验证 SSL 是否真生效,而不是“配了就算”
很多人卡在最后一步:以为 SHOW VARIABLES 显示路径就 OK,结果 Wireshark 抓包一看全是明文 SQL 和密码。
- 先确认服务端加载成功:
mysql -e "SHOW VARIABLES LIKE 'have_ssl';"必须返回YES,不是DISABLED - 再查当前连接是否加密:
mysql -u app -p --ssl-mode=REQUIRED -e "SELECT Ssl_cipher FROM performance_schema.status_by_thread WHERE THREAD_ID = CONNECTION_ID();";返回非空值才表示这条连接真用了 TLS - 如果连不上,别急着改证书——先看错误:
Access denied for user多半是用户没REQUIRE SSL;SSL connection error: protocol version mismatch就该查tls_version和客户端支持范围
最容易被忽略的是:证书文件路径必须是绝对路径,且 mysqld 进程必须有读权限;require_secure_transport = ON 是开关,不是装饰;而 REQUIRE SSL 是用户粒度的强制策略——三者缺一不可,且顺序不能乱。











