MySQL 8.0 如何开启 SSL 加密连接防止数据窃听?

文章导读
MySQL 8.0 默认具备 SSL 能力但不强制加密,必须同时满足服务端强制、用户级限制、客户端显式启用三者才能防止数据窃听。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

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。

MySQL 8.0 如何开启 SSL 加密连接防止数据窃听?

第三步:配置文件中正确配置 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] 段,那是给客户端工具用的,对服务端无效。

MySQL 8.0 如何开启 SSL 加密连接防止数据窃听?

常见问题

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 部署)