MySQL默认通信明文,易被窃听;必须启用SSL/TLS加密,服务端配置ssl_mode=REQUIRED及证书路径,客户端须显式指定--ssl-mode=REQUIRED或对应驱动参数,禁用自签名与弱协议,且需配合应用层安全措施。

MySQL 默认通信是明文的,只要攻击者能接入同一网络(比如内网、云主机共享宿主、Wi-Fi 公共热点),就可能用 tcpdump 或 Wireshark 直接抓到用户名、密码、SQL 查询语句甚至查询结果。这不是理论风险——2026 年 CNCERT 通报的多起数据库泄露事件中,就有因未加密 MySQL 流量导致凭证被旁路截获,进而横向控制整套运维环境的案例。
MySQL 客户端连接必须启用 SSL/TLS 加密
MySQL 5.7+ 原生支持 TLS,但默认不启用;mysql 命令行客户端、JDBC、PyMySQL 等驱动也需显式开启,否则仍走明文。
- 服务端配置:在
my.cnf中启用ssl_mode=REQUIRED,并指定证书路径:ssl_ca、ssl_cert、ssl_key - 客户端连接时必须加
--ssl-mode=REQUIRED参数,否则即使服务端要求,客户端也可能静默降级为非加密连接 - JDBC 连接字符串要显式加上
&useSSL=true&requireSSL=true;PyMySQL 需传入ssl={'ca': '/path/to/ca.pem'}字典 - 注意:MySQL 8.0.23+ 已废弃
useSSL,改用ssl-mode=REQUIRED,旧参数会触发警告甚至拒绝连接
避免使用自签名证书或忽略证书校验
开发环境图省事用自签名证书 + 客户端设 ssl-mode=DISABLED 或 verifyServerCertificate=false,等于把锁换成贴纸。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
- 自签名证书无法防止中间人伪造响应,仅防被动嗅探;真要测试,可用私有 CA 签发,再将 CA 根证书分发给所有客户端
- 生产环境必须使用由可信 CA(如 Let’s Encrypt、DigiCert)签发的证书,且客户端必须校验服务端域名与证书
subjectAltName匹配 - Java 应用若用
trustStore加载了错误的根证书,或设置了trustCertificateKeyStoreUrl却没配对验证逻辑,TLS 握手成功但实际无意义
禁用旧版协议与弱加密套件
MySQL 支持的 TLS 版本和加密算法差异很大,MySQL 5.6 默认只支持 TLSv1.0,而该版本已存在 POODLE 等可利用漏洞。
- 服务端强制最低 TLS 版本:在
my.cnf中设置tls_version=TLSv1.2,TLSv1.3(MySQL 8.0.28+ 支持 TLSv1.3) - 禁用不安全套件:通过
ssl_ciphers=TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256显式限定(注意格式,不能带空格) - 验证是否生效:连接后执行
STATUS或查SHOW STATUS LIKE 'Ssl_cipher';,输出应为非空且不含RC4、DES、MD5等关键词
最容易被忽略的是:即使启用了 TLS,如果应用层还把密码硬编码在配置文件里、或日志中打印了完整 SQL(含 WHERE password = 'xxx'),加密链路上的防护也会被绕过。通信加密只是纵深防御的一环,不是银弹。

















