直接检查服务端证书有效期:openssl x509 -in /var/lib/mysql/ca.pem -text -noout | grep -e "(not before|not after)",若not after早于当前时间即为过期。

MySQL客户端报错 SSL connection error: certificate verify failed 怎么快速定位是不是证书过期
直接查服务端证书有效期,别绕路试配置或重装驱动。MySQL本身不报“证书已过期”,而是把底层 OpenSSL 的校验失败笼统抛成这个错误,所以得自己挖。
进入 MySQL 服务所在服务器,运行:
openssl x509 -in /var/lib/mysql/ca.pem -text -noout | grep -E "(Not Before|Not After)"
如果 Not After 时间早于当前系统时间,就是它了。注意:客户端和服务端可能各自用不同证书(比如客户端用 client-cert.pem),但绝大多数连接失败由服务端 ca.pem 或 server-cert.pem 过期引发。
- 检查前先确认 MySQL 配置里
ssl_ca、ssl_cert、ssl_key指向的路径真实存在且可读 - 如果用的是自签名证书,
ca.pem和server-cert.pem通常一起生成,过期时间一致 - 云数据库(如阿里云 RDS、AWS RDS)不提供文件级访问,需查控制台「SSL/TLS 设置」页的证书有效期,或调用对应 API 查
ValidTill
更新 MySQL 服务端 SSL 证书后为什么客户端还是连不上
证书文件换了,但 MySQL 进程没重新加载,或者客户端缓存了旧 CA。
必须执行两步:重载证书配置 + 重启连接上下文。
- 在 MySQL 服务端执行
ALTER INSTANCE RELOAD TLS;(MySQL 5.7.36+ / 8.0.16+),比重启 mysqld 更轻量;老版本只能service mysql restart - 客户端如果是 Java 应用,JVM 启动时已加载 truststore,必须重启应用;Python 的
pymysql或mysql-connector-python默认不缓存证书,但若代码里显式传了ssl_ca路径,要确认该路径指向新证书 - 命令行工具如
mysql -u root -p --ssl-ca=/path/to/new/ca.pem必须显式指定新 CA,否则可能沿用编译时内置的默认 CA 路径(如/etc/ssl/certs/ca-certificates.crt)
用 OpenSSL 自签证书时哪些参数容易导致连接失败
不是所有自签名证书 MySQL 都认。关键在 X.509 扩展字段和密钥用法,MySQL 8.0+ 尤其严格。
生成 server-cert.pem 时,必须包含 subjectAltName,且不能只写 IP;若用域名连接,CN 和 SAN 都得匹配实际连接地址。
- 错误示范:
openssl req -new -key server-key.pem -out server-req.pem(缺 SAN,MySQL 8.0.28+ 拒绝加载) - 正确做法:用配置文件生成,确保含
subjectAltName = DNS:db.example.com,IP:10.0.1.5;若本地测试用localhost,SAN 里必须有DNS:localhost - 密钥用法(Key Usage)至少要含
digitalSignature, keyEncipherment;扩展密钥用法(Extended Key Usage)建议加serverAuth - 证书签名算法避免用
sha1WithRSAEncryption,MySQL 8.0.26+ 默认禁用 SHA-1
Java 客户端连接 MySQL SSL 报 PKIX path building failed 怎么处理
这是 JVM 找不到信任链,不是 MySQL 配置问题。错误信息里带 sun.security.provider.certpath.SunCertPathBuilderException 就是它。
根本解决方式:把新 CA 证书导入 JVM 的 cacerts,而不是仅放在项目 resources 下靠代码加载。
- 用
keytool -import -trustcacerts -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit -alias mysql_ca -file ca.pem - 如果应用跑在 Docker 里,必须在镜像构建阶段导入,或挂载修改后的
cacerts文件,不能只改宿主机 - Spring Boot 项目若用
spring.datasource.hikari.data-source-properties.sslMode=REQUIRED,仍需确保 JVM 级信任库已更新,否则照样失败 - 临时验证可用
-Djavax.net.debug=ssl:handshake开启 SSL 握手日志,看 JVM 最终尝试校验哪个证书路径
证书更新不是改完文件就完事,MySQL 进程、客户端运行时环境、甚至中间代理(如 ProxySQL、HAProxy)都可能持有旧证书缓存。最容易被忽略的是:云厂商控制台显示证书已更新,但后端节点滚动发布未完成,部分实例还在用旧证书——这种需要结合 SHOW STATUS LIKE 'Ssl_version'; 和 SELECT * FROM performance_schema.status_by_thread WHERE VARIABLE_NAME = 'Ssl_cipher'; 实时核对。










