必须主库启用ssl并设require_secure_transport=on,从库change replication source to须显式传全source_ssl=1、source_ssl_ca等参数且复制账号require ssl限定ip,否则静默降级明文;主库需验证have_ssl=yes、tls_version≥tlsv1.2、require_secure_transport=on、证书路径绝对且私钥权限600属主mysql。

必须主库启用 SSL + require_secure_transport=ON,从库 CHANGE REPLICATION SOURCE TO 显式传全 SSL 参数,否则复制静默走明文——你根本收不到错误提示。
主库必须同时满足三个硬性条件才真正启用加密
只配证书路径不生效,只开证书不强制也不行。主库启动后需逐项验证:
-
SHOW VARIABLES LIKE 'have_ssl'返回YES(不是DISABLED),否则 MySQL 未加载 SSL 模块,重装官方二进制包最省事 -
SHOW VARIABLES LIKE 'tls_version'至少含TLSv1.2;TLSv1.0已不安全,不能用 -
SHOW VARIABLES LIKE 'require_secure_transport'必须为ON——这个值只能写进[mysqld]段并重启mysqld,SET GLOBAL无效
证书路径必须是绝对路径,且 server-key.pem 权限必须为 600、属主为 mysql 用户,否则 MySQL 启动时静默失败,Ssl_cipher 始终为空,日志里也不会报错。
从库 CHANGE REPLICATION SOURCE TO 必须显式带全 SSL 参数
漏掉任意一个,MySQL 就会自动回退到明文连接,且 SHOW REPLICA STATUS\G 中 Slave_SSL_Allowed: No 却不报错——这是最常被忽略的坑。
-
SOURCE_SSL = 1单独出现毫无意义,必须配合SOURCE_SSL_CA等参数一起使用 -
SOURCE_SSL_CA是必需项,必须和主库的ssl_ca是同一份 PEM 文件,否则握手失败报SSL error: certificate verify failed -
SOURCE_SSL_CERT和SOURCE_SSL_KEY是双向认证所需,路径是**从库本地路径**,MySQL 进程必须有读权限;SELinux 或 AppArmor 可能拦截,可用ausearch -m avc -ts recent查日志
示例命令(MySQL 8.0.22+):
CHANGE REPLICATION SOURCE TO SOURCE_HOST = 'master.example.com', SOURCE_USER = 'repl', SOURCE_PASSWORD = 'xxx', SOURCE_SSL = 1, SOURCE_SSL_CA = '/etc/mysql/ca.pem', SOURCE_SSL_CERT = '/etc/mysql/client-cert.pem', SOURCE_SSL_KEY = '/etc/mysql/client-key.pem', SOURCE_LOG_FILE = 'mysql-bin.000001', SOURCE_LOG_POS = 154;
caching_sha2_password 插件会让非 SSL 复制直接失败
MySQL 8.0+ 默认认证插件是 caching_sha2_password,它在主从场景下会主动拒绝非 SSL 连接,报错 MY-002061:“Authentication requires secure connection”。
- 不要回退到
mysql_native_password——那是降级安全性,不是解法 - 复制账号必须显式声明
REQUIRE SSL,且禁止用%通配符,应限定具体从库 IP,例如'repl'@'192.168.10.5' - 创建语句必须带完整限制:
CREATE USER 'repl'@'192.168.10.5' IDENTIFIED BY 'StrongPass123!' REQUIRE SSL;
即使 TLS 已启用,如果复制用户没强制 SSL,攻击者仍可用该账号发起明文连接,绕过所有加密防护。
证书角色与路径权限最容易被忽略
CA 文件必须统一,但 server-cert 和 client-cert 不能复用同一对密钥——用同一套自签证书同时当主库 server-cert 和从库 client-cert,会导致证书校验失败。
- 主库证书用于服务端身份,从库证书用于客户端身份,角色不同,生成时
subjectAltName必须匹配各自 IP - 证书生成必须用
mysql用户执行(如sudo -u mysql mysql_ssl_rsa_setup --datadir=/var/lib/mysql),否则私钥权限或属主不对 -
/etc/mysql/repl_ssl/目录需chown -R mysql:mysql且chmod -R 640,否则 MySQL 进程读不到
配置改完不重启 mysqld、把 SSL 参数错放在 [client] 段、用相对路径或 ~ 代指家目录——这些操作都会让整个加密形同虚设。











