必须启用ssl加密传输通道,否则数据明文暴露;确认have_ssl=yes、tls_version≥tlsv1.2、require_secure_transport=on且配置正确,客户端需显式指定--ssl-mode参数。

MySQL数据库迁移时若走公网或不可信网络,必须启用SSL加密传输通道,否则dump文件、账号密码、甚至表结构定义都会以明文被抓包还原——这不是“建议开启”,而是“不配就裸奔”。
确认源库和目标库 have_ssl = YES
迁移前先分别登录源库和目标库执行:SHOW VARIABLES LIKE 'have_ssl'。返回值必须是 YES,不是 DISABLED 或空。常见失败原因:MariaDB精简版、Alpine镜像、或mysqld启动用户无OpenSSL权限。别信“我生成了证书就肯定行”,have_ssl = DISABLED 意味着整个SSL模块根本没加载,后续所有配置都无效。
- 顺带查
SHOW VARIABLES LIKE 'tls_version',确保支持TLSv1.2或更高;MySQL 5.7+ 默认禁用 TLSv1.0,旧客户端连不上时可临时加tls_version = TLSv1.2,TLSv1.3,但别长期开 TLSv1.0 - 如果任一端返回
DISABLED,重装官方二进制包比修编译更省事;不要试图用SET GLOBAL动态改,这参数只能在配置文件里设并重启生效
mysqld.cnf 中必须写对 ssl-* 和 require_secure_transport
只在 [mysqld] 段添加证书路径,且路径必须是绝对路径、文件真实存在、私钥权限为 600:
ssl-ca = /var/lib/mysql/ca.pem ssl-cert = /var/lib/mysql/server-cert.pem ssl-key = /var/lib/mysql/server-key.pem require_secure_transport = ON
-
require_secure_transport = ON是硬开关,缺它等于没锁门;仅靠REQUIRE SSL用户权限或MASTER_SSL = 1都可能被绕过 - 证书不能放
/root/或/home/deploy/,MySQL进程默认读不到;推荐统一放在/var/lib/mysql/下,并执行:chown mysql:mysql /var/lib/mysql/*.pem && chmod 600 /var/lib/mysql/server-key.pem - 配置改完必须
systemctl restart mysqld,reload不生效;改错段落(比如写进[client])会导致静默忽略
mysqldump 和 mysql 客户端命令必须显式指定 --ssl-mode
迁移工具本身不自动继承服务端SSL策略,必须手动加参数:
- 从源库导出:
mysqldump --ssl-mode=REQUIRED --host=src.example.com --user=repl --password=xxx db_name > dump.sql - 导入到目标库:
mysql --ssl-mode=REQUIRED --host=dst.example.com --user=admin --password=xxx db_name - 如果目标库要求验证CA(生产推荐),用
--ssl-mode=VERIFY_CA并附上--ssl-ca=/path/to/ca.pem;VERIFY_IDENTITY还会校验主机名,适合域名访问场景 - 漏掉
--ssl-mode=REQUIRED,连接会静默降级为明文——你得靠SHOW STATUS LIKE 'Ssl_cipher'返回非空值才能确认真正在加密
主从迁移场景下 CHANGE REPLICATION SOURCE TO 必须带全SSL参数
如果是用主从方式做迁移(如停机窗口短),从库的 CHANGE REPLICATION SOURCE TO 命令不能只写 SOURCE_SSL = 1,必须显式列出全部三项:
CHANGE REPLICATION SOURCE TO SOURCE_HOST = 'src.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_SSL_CA必须和源库的ssl_ca是同一份 PEM 文件,否则握手报SSL error: certificate verify failed - 复制账号(如
repl)必须创建时就带REQUIRE SSL,否则攻击者可用该账号发起明文连接,直接绕过所有加密防护 - MySQL 8.0+ 默认用
caching_sha2_password插件,若从库连不上,优先检查账号是否已REQUIRE SSL,而不是急着切回mysql_native_password
最容易被忽略的是:证书路径写对了、权限也改了、have_ssl 看起来是 YES,但 require_secure_transport = ON 没写进配置文件,或者写进了错误的配置段——这种情况下,迁移过程全程明文,而你完全不会收到任何错误提示。











