require_ssl仅单向验证,双向ssl(mtls)需同时满足:require_secure_transport=on、服务端配置ca校验客户端证书、create user时用require subject精确绑定证书dn。

require_ssl 只做单向验证,不能开启双向 SSL 认证。它只强制客户端使用 SSL 连接,但服务端**不校验客户端证书**,本质仍是“服务端自证身份”,不是双向。
真正实现双向认证(mTLS),必须同时满足三件事:服务端强制加密通道 + 服务端配置 CA 用于校验客户端证书 + 用户创建时绑定证书约束条件。
MySQL 服务端 require_secure_transport=ON 是硬门槛
没有这一步,所有 SSL 相关配置都形同虚设——非 SSL 连接仍能成功,REQUIRE X509 完全不会触发。
-
require_secure_transport = ON必须写在[mysqld]段,且重启生效;设为OFF或注释掉,就退化为普通连接 -
ssl_mode = REQUIRED是客户端行为提示,不影响服务端策略,可不配;真正起作用的是require_secure_transport - 启动后务必执行
SHOW VARIABLES LIKE 'require_secure_transport';确认值为ON,别只信配置文件
用户必须用 CREATE USER REQUIRE SUBJECT/ISSUER,不能靠 GRANT 或 ALTER USER 补救
REQUIRE SSL、REQUIRE X509 都只是基础门槛,生产环境强烈建议用 REQUIRE SUBJECT 绑定具体客户端证书 DN 字段。
- 语法必须是
CREATE USER 'u'@'%' REQUIRE SUBJECT '/CN=client1/O=myorg';GRANT ... REQUIRE X509无效 -
SUBJECT值必须与openssl x509 -in client-cert.pem -subject -noout输出**完全一致**:空格、斜杠顺序、大小写都不能错 -
ALTER USER 'u'@'%' REQUIRE SUBJECT '...'会覆盖之前所有REQUIRE条件,不是追加 - 切勿给
root用户配REQUIRE X509,一旦客户端证书失效或路径错,可能彻底锁死管理入口
客户端连接必须显式传三个 PEM 文件,mysql 命令不读 my.cnf 的 [client] 段 SSL 配置
漏掉任一参数,错误表现往往是 Access denied for user,而不是明确的 SSL 错误——因为服务端在证书校验失败后直接拒绝认证,不提示原因。
- 最小必要参数:
mysql --ssl-mode=REQUIRED --ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem -u u -p -
--ssl-cert和--ssl-key必须成对出现;私钥不能加密(即生成时用了-nodes),否则客户端无法加载 -
ca.pem在客户端和服务端必须是同一份;若服务端用了中间 CA,客户端也得把完整链(根 + 中间)拼进一个ca.pem里 - 权限检查:客户端证书和私钥文件在 Linux 上必须是
600,否则 mysql 客户端静默忽略
extendedKeyUsage=clientAuth)、用户约束语法、连接时参数缺一不可。最容易被跳过的其实是客户端私钥权限和 SUBJECT 字符串的精确匹配——这两个点出问题,日志里往往只留一句模糊的拒绝,排查起来最耗时间。











