查当前连接是否加密必须用SHOW STATUS LIKE 'Ssl_cipher',有值才表示真加密;仅看have_ssl或ssl_ca路径无效,还需确认ssl_ca/ssl_cert/ssl_key非空可读、require_secure_transport=ON、用户REQUIRE SSL且客户端指定--ssl-mode=REQUIRED。

只查 SHOW VARIABLES LIKE 'have_ssl' 是无效的——它只告诉你“编译时有没有 SSL”,不反映当前连接是否加密。
查当前连接是否真走 SSL:用 STATUS 或 SHOW STATUS LIKE 'Ssl_cipher'
这是唯一能反映真实连接状态的方式。客户端连上去后,执行:
STATUS;
或
SHOW STATUS LIKE 'Ssl_cipher';
如果输出中 Ssl_cipher 有值(比如 ECDHE-ECDSA-AES256-GCM-SHA384),说明当前连接已加密;如果为空或 NULL,就是明文传输,哪怕服务端证书全配好了也没用。
常见误区:误把 SHOW VARIABLES LIKE 'ssl_ca' 返回路径当成“已启用”。路径存在 ≠ 连接加密,MySQL 启动时读取失败会静默跳过,Ssl_cipher 才是铁证。
查服务端证书配置是否加载成功:看 ssl_ca/ssl_cert/ssl_key 是否非空且路径可读
执行:
SHOW VARIABLES LIKE 'ssl_%';
重点确认三项都返回**绝对路径**(不能是 ~/ 或相对路径),且文件真实存在:
-
ssl_ca指向ca.pem -
ssl_cert指向server-cert.pem -
ssl_key指向server-key.pem
然后手动验证文件权限和归属:
ls -l /var/lib/mysql/server-key.pem
必须是 -rw------- 1 mysql mysql(即 chmod 600 + chown mysql:mysql),否则 MySQL 启动时拒绝加载,have_ssl 可能仍显示 DISABLED。
查强制 SSL 是否开启:require_secure_transport 必须为 ON
执行:
SHOW VARIABLES LIKE 'require_secure_transport';
返回 ON 才代表服务端拒绝所有非 SSL 连接。如果返回 OFF,即使用户设了 REQUIRE SSL,攻击者仍可能绕过(比如用旧客户端降级)。
注意:require_secure_transport = ON 是 MySQL 5.7.12+ 才支持的硬开关,旧版本只能靠 skip_ssl = OFF,但不可靠——它不阻止明文连接,只影响默认行为。
客户端连上去后还显示明文?优先排查这三处
不是配置没写对,而是以下任一环节断了链:
- 客户端没加
--ssl-mode=REQUIRED(或更严格的VERIFY_CA),默认就是明文 - 用户没设
REQUIRE SSL,比如用root@localhost这类默认用户连,即使服务端开了 SSL,它也允许降级 - 服务端错误日志里有
Failed to set up SSL,通常是证书路径错、权限不对、或 OpenSSL 版本不兼容(比如 Alpine 镜像用 WolfSSL 替代 OpenSSL)
真正生效的 SSL 连接,必须同时满足:服务端证书加载成功 + require_secure_transport = ON + 用户权限含 REQUIRE SSL + 客户端显式启用 SSL 模式。漏掉任何一环,连接都会静默裸奔,你根本不会收到报错。


















