确认 MySQL SSL 是否启用需查 SHOW VARIABLES LIKE 'have_ssl' 和 ssl_ca/ssl_cert/ssl_key 是否非空;have_ssl=YES 仅表示编译支持,非启用;必须重启 mysqld 且配置完整证书路径与权限才生效。

如何确认 MySQL 服务器是否已启用 SSL
直接查 SHOW VARIABLES LIKE 'have_ssl'; 或 SHOW VARIABLES LIKE 'ssl_mode';。如果返回 DISABLED 或 NO,说明 SSL 没生效,光配证书没用——MySQL 启动时没加载或配置有误。
常见错误现象:客户端连上后执行 STATUS; 看到 SSL: Not in use;或者用 mysql --ssl-mode=REQUIRED -u user -p 连接失败,报错 SSL connection error: protocol version mismatch。
- 必须重启
mysqld才能让 SSL 配置生效,改完my.cnf不重启等于白配 -
have_ssl为YES仅表示编译支持,不等于已启用;真正要看ssl_ca、ssl_cert、ssl_key这三个变量是否非空 - 某些云数据库(如阿里云 RDS、腾讯云 CDB)默认强制 SSL,但不提供私钥下载,此时客户端只能用 CA 证书验证服务端,不能双向认证
my.cnf 中必须写的 SSL 配置项
只写 ssl-ca 不够,MySQL 要求服务端证书和私钥同时存在且权限严格——否则启动失败,日志里出现 Failed to set up SSL because of errors。
典型配置段落(放在 [mysqld] 下):
ssl-ca = /var/lib/mysql/ca.pem ssl-cert = /var/lib/mysql/server-cert.pem ssl-key = /var/lib/mysql/server-key.pem
- 路径必须是绝对路径;文件需由
mysql用户可读(chown mysql:mysql+chmod 600 server-key.pem) - 证书链不能拼在
server-cert.pem里,MySQL 不识别中间证书;如有中间 CA,得合并进ca.pem - 别用自签名证书配
require_secure_transport = ON,否则客户端连不上——因为自签证书无法被系统信任,会触发握手失败
客户端连接时怎么指定 SSL 模式
不是所有 --ssl-xxx 参数都等价:--ssl-mode 是 MySQL 8.0+ 的统一开关,旧版本得拆开写;设错模式会导致连接降级或拒绝。
-
--ssl-mode=DISABLED:彻底不用 SSL(危险,慎用) -
--ssl-mode=REQUIRED:必须加密,但不校验证书(适合内网自签场景) -
--ssl-mode=VERIFY_CA:校验证书是否由指定 CA 签发(推荐生产环境用) -
--ssl-mode=VERIFY_IDENTITY:额外校验域名匹配(要求证书subjectAltName包含实际访问地址)
示例命令:
mysql --ssl-mode=VERIFY_CA --ssl-ca=/path/to/ca.pem -u appuser -p
注意:Java JDBC 连接串里要加 &enabledTLSProtocols=TLSv1.2,否则可能因协议协商失败报 Connection reset。
为什么用了 SSL 还被提示 “Insecure connection”
MySQL 客户端默认不强制加密,即使服务端开了 SSL,普通 mysql -u user -p 命令仍走非加密通道——这是设计行为,不是 bug。
- 检查连接后执行
SELECT @@session.ssl_cipher;,返回空字符串说明根本没走 SSL - 用户账号没绑定 SSL 要求,
CREATE USER 'u'@'%' REQUIRE SSL;才能强制该账号必须加密连接 - Docker 或 Kubernetes 环境中,容器内时间不同步会导致证书“尚未生效”,表现为
SSL certificate is not yet valid
证书有效期、主机名匹配、TLS 协议版本这三项,任何一个不满足,SSL 握手就会静默降级,而不是报错——所以得主动查 ssl_cipher 字段确认。










