mysql 8.0+必须使用--ssl-mode=required(而非仅ssl=true),并配合服务端require_secure_transport=on、用户级require ssl及受信ca签发的合规证书,否则不满足等保三级通信加密与身份验证要求。

MySQL 8.0+ 必须用 --ssl-mode=REQUIRED 而不是 just ssl=1
只在连接字符串里写 ssl=true 或 useSSL=true 是无效的——MySQL客户端默认不校验服务端证书,攻击者可中间人劫持。等保三级明确要求“通信过程加密且身份可验证”,必须强制启用并验证 TLS。Java、Python、Node.js 等主流驱动都支持 --ssl-mode=REQUIRED(命令行)或等效参数(如 Python 的 ssl_disabled=False + ssl_verify_identity=True)。
常见错误现象:mysql -u root -p -h db.example.com 成功连接,但抓包可见明文传输;SHOW STATUS LIKE 'Ssl_cipher'; 返回空值或 ""。
- 正确做法:连接时显式指定模式,例如
mysql --ssl-mode=REQUIRED -u app -p -h 10.0.1.5 - 应用层示例(Python PyMySQL):
ssl={'ca': '/etc/mysql/ca.pem', 'check_hostname': True},缺check_hostname=True就不算合规 - 若用连接池(如 HikariCP),必须配置
jdbc:mysql://...?useSSL=true&requireSSL=true&verifyServerCertificate=true,仅useSSL=true不满足等保
服务端证书不能用自签名通配符证书
等保测评工具会检查证书链有效性、CN/SAN 匹配、有效期和签名算法。用 openssl req -x509 -newkey rsa:2048 生成的自签名证书,即使加了 SAN,也会被判定为“不可信根证书”,导致客户端校验失败或测评不通过。
必须满足:
- 证书由受信 CA(如内网私有 CA 或国密 SM2 CA)签发,且客户端信任该 CA 根证书
- CN 或 SAN 必须精确匹配数据库实际访问域名或 IP(例如客户端连
db-prod.internal,证书 SAN 就不能只写*.internal) - 禁用 SHA-1、RSA-1024 等弱算法;推荐 ECDSA-P256 或 RSA-3072+,有效期 ≤365 天
-
mysqld启动时需加载完整证书链:ssl_ca、ssl_cert、ssl_key三者缺一不可,路径必须绝对且 MySQL 进程有读权限
SHOW VARIABLES LIKE '%ssl%' 返回空说明配置没生效
很多人改完 my.cnf 就以为 OK,但 SHOW VARIABLES LIKE '%ssl%' 若返回空结果或 OFF,代表 MySQL 根本没加载 SSL 配置——常见于配置位置错误、权限问题或未重启。
检查步骤:
- 确认配置在
[mysqld]段下,不是[client]或全局段 - 关键参数必须全写对:
ssl_ca = /etc/mysql/ca.pem、ssl_cert = /etc/mysql/server-cert.pem、ssl_key = /etc/mysql/server-key.pem - 执行
SELECT VARIABLE_VALUE FROM performance_schema.global_variables WHERE VARIABLE_NAME = 'have_ssl';,返回YES才算基础就绪 - 重启后立刻验证:
mysqladmin variables | grep ssl,看是否输出非空值
ALTER USER 必须显式指定 REQUIRE SSL 才算绑定到账号
只开服务端 SSL 不等于用户强制走加密连接。等保三级要求“用户连接必须加密”,这意味着每个业务账号都得单独约束,否则攻击者仍可用非 SSL 方式登录(比如绕过代理直连)。
正确操作:
- 对已有用户执行:
ALTER USER 'app_user'@'192.168.5.%' REQUIRE SSL; - 新建用户必须带 REQUIRE:
CREATE USER 'reporter'@'%' IDENTIFIED BY 'xxx' REQUIRE SSL; - 验证是否生效:
SELECT user, host, ssl_type FROM mysql.user WHERE user = 'app_user';,ssl_type必须为ANY或X509 - 注意:
REQUIRE SSL不校验证书内容,仅强制走 TLS;如需双向认证,得用REQUIRE X509并配合客户端证书
最容易被忽略的是:证书路径权限错误导致 MySQL 启动时静默跳过 SSL 加载,以及应用连接字符串漏掉 verifyServerCertificate=true。这两个点在等保现场测评中高频被扣分。











