MySQL双向SSL校验需同时满足:服务端require_secure_transport=ON、用户CREATE/ALTER USER时指定REQUIRE X509或SUBJECT、客户端显式传--ssl-mode=REQUIRED及--ssl-ca/--ssl-cert/--ssl-key参数,缺一不可。

MySQL 双向 SSL 校验不是靠 ssl-ca 和 ssl-cert 两个配置项“自动开启”的——这两个参数只影响服务端证书加载,不触发客户端证书校验。真正启用双向验证,必须同时满足服务端强制、用户级约束、客户端显式传参三者缺一不可。
require_secure_transport = ON 是双向验证的前提
如果服务端没开这个开关,哪怕所有证书都配对、用户也写了 REQUIRE X509,客户端仍能用非 SSL 方式连上(比如 mysql -u u -p 不带任何 SSL 参数)。这不是“可选”,是硬性守门员。
-
require_secure_transport = ON必须写在[mysqld]段,重启生效;设为OFF或注释掉就等于关掉整个 SSL 通道闸门 - 它和
ssl_mode = REQUIRED完全不同:ssl_mode是客户端行为控制,服务端根本不读这个值 - 开启后,任何未走 TLS 的连接会直接被拒绝,报错类似
ERROR 1045 (28000): Access denied for user,但实际原因不是密码错,而是协议被拒
CREATE USER 里的 REQUIRE 才决定是否校验客户端证书
用户创建时没写 REQUIRE 子句,或只写 REQUIRE SSL,都不算双向。只有明确指定证书相关约束,服务端才会在握手阶段要求客户端出示并校验其证书。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 最低门槛:
CREATE USER 'u'@'%' REQUIRE X509—— 只校验证书格式和签名链,不检查内容 - 生产推荐:
CREATE USER 'u'@'%' REQUIRE SUBJECT '/CN=client1/O=myorg'——SUBJECT必须和openssl x509 -in client-cert.pem -text -noout | grep Subject输出**逐字一致**,包括空格、大小写、字段顺序 -
ALTER USER ... REQUIRE X509会覆盖之前所有 REQUIRE 条件,不能叠加;想加ISSUER就得重写整条REQUIRE - 注意:
GRANT ... REQUIRE X509无效,只有CREATE USER或ALTER USER支持该语法
mysql 命令行客户端必须显式传 --ssl-* 参数
客户端不会自动读取系统或配置文件里的 SSL 设置,漏掉任一必要参数都会失败,且错误提示极不友好——常表现为 Access denied 或模糊的 SSL connection error。
- 最小可行组合:
mysql --ssl-mode=REQUIRED --ssl-ca=/path/to/ca.pem --ssl-cert=/path/to/client-cert.pem --ssl-key=/path/to/client-key.pem -u u -p -
--ssl-mode=REQUIRED不能省,设成PREFERRED或DISABLED会导致降级为明文连接,服务端因require_secure_transport = ON直接拒连 -
--ssl-cert和--ssl-key必须成对出现;私钥不能加密(即生成时不能用-aes256),否则客户端启动时卡住或静默失败 - 如果服务端用了
REQUIRE SUBJECT,客户端证书的Subject字段必须完全匹配,建议用openssl x509 -in client-cert.pem -text -noout现场核对
最容易被忽略的是:服务端 ssl_ca 配置必须指向**签发客户端证书的那个 CA 根证书(ca.pem)**,而不是服务端自签名用的中间 CA;如果用了多级 CA,ssl_ca 应该是根 CA,且客户端证书链要完整(即 client-cert.pem 文件里得包含中间证书)。否则握手时服务端无法构建信任链,校验直接失败。

















