have_ssl必须为yes,否则ssl配置无效;需检查have_ssl值、证书路径与权限、require_secure_transport、require ssl用户及客户端--ssl-mode五项缺一不可。

have_ssl 必须为 YES,否则所有 SSL 配置都无效;MySQL 5.7 默认生成证书但不自动启用加密连接,更不会强制使用——必须手动配置服务端参数、创建强制 SSL 用户,并在客户端显式声明加密意图。
检查 SSL 支持状态是否真正生效
只看 ssl_ca、ssl_cert 等变量非空是不够的:have_ssl 才是最终开关。执行 SHOW VARIABLES LIKE 'have_ssl';,返回 YES 才代表 OpenSSL 库加载成功、证书可被读取。
常见失败现象:
-
have_ssl显示DISABLED:OpenSSL 未安装,或 MySQL 编译时未启用 SSL 支持 -
have_ssl显示YES但ssl_key值为空:私钥文件路径错误、权限不足(如server-key.pem属主不是mysql用户) - 重启后变量恢复默认值:配置写在了错误的配置段(比如写进
[client]而非[mysqld])
生成并部署证书文件的关键操作
用 mysql_ssl_rsa_setup 生成证书最稳妥,但它不解决权限问题——这是 90% 的配置失败根源。
实操建议:
- 先查清数据目录:
SHOW VARIABLES LIKE 'datadir';,证书默认生成在此处,别盲目指定其他路径 - 执行
mysql_ssl_rsa_setup --datadir=/var/lib/mysql --uid=mysql(--uid必须匹配 mysqld 进程用户) - 进入 datadir 目录,运行:
chown mysql:mysql server-key.pem client-key.pem ca-key.pem和chmod 600 server-key.pem client-key.pem ca-key.pem - 不要依赖默认路径:在
my.cnf的[mysqld]段中显式写出完整路径,例如:ssl-ca = /var/lib/mysql/ca.pem
让连接真正走加密通道的三个硬性条件
只配服务端证书 ≠ 客户端就自动加密。MySQL 5.7 的加密连接是“协商式”的,必须同时满足:
- 服务端开启
require_secure_transport = ON(否则客户端仍可降级为明文) - 复制账号或普通用户创建时带
REQUIRE SSL(如CREATE USER 'repl'@'%' REQUIRE SSL;) - 客户端连接时显式启用 SSL,例如:
mysql -u repl -p --ssl-mode=REQUIRED -h master-ip;或者在CHANGE MASTER TO中写死MASTER_SSL=1和MASTER_SSL_CA
漏掉任意一条,连接都会静默回退到未加密状态,且无报错提示。
--ssl-mode 参数决定客户端行为边界
MySQL 5.7.11+ 引入 --ssl-mode,它比旧版 --ssl 更精确地控制加密强度和验证粒度。
常用值及含义:
-
DISABLED:禁用加密(等价于--skip-ssl) -
PREFERRED:尝试加密,失败则降级(默认值,**不安全**) -
REQUIRED:必须加密,否则连接失败(生产环境唯一可接受选项) -
VERIFY_CA:加密 + 验证 CA 证书链(推荐用于跨网段主从) -
VERIFY_IDENTITY:加密 + 验证 CA + 校验证书 CN 是否匹配主机名(仅当证书 CN 写的是域名且 DNS 可解析时才适用)
注意:--ssl-mode=VERIFY_CA 要求客户端提供 --ssl-ca,而 --ssl-mode=REQUIRED 不校验证书有效性——后者适合自签名内网环境,前者才是跨公网/多 VPC 场景的底线。
require_secure_transport、REQUIRE SSL 用户定义、客户端 --ssl-mode ——这五项缺一不可。少设一项,看起来“配好了”,实际链路仍是裸奔。











