先确认证书过期而非配置错误:执行SHOW VARIABLES LIKE 'ssl_ca'获路径,用sudo -u mysql cat验证权限(600、属主mysql),openssl检查有效期(Not After须晚于2026-08-13),云数据库查控制台ValidTill;新证书必须含subjectAltName(DNS/IP全覆盖),否则MySQL 8.0.29+/5.7.44+静默禁用SSL。

直接换证书,别修配置文件——90% 的“连不上”是服务端 CA 或 server-cert 过期,MySQL 启动时不会报错,但 have_ssl 会静默变成 DISABLED,SHOW STATUS LIKE 'Ssl_cipher'; 返回空。
怎么确认真是证书过期,不是路径写错了
先别改 my.cnf。登录 MySQL 实例执行:
-
SHOW VARIABLES LIKE 'ssl_ca';拿到路径后,立刻用sudo -u mysql cat /path/to/ca.pem | head -1测试可读性(权限必须是600,属主必须是mysql) -
openssl x509 -in /path/to/ca.pem -text -noout | grep -E "(Not Before|Not After)"查有效期;当前时间是 2026-08-13,若Not After早于此日期,就是它了 - 云数据库(如阿里云 RDS、Azure Flexible Server)查不到文件,得去控制台「SSL/TLS 设置」页看
ValidTill字段,或调 API
新证书必须带 subjectAltName,否则 MySQL 8.0.29+ 直接跳过
MySQL 8.0.29+ 和 5.7.44+ 默认拒绝加载不含 subjectAltName 的证书,且不报错。生成时漏掉,have_ssl 就是 DISABLED,你根本意识不到 SSL 被禁用了。
- DNS 必须覆盖所有连接方式:比如用
localhost连,subjectAltName里就得有DNS:localhost;用内网 IP 连,就得加IP:10.0.1.5 - OpenSSL 3.0+ 可用
-addext "subjectAltName = DNS:db.example.com,IP:127.0.0.1";老版本必须用配置文件,在[req_ext]段显式写 - 别只靠
CN:MySQL 8.0+ 不再信任仅靠CN匹配的证书,CN和SAN都得对得上实际连接地址
证书换了,为什么客户端还是连不上
证书文件更新只是第一步,MySQL 进程和客户端上下文都得同步刷新:
- 服务端必须重载 TLS 配置:
ALTER INSTANCE RELOAD TLS;(MySQL 5.7.36+/8.0.16+);老版本只能service mysql restart - Java 应用的 JVM 启动时已加载
truststore,必须重启应用;若用keytool导入了新 CA,记得指定-keystore路径是否正确 - 命令行工具如
mysql -u root -p默认不读配置里的证书,必须显式传:--ssl-ca=/new/path/ca.pem --ssl-cert=/new/path/client-cert.pem --ssl-key=/new/path/client-key.pem - 客户端若用
sslMode=VERIFY_CA或VERIFY_IDENTITY,且服务端证书 SAN 不全,会报X509_check_private_key:key values mismatch类似错误,不是私钥不匹配,是验证失败被误报
最容易被忽略的是权限和路径:服务端 ssl_ca 必须写在 [mysqld] 段,路径必须绝对,不能是 ~/ca.pem 或 ./ca.pem;客户端读 [client] 段,Docker 或 systemd 环境下 HOME 可能被重置,~/.my.cnf 很可能不生效。


















