mysql 8.0 ssl加密需三者齐备:服务端加载ssl模块(have_ssl=yes)、证书路径权限合规(ssl_ca/cert/key为绝对路径且server-key.pem权限600)、用户级强制策略启用(require_secure_transport=on及require ssl),缺一即明文传输。

mysql_ssl_rsa_setup 是 MySQL 8.0+ 最稳妥的起点,不用手敲 OpenSSL 命令,也不用担心证书格式或密钥长度不兼容。
确认 MySQL 是否已启用 SSL 支持
直接连上 MySQL 执行:SHOW VARIABLES LIKE '%ssl%';
重点看三项:
- have_ssl 必须是 YES(不是 DISABLED 或空)
- ssl_ca、ssl_cert、ssl_key 必须是非空绝对路径
如果 have_ssl 是 DISABLED,先别生成新证书——检查 mysqld 进程是否以 mysql 用户运行,且配置文件中 [mysqld] 段已正确设置证书路径并重启过服务。
用 mysql_ssl_rsa_setup 一键生成证书(推荐)
适用于开发/测试环境,生成即用,避免手动生成时常见的 CN 不匹配、密钥未加密、PEM 格式错乱等问题:
- 进入数据目录(通常是 /var/lib/mysql),确保权限正确:cd /var/lib/mysqlchown mysql:mysql .
- 执行生成命令:mysql_ssl_rsa_setup --datadir=/var/lib/mysql --uid=mysql
- 检查生成的文件:ls -l /var/lib/mysql/*.pem
你会看到 ca.pem、server-cert.pem、server-key.pem —— 这三个是服务端必需的;client-cert.pem 和 client-key.pem 默认不生成,除非加 --create-client-certs 参数,普通客户端连接不需要它们。
配置 [mysqld] 并重启服务
编辑 /etc/my.cnf 或 /etc/mysql/my.cnf,在 [mysqld] 段添加:ssl-ca = /var/lib/mysql/ca.pemssl-cert = /var/lib/mysql/server-cert.pemssl-key = /var/lib/mysql/server-key.pemrequire_secure_transport = ON(可选,强制所有连接走 TLS)
注意:
- 路径必须是绝对路径,且文件属主为 mysql、权限为 600
- 修改后必须重启 mysqld(systemctl restart mysqld),仅重载配置不生效
- 如果证书路径含中文、空格或符号,MySQL 启动会静默失败,journalctl -u mysqld 里看不到明显报错,只显示“failed to start”
客户端连接时指定 --ssl-mode=REQUIRED
服务端配好 ≠ 客户端自动加密。默认情况下,MySQL 客户端仍走明文:
- 正确方式:mysql -u root -p --ssl-mode=REQUIRED
- 错误方式(不加密):mysql -u root -p 或 mysql -u root -p --ssl-mode=PREFERRED
- 验证是否真加密:登录后执行 STATUS;,看 “SSL: Cipher in use is …” 行是否非空;或者抓包确认 3306 端口流量是否不可读
- 若提示 SSL connection error: SSL is required by server but client does not support it,说明客户端版本太老(如 MySQL 5.7 客户端连 8.0+ 服务端),需升级客户端或改用支持 TLS 的驱动
证书文件本身不能写错路径,也不能漏掉 require_secure_transport = ON 这个开关——它不像 Web 服务器那样“有证书就默认启用”,MySQL 默认容忍非加密连接,哪怕证书全配好了。











