主库必须启用SSL并强制复制账号走加密连接,否则binlog明文传输易被中间人截获篡改;MySQL 5.7+默认不启用SSL,CHANGE MASTER TO须显式指定MASTER_SSL=1及全部证书路径,且复制账号需CREATE USER ... REQUIRE SSL,证书CN/SAN须与MASTER_HOST严格匹配,否则静默降级为明文。

主库必须启用SSL并强制复制账号走加密连接
不加密的binlog传输等同于把数据库变更明文发到网络上,中间人可截获、篡改甚至伪造relay log。MySQL 5.7+默认不启用SSL,CHANGE MASTER TO语句若未显式指定MASTER_SSL=1,即使主库开了SSL,从库仍会走明文连接。
实操要点:
- 主库my.cnf中必须配置
ssl_ca、ssl_cert、ssl_key路径,并重启服务 - 创建复制账号时,加上
REQUIRE SSL约束:CREATE USER 'repl'@'%' REQUIRE SSL; - 从库执行
CHANGE MASTER TO时,必须包含以下参数:MASTER_SSL=1, MASTER_SSL_CA='/path/to/ca.pem', MASTER_SSL_CERT='/path/to/client-cert.pem', MASTER_SSL_KEY='/path/to/client-key.pem' - 验证是否生效:在从库执行
SHOW SLAVE STATUS\G,检查Seconds_Behind_Master非NULL且Master_SSL_Allowed: Yes
避免用通配符主机名导致证书校验失效
MySQL的SSL证书验证依赖MASTER_HOST值与证书Common Name或Subject Alternative Name匹配。若从库用CHANGE MASTER TO MASTER_HOST='192.168.1.100',但主库证书CN是db-master.example.com,连接会静默降级为明文——SHOW SLAVE STATUS里看不到报错,只显示Master_SSL_Allowed: No。
解决办法:
- 主库生成证书时,务必在
openssl.cnf中填入IP地址到subjectAltName(如IP:192.168.1.100) - 从库
CHANGE MASTER TO中的MASTER_HOST必须与证书中任一SAN或CN完全一致,不能混用域名和IP - 测试连通性不要只靠
telnet,要用mysql --ssl-mode=REQUIRED -h 主库IP -u repl -p手动验证
禁用弱密码套件并定期轮换证书
MySQL 8.0.28+默认禁用TLSv1.0/1.1,但旧版本或自定义编译包可能仍允许。若主从间协商出TLS_RSA_WITH_AES_128_CBC_SHA这类已知存在BEAST漏洞的套件,攻击者可在网络层解密流量。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
关键操作:
- 主库my.cnf中添加
tls_version = TLSv1.2,TLSv1.3(MySQL 8.0.28+)或ssl_cipher = ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384(旧版本) - 证书有效期建议设为1年,到期前30天用
mysql_ssl_rsa_setup --datadir=/var/lib/mysql生成新密钥对 - 轮换后必须重启主库mysqld,否则
SHOW VARIABLES LIKE 'have_ssl'仍显示旧状态 - 从库无需重启,但需重新执行
CHANGE MASTER TO加载新证书路径
复制账号权限必须最小化且隔离网络段
复制账号本质是主库的“日志读取代理”,它不需要任何表级权限,但很多文档错误地授予SELECT或ALL PRIVILEGES。一旦该账号凭证泄露,攻击者可直接拖库。
正确做法:
- 仅授予
REPLICATION SLAVE权限,禁止REPLICATION CLIENT(后者可查看主库状态,属信息泄露) - 主机名限制到具体IP段,如
'repl'@'192.168.1.%',禁用'repl'@'%' - 密码必须含大小写字母+数字+特殊字符,长度≥12位;避免用
mysql_native_password插件(MySQL 8.0默认caching_sha2_password更安全) - 主库防火墙只放行从库IP的3306端口,其他来源全部DROP
真正容易被忽略的是证书更新后的从库重连逻辑:MySQL不会自动重载证书文件,START SLAVE时仍用旧路径缓存。必须先STOP SLAVE,再CHANGE MASTER TO显式指定新证书路径,最后START SLAVE——少一步就等于裸奔。

















