MySQL TLS 加密连接是什么
MySQL 8.0 默认支持 TLS:实例启动时会自动生成自签证书,客户端可以用加密连接,也可以用 REQUIRE SSL 要求某个账号必须走加密。加密解决的是传输过程中的监听问题。需要区分强度等级:只要加密不代表能防中间人,客户端开启 VERIFY_IDENTITY 并配置 CA 才能真正校验收到的证书属于目标主机。
基本信息
| 服务端状态 | SHOW VARIABLES LIKE 'have_ssl';证书相关变量前缀为 ssl_ |
|---|---|
| 连接加密状态 | SHOW STATUS LIKE 'Ssl_cipher',非空表示当前连接已加密 |
| 强制加密账号 | CREATE USER ... REQUIRE SSL / ALTER USER ... REQUIRE SSL |
| 客户端校验 | mysql --ssl-mode=VERIFY_IDENTITY 配合 --ssl-ca |
| 证书类型 | 8.0 默认自动生成自签证书,也可替换为企业 CA 签发证书 |
典型使用场景
- 跨网络访问:应用与数据库不在同一可信内网时开启加密
- 合规要求:规范明确禁止数据库流量明文传输
- 账号强制加密:对特权账号设置 REQUIRE SSL,确保不会明文传输口令
- 证书替换:用企业 CA 签发证书替换自签证书,配合客户端 CA 校验
- 排查核对:确认当前连接是否真的加密,避免「以为开了其实没开」
检查与配置
检查与配置
-- 服务端是否支持加密连接
SHOW VARIABLES LIKE 'have_ssl';
-- 当前连接的加密状态:Ssl_cipher 非空表示已加密
SHOW STATUS LIKE 'Ssl_cipher';
SHOW STATUS LIKE 'Ssl_version';
-- 按会话维度查看(8.0 通过 performance_schema)
SELECT * FROM performance_schema.session_status WHERE VARIABLE_NAME = 'Ssl_cipher';
-- 要求某个账号必须使用加密连接
ALTER USER 'app'@'10.0.%' REQUIRE SSL;客户端校验连接参数
客户端校验连接参数
# 只加密不校验证书身份
mysql --ssl-mode=REQUIRED -uapp -p -h 10.0.0.5
# 加密并校验证书链与主机名(推荐)
mysql --ssl-mode=VERIFY_IDENTITY --ssl-ca=/etc/mysql/certs/ca.pem -uapp -p -h 10.0.0.5
# 检查当前连接使用情况
mysql -uapp -p -e "SHOW STATUS LIKE 'Ssl_cipher';"强度等级对照
| 配置 | 加密 | 防中间人 | 适用场景 |
|---|---|---|---|
| 默认(不指定) | 视客户端与账号要求 | 无 | 仅可信内网 |
| --ssl-mode=REQUIRED | 有 | 无 | 过渡阶段 |
| --ssl-mode=VERIFY_CA | 有 | 校验签发链 | 自建 CA 环境 |
| --ssl-mode=VERIFY_IDENTITY | 有 | 校验签发链与主机名 | 跨网络的标准做法 |
Ssl_cipher 为空只说明「当前这条连接没加密」,不代表服务端不支持加密:账号要求、客户端参数与是否提供证书都会影响协商结果。
使用自签证书时开启 VERIFY_IDENTITY 会校验失败:需要提供对应 CA 文件,或改用企业 CA 签发的证书,跳过校验只适合临时排查。