MySQL 5.7 主从复制默认明文传输,生产跨网段部署必须启用SSL加密。主库需生成证书并正确配置ssl-ca/ssl-cert/ssl-key,属主设为mysql且权限严格;复制账号须REQUIRE SSL;从库CHANGE MASTER TO必须指定MASTER_SSL=1及有效MASTER_SSL_CA路径;主库还需设置require_secure_transport=ON强制加密连接,否则仍可降级为明文。

MySQL 5.7 主从复制默认走明文,只要网络路径可被中间人截获(比如跨公网、VPC边界、共享宿主机),binlog内容、复制账号密码甚至部分DML语句都可能泄露。启用SSL不是“锦上添花”,而是生产环境跨网段部署时的强制底线。
主库必须生成并加载有效证书,且私钥要有读权限
执行 mysql_ssl_rsa_setup 后,证书文件(ca.pem、server-cert.pem、server-key.pem)默认生成在 datadir 下。但常见失败点是:server-key.pem 属主为 root 且权限为 600,而 mysqld 进程以 mysql 用户运行,无法读取私钥。
- 先确认
datadir路径:SHOW VARIABLES LIKE 'datadir'; - 进入该目录,执行:
chown mysql:mysql server-key.pem和chmod 600 server-key.pem - 修改
/etc/my.cnf的[mysqld]段,显式指定路径(不要依赖默认位置):ssl-ca=/var/lib/mysql/ca.pem<br>ssl-cert=/var/lib/mysql/server-cert.pem<br>ssl-key=/var/lib/mysql/server-key.pem
- 重启后检查:
SHOW VARIABLES LIKE '%ssl%';中have_ssl必须为YES,ssl_ca/ssl_cert/ssl_key值非空
从库连接主库时必须显式启用 SSL 并验证 CA
仅主库配了证书,从库不主动要求加密,连接仍会降级为明文。关键在于 CHANGE MASTER TO 语句中必须包含 MASTER_SSL=1 及完整证书路径,否则 TLS 握手不会触发。
- 复制账号必须强制 SSL:
CREATE USER 'repl'@'%' REQUIRE SSL;+GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; - 从库执行:
CHANGE MASTER TO<br> MASTER_HOST='master-ip',<br> MASTER_USER='repl',<br> MASTER_PASSWORD='xxx',<br> MASTER_SSL=1,<br> MASTER_SSL_CA='/etc/mysql/ca.pem',<br> MASTER_SSL_CERT='/etc/mysql/client-cert.pem',<br> MASTER_SSL_KEY='/etc/mysql/client-key.pem';
-
MASTER_SSL_CA是必须项;MASTER_SSL_CERT和MASTER_SSL_KEY仅当主库启用了双向认证(REQUIRE X509)才需要。多数场景只需 CA 文件 - 务必确认从库上的
ca.pem与主库生成的完全一致(sha256sum对比),否则报错SSL error: certificate verify failed
主库需设 require_secure_transport=ON 防止降级攻击
即使从库配置了 MASTER_SSL=1,若主库未强制加密,它仍会接受未加密的复制连接请求——攻击者可伪造从库身份绕过 SSL。
- 主库执行:
SET GLOBAL require_secure_transport = ON;(持久化需写入my.cnf的[mysqld]段) - 该变量生效后,所有新连接(包括复制连接)必须使用 SSL/TLS,否则拒绝授权
- 验证是否生效:
SELECT @@require_secure_transport;返回1 - 注意:此设置会影响所有客户端连接,如应用未配 SSL 会直接连不上,需同步改造
验证链路是否真加密,不能只看 SHOW SLAVE STATUS
SHOW SLAVE STATUS\G 里 Seconds_Behind_Master 正常、Slave_IO_Running 和 Slave_SQL_Running 都为 Yes,不代表链路加密。真正判断依据是主库的连接状态。
- 主库执行:
SHOW PROCESSLIST;找到从库 IP 的连接行,看ssl_type列是否为ANY或X509(明文连接此项为空) - 更直接的方式:
SELECT id, user, host, ssl_type FROM information_schema.processlist WHERE host LIKE 'slave-ip%'; - 抓包验证(最后手段):
tcpdump -i any port 3306 -w mysql.pcap,用 Wireshark 打开,搜索Client Hello和Server HelloTLS 握手包
最容易被忽略的是主库 require_secure_transport 和从库 MASTER_SSL_CA 文件一致性——前者漏配,整个加密形同虚设;后者不一致,连接看似成功实则走明文(MySQL 5.7 默认不校验 CA,除非显式设 MASTER_SSL_VERIFY_SERVER_CERT=1)。这两个点不卡死,SSL 主从就是纸糊的盾牌。


















