必须强制启用ssl并验证证书链,否则中间人攻击必然发生;需确认have_ssl=yes、ssl_ca/cert/key路径有效且同ca签发、require_secure_transport=on,并在客户端使用verify_identity模式校验证书。

必须强制启用 SSL 并验证证书链,否则中间人攻击不是风险,而是必然发生的事。
如何确认 MySQL 服务端真正支持并启用了 SSL
很多环境配了 ssl_ca 却没生效,因为根本没满足启动前提。先查状态:
-
SHOW VARIABLES LIKE 'have_ssl';必须返回YES,DISABLED或NO表示编译不带 OpenSSL 支持,改配置无效 -
SHOW VARIABLES LIKE 'ssl%';看ssl_ca、ssl_cert、ssl_key是否指向真实存在的绝对路径,且三者必须由同一 CA 签发 -
SHOW VARIABLES LIKE 'require_secure_transport';必须为ON;只配证书不设这个,客户端仍可走明文连接 - 检查错误日志(
log_error指向的文件),搜索SSL或error,常见报错如Failed to set up SSL because of SSL library error或Unable to get certificate from file,说明私钥权限不对或 OpenSSL 不可用
主从复制场景下 SSL 配置最容易踩的坑
从库连主库时漏一个参数,就等于裸奔——MySQL 不报错,但 SHOW REPLICA STATUS\G 里 Master_SSL_Allowed: No。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
- 主库必须设
require_secure_transport = ON(推荐用SET PERSIST持久化),否则从库即使配了 SSL 也会被降级接受明文 - 从库执行
CHANGE REPLICATION SOURCE TO时,SOURCE_SSL=1和SOURCE_SSL_CA是硬性必需项;漏掉SOURCE_SSL_CERT或SOURCE_SSL_KEY不会报错,但握手失败,实际走明文 -
SOURCE_SSL_CA路径是**从库本地路径**,MySQL 进程用户(如mysql)必须有读权限;SELinux/AppArmor 可能拦截,用ausearch -m avc -ts recent查拒接日志 - MySQL 8.0+ 默认认证插件
caching_sha2_password会主动拒绝非 SSL 连接,报错MY-002061,不是密码错,是连接未加密被拒
客户端连接时如何真正强制走加密且防中间人
服务端开了 SSL,客户端不显式要求,连接默认仍是明文。光加 --ssl-mode=REQUIRED 不够,还得校验证书。
- 命令行连接必须带证书路径:
mysql -u user -p --ssl-mode=VERIFY_IDENTITY --ssl-ca=/path/to/ca.pem --ssl-cert=/path/to/client-cert.pem --ssl-key=/path/to/client-key.pem -
--ssl-mode=VERIFY_IDENTITY是生产首选:既验 CA,又核对服务器主机名,防伪造证书 - JDBC 连接字符串要加
?useSSL=true&requireSSL=true&verifyServerCertificate=true&trustCertificateKeyStoreUrl=file:/path/to/truststore.jks;verifyServerCertificate=false仅限测试,生产禁用 - 应用代码(如 PyMySQL)必须传完整 ssl 字典:
ssl={'ca': '/path/to/ca.pem', 'cert': '/path/to/client-cert.pem', 'key': '/path/to/client-key.pem'};只设ssl=True会跳过校验,失去防中间人意义
证书和权限的硬性约束条件
证书不是“有就行”,路径、权限、格式全错一点,SSL 就静默失效。
- 服务器私钥
server-key.pem不能带密码,MySQL 不支持读取加密私钥;权限必须是600,且属主为mysql用户 - CA 文件(
ca.pem)在主库和从库上必须完全一致;从库SOURCE_SSL_CA指向的文件内容若与主库ssl_ca不同,握手直接失败,报错SSL error: certificate verify failed - 所有证书路径写在
my.cnf的[mysqld]段,[client]段的配置对服务端 SSL 无影响 - 配置完必须重启
mysqld;SET GLOBAL have_ssl = 'YES'无效,这是只读变量
最常被忽略的是:从库 CHANGE REPLICATION SOURCE TO 漏参数不报错、客户端没配 VERIFY_IDENTITY 就以为安全、私钥权限不对导致 MySQL 启动时忽略 SSL 配置——这些都会让整套 SSL 配置形同虚设。










