MySQL真正启用SSL需have_ssl= YES且ssl_ca、ssl_cert、ssl_key均为非空可读绝对路径;否则连接明文,Wireshark可直接抓取密码与SQL。

have_ssl 必须为 YES,且 ssl_ca、ssl_cert、ssl_key 三项都指向可读的绝对路径——否则连接仍是明文,Wireshark 一抓一个准。
确认 MySQL 是否真启用 SSL 而非“假配置”
很多配置看似完成,但 SHOW VARIABLES LIKE '%ssl%' 返回的 have_ssl 是 DISABLED 或空值,说明 SSL 根本没加载。这不是证书问题,而是启动时 OpenSSL 模块未被初始化。
-
have_ssl = YES是硬门槛;若为DISABLED,大概率是 MariaDB 精简版或 MySQL 编译时未启用 SSL 支持(-DWITH_SSL=system) -
ssl_ca、ssl_cert、ssl_key必须显示非空的**绝对路径**(如/var/lib/mysql/ca.pem),不能是./ca.pem或注释掉的行 - 即使路径存在,若文件权限不对(比如
server-key.pem是644)、属主不是mysql用户,MySQL 会静默忽略,have_ssl却仍可能显示YES
用 mysql_ssl_rsa_setup 生成证书最省错
手动用 OpenSSL 生成容易踩 CN 不匹配、私钥带密码、subjectAltName 缺失等坑;mysql_ssl_rsa_setup(MySQL 5.7.6+ 内置)专为绕过这些设计。
- 先切到数据目录并修正归属:
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;client-cert.pem和client-key.pem默认不生成,普通连接不需要 - 立刻检查权限:
ls -l /var/lib/mysql/server-key.pem必须是-rw-------(600),否则 mysqld 启动失败或 SSL 不生效
my.cnf 中必须写在 [mysqld] 段且重启服务
配置写错位置等于白配:放在 [client] 或 [mysql] 段只影响命令行客户端,对服务端无意义。
- 路径必须是绝对路径,不支持
~/、./或 shell 变量展开 - 三行必须写全:
ssl-ca = /var/lib/mysql/ca.pem、ssl-cert = /var/lib/mysql/server-cert.pem、ssl-key = /var/lib/mysql/server-key.pem - 改完必须
systemctl restart mysqld(不是reload),因为 SSL 参数只在进程启动时读取 - 若重启失败,优先查
server-key.pem权限和 SELinux/AppArmor 是否拦截(ausearch -m avc -ts recent)
强制加密需服务端 + 用户 + 客户端三方配合
仅服务端配证书 ≠ 加密生效。漏掉任意一环,连接都会静默降级为明文,Wireshark 里清清楚楚。
- 用户必须显式声明:
CREATE USER 'app'@'%' IDENTIFIED BY 'pwd' REQUIRE SSL;已有用户用ALTER USER ... REQUIRE SSL - 客户端连接必须加
--ssl-mode=REQUIRED(MySQL 5.7.11+),旧版本需用--ssl+--ssl-ca等参数 - 验证当前连接是否真加密:
SHOW STATUS LIKE 'Ssl_cipher'—— 返回非空值(如ECDHE-ECDSA-AES256-SHA)才可信 - 生产环境建议加
require_secure_transport = ON,它直接拒绝所有非 SSL 连接,比仅靠用户权限更可靠


















