MySQL 8.0 默认具备 SSL 能力但不强制加密,必须同时满足服务端强制、用户级限制、客户端显式启用三者才能防止数据窃听。
先说结论:仅配置证书不够,需服务端加载证书、用户强制 SSL、客户端明确启用并验证三步才能真正加密通信。
- 适合:生产环境敏感数据传输、等保合规整改场景
- 先准备:确认 have_ssl=YES、生成 CA 与服务器证书、修改 my.cnf 配置
- 验收:连接后查询 Ssl_cipher 状态值为非空
命令速用版
SHOW VARIABLES LIKE 'have_ssl';
mysql_ssl_rsa_setup `--datadir`=/var/lib/mysql `--uid`=mysql
SHOW STATUS LIKE 'Ssl_cipher';为什么会这样
have_ssl 为 YES 仅表示编译支持,不代表已启用加密。
MySQL 8.0 默认具备 SSL 能力但不强制加密,若 ssl_mode 仍是 PREFERRED,说明服务端未强制,所有连接仍可降级为明文。
分步处理
第一步:确认 MySQL 是否已启用 SSL 支持
登录 MySQL 执行 SHOW VARIABLES LIKE '%ssl%',重点看 have_ssl 必须为 YES,ssl_ca、ssl_cert、ssl_key 应显示非空绝对路径。
第二步:生成并放置证书
推荐用内置工具生成:mysql_ssl_rsa_setup `--datadir`=/var/lib/mysql `--uid`=mysql,证书必须放在 mysql 用户可读目录,server-key.pem 权限必须是 600。
第三步:配置文件中正确配置 ssl-ca / ssl-cert / ssl-key
编辑/etc/my.cnf,在 [mysqld] 段写入绝对路径,改完必须 systemctl restart mysqld。
第四步:强制用户走 SSL 连接
MySQL 8.0.22 及以上可用 ALTER USER 'app'@'%' REQUIRE SSL,已有用户需显式声明 REQUIRE SSL。
怎么验证是否生效
连接后立即查加密状态:SHOW STATUS LIKE 'Ssl_cipher',返回非空值才表示当前连接确实在用 TLS。
常见坑
证书文件放在/tmp 或用户家目录下,MySQL 进程因权限限制无法读取。
localhost 连接默认走 Unix socket,绕过所有 SSL 限制,测试务必用 127.0.0.1 或远程 IP。
配置写在 [client] 或 [mysql] 段,那是给客户端工具用的,对服务端无效。
常见问题
have_ssl 为 YES 是否代表连接已加密?
不代表,have_ssl 为 YES 仅表示编译支持,需进一步检查 Ssl_cipher 状态。
客户端连接必须指定什么参数?
客户端连接必须主动发起 TLS 握手,如指定`--ssl-mode`=REQUIRED。
参考来源
如何开启 MySQL 8.0 的 SSL 加密连接以保障数据传输安全?
如何配置 MySQL 的 SSL/TLS 加密连接以防止敏感数据被窃听?
如何配置 MySQL 的 SSL 加密连接保障安全_通过生成 SSL 证书与参数开启
mysql 如何配置 SSL 加密连接_mysql 数据加密设置
Mysql 8.0.42 启用 SSL 安全连接 (等保整改、docker 部署)