必须启用ssl,否则公网主从复制不安全;需设置require_secure_transport=on、正确配置ssl参数、复制账号require ssl、证书权限为600且路径准确。

必须启用 SSL,否则公网主从复制就是裸奔——不是“建议”,是刚性安全底线。
主库不设 require_secure_transport=ON 就等于没开 SSL
只在 my.cnf 里配了 ssl-ca、ssl-cert、ssl-key 不够。MySQL 默认仍接受明文连接,SSL 形同虚设。
- 必须显式开启强制安全传输:
SET PERSIST require_secure_transport = ON;(推荐,持久化生效)或在配置文件中加require_secure_transport=ON并重启mysqld - 验证是否生效:
SHOW VARIABLES LIKE 'require_secure_transport';返回ON才算真正启用 - 证书文件权限必须是
600,且mysqld进程用户(如mysql)要有读取权限,否则启动报错:SSL error: Unable to get certificate from file
从库 CHANGE REPLICATION SOURCE TO 必须传全 SSL 参数
漏掉任意一个 SSL 参数(比如只写 SOURCE_SSL=1 却没指定 SOURCE_SSL_CA),MySQL 就会静默回退到明文连接,SHOW REPLICA STATUS\G 显示 Master_SSL_Allowed: No 却不报错——这是最常被忽略的坑。
- 最低要求:必须带
SOURCE_SSL=1和SOURCE_SSL_CA='/path/to/ca.pem'(路径是从库本地路径) - 推荐补全:
SOURCE_SSL_CERT='/path/to/client-cert.pem'和SOURCE_SSL_KEY='/path/to/client-key.pem'(用于双向认证) -
SOURCE_SSL_CA必须指向主库的 CA 证书(不是从库自己生成的),否则握手失败,错误提示是:SSL error: certificate verify failed - 若不想校验 CN(比如用 IP 地址连主库),可加
SOURCE_SSL_VERIFY_SERVER_CERT=0
复制账号必须 REQUIRE SSL 且限定来源 IP
哪怕 TLS 已启用,如果复制账号没强制 SSL,攻击者仍可用该账号发起明文连接,绕过所有加密防护。
- 创建账号时必须显式声明:
CREATE USER 'repl'@'192.168.1.%' REQUIRE SSL; - 再授予权限:
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%'; - MySQL 8.0+ 默认插件
caching_sha2_password会主动拒绝非 SSL 连接,报错:MY-002061(Authentication requires secure connection) - 不要为绕过这个问题去降级插件(如改用
mysql_native_password),这等于用弱认证换掉强加密,得不偿失
证书生成和分发最容易卡在哪
自建 CA 或 OpenSSL 手动签发容易出错;用 mysql_ssl_rsa_setup 是最小可行路径,但要注意拆分和权限。
- 主库只需
ca.pem、server-cert.pem、server-key.pem - 从库需要
ca.pem(验证主库)、client-cert.pem、client-key.pem(向主库自证) - 所有 PEM 文件必须
chown mysql:mysql且chmod 600;SELinux 或 AppArmor 可能拦截访问,查日志:ausearch -m avc -ts recent - 测试连接别跳过:
mysql -h master-ip -u repl -p --ssl-ca=/path/to/ca.pem --ssl-cert=/path/to/client-cert.pem --ssl-key=/path/to/client-key.pem,确认 Cipher in use 非空
真正麻烦的不是命令本身,而是证书角色错位、路径权限不对、账号策略没对齐——三个地方任一出错,START REPLICA 就会卡在 Connecting 状态,而错误日志里只有一句模糊的 “SSL connection error”。











