账号强制加密连接
MySQL 账号可以声明传输层要求:REQUIRE SSL 只要求走加密通道;REQUIRE X509 还要求客户端出示有效证书;REQUIRE ISSUER / SUBJECT 再按证书的签发者或主题做匹配。客户端配合 --ssl-mode=VERIFY_CA 或 VERIFY_IDENTITY 校验服务端,就能形成双向校验,避免链路被抓包或服务端被冒充。
基本信息
| 适用平台 | MySQL 5.7 / 8.0;更早版本用 --ssl-ca 等老参数 |
|---|---|
| 账号级选项 | REQUIRE SSL / X509 / ISSUER / SUBJECT / CIPHER |
| 客户端选项 | --ssl-mode=DISABLED|PREFERRED|REQUIRED|VERIFY_CA|VERIFY_IDENTITY |
| 前置条件 | 服务端已启用 TLS 并配置好证书与私钥 |
| 校验强度 | REQUIRE SSL 只保证加密,不校验对端身份 |
| 查看现状 | SHOW STATUS LIKE 'Ssl_cipher' 与 Ssl_version |
典型使用场景
- 财务、身份、支付类账号强制加密,满足合规对传输安全的要求
- 跨机房或跨公网链路访问数据库时避免口令与数据被抓包
- 多团队共用实例,敏感库用证书校验,普通账号维持 PREFERRED
- 用客户端证书做机器级身份绑定,降低口令泄露后的可用性
- 排障时确认某条连接是否真的走了 TLS
服务端配置与验证
服务端配置与验证
# 账号级传输要求
ALTER USER 'finance'@'%' REQUIRE SSL; # 必须加密
ALTER USER 'batch'@'10.0.%' REQUIRE X509; # 必须带客户端证书
ALTER USER 'app'@'10.0.%' REQUIRE ISSUER '/CN=Corp-CA'; # 限定签发者
# 服务端侧确认 TLS 参数已配置
SHOW VARIABLES LIKE 'tls_version';
SHOW STATUS LIKE 'Ssl_cipher_list';
# 查看当前会话是否加密
SHOW SESSION STATUS LIKE 'Ssl_version';
SHOW SESSION STATUS LIKE 'Ssl_cipher';客户端连接
客户端连接
# 校验服务端证书链与主机名,并带上客户端证书做双向校验
mysql --ssl-mode=VERIFY_IDENTITY --ssl-ca=/etc/mysql/ca.pem \
--ssl-cert=/etc/mysql/client-cert.pem --ssl-key=/etc/mysql/client-key.pem \
-h db.example.com -ufinance -p
# 确认连接实际使用的加密套件
mysql --ssl-mode=VERIFY_CA --ssl-ca=/etc/mysql/ca.pem -h db.example.com -uapp -p -e "SHOW STATUS LIKE 'Ssl_cipher';"模式与校验范围
| 模式或选项 | 校验内容 | 适用场景 |
|---|---|---|
| --ssl-mode=REQUIRED | 只要求加密通道 | 内网可信网段 |
| --ssl-mode=VERIFY_CA | 校验对端证书是否由指定 CA 签发 | 防止自签证书冒充 |
| --ssl-mode=VERIFY_IDENTITY | 在前者基础上再校验主机名 | 公网或跨网访问 |
| REQUIRE SSL | 服务端要求加密,不校验客户端证书 | 基础合规 |
| REQUIRE X509 | 要求客户端证书有效 | 机器身份绑定 |
| REQUIRE ISSUER | 按证书签发者精确匹配 | 只信任自有 CA |
8.0 客户端默认 --ssl-mode=PREFERRED,即优先加密但不校验证书,因此「连接是加密的」不等于「对端可信」。要做到端到端可信,客户端必须显式使用 VERIFY_CA 或 VERIFY_IDENTITY,并带上 CA 文件路径。
批量把账号切成 REQUIRE 之前先摸底客户端能力:老驱动、老连接池可能不支持 TLS,或证书链与主机名不匹配,一刀切会让业务成批连不上。稳妥做法是先灰度一批账号,确认全部客户端通过后再全量切换。