确认 mysql ssl 是否启用需查 show status like 'ssl_cipher';,若为空则当前连接未加密;服务端须配置 ssl_ca、ssl_cert、ssl_key 且路径可读,客户端需显式指定 --ssl-mode(如 required/verify_ca/verify_identity)。

如何确认 MySQL 服务端已启用 SSL
MySQL 启动时没配对证书,ssl_mode=DISABLED 就是默认值,客户端连上去根本不会走加密——你看到的 SHOW VARIABLES LIKE 'have_ssl'; 返回 YES 只代表“编译支持”,不等于“正在用”。真正要看的是:SHOW STATUS LIKE 'Ssl_cipher';。如果返回空值或 "",说明当前连接没启用 SSL,哪怕服务端证书全配好了也没用。
实操建议:
- 检查
mysqld启动时是否加载了证书路径:确认配置文件(如/etc/my.cnf)里有ssl_ca、ssl_cert、ssl_key三项,且路径可读 - 运行
mysql -u root -p -e "SHOW VARIABLES LIKE 'ssl%';",重点看ssl_ca、ssl_cert、ssl_key是否非空;再查SHOW STATUS LIKE 'Ssl_version';,返回 TLSv1.2 或更高才靠谱 - 别信
have_ssl=DISABLED就一定不能用——某些旧版本(如 5.7.10 前)即使显示 DISABLED,只要证书路径正确、权限到位,仍可强制启用
客户端连接时强制走 SSL 的三种写法差异
MySQL 客户端不加约束,默认走明文。要加密,必须显式指定 SSL 模式,但不同写法行为差别很大:
-
mysql --ssl-mode=REQUIRED -u user -p:只验证服务端证书存在,不校验 CA 或域名,适合内网可信环境 -
mysql --ssl-mode=VERIFY_CA -u user -p --ssl-ca=/path/to/ca.pem:校验服务端证书是否由指定 CA 签发,但不检查证书 CN 或 SAN,防中间人能力有限 -
mysql --ssl-mode=VERIFY_IDENTITY -u user -p --ssl-ca=/path/to/ca.pem:最严格,既验 CA 签发,也核对证书里的主机名是否匹配连接地址(比如连db.internal,证书 CN 必须是db.internal),DNS 解析和证书必须对得上
常见错误现象:SSL connection error: SSL is required but the server doesn’t support it,通常是客户端开了 SSL 模式,但服务端 require_secure_transport=OFF 或根本没加载证书。
MySQL 8.0+ 中 require_secure_transport 的坑
设成 ON 看似安全,但会直接拒绝所有非 SSL 连接,包括本地 localhost 的 Unix socket 连接(因为 socket 不走 TCP,无法套 SSL)。很多运维脚本、监控探针、备份工具默认用 localhost,一开就全挂。
实操建议:
- 先执行
SET PERSIST require_secure_transport = ON;(持久化生效),再逐个测试所有接入方:应用、备份脚本、DBA 工具、健康检查接口 - 若必须保留本地免密访问,改用
127.0.0.1替代localhost,这样走 TCP,能套 SSL - 注意权限兼容性:开启后,
GRANT ... REQUIRE SSL的用户语句依然有效,但全局开关优先级更高;已有用户无需重赋权,但新用户建议统一用REQUIRE X509或REQUIRE SUBJECT明确约束
证书过期或路径权限不对导致的静默失败
MySQL 加载证书失败时,通常不报错,只默默退回到非 SSL 模式。日志里可能只有模糊提示:Failed to set up SSL because of missing private key 或更隐蔽的 SSL error: Unable to get certificate from file。
- 检查证书链完整性:
openssl x509 -in server-cert.pem -text -noout确认有效期;用openssl rsa -in server-key.pem -check -noout验私钥是否损坏 - 路径权限必须严格:MySQL 进程用户(如
mysql)需对证书文件有read权限,且目录不能有写权限(OpenSSL 会拒绝加载 world-writable 目录下的证书) - 证书格式必须是 PEM:不能是 DER 或 PFX;私钥不能加密(即不能带 passphrase),否则启动失败且无明确提示
最容易被忽略的是 SELinux 或 AppArmor:即使文件权限全对,策略也可能拦截 mysqld 读取证书路径。临时关掉策略验证一下,能快速定位是不是这层问题。










