证书过期是90% ssl连接失败主因,需先查ca.pem有效期,确认后更新带subjectaltname的新证书,并确保ssl-ca路径绝对、权限600、属主mysql,再重载mysql配置。

安装MySQL时提示SSL连接错误,绝大多数情况不是安装失败,而是服务端证书已过期或客户端没配对验证参数——别急着重装,先查证书有效期和客户端连接模式。
怎么快速确认是证书过期而不是配置写错?
服务端证书过期占所有SSL连接失败的90%以上,且MySQL不会明说。直接在服务器上执行:
openssl x509 -in /var/lib/mysql/ca.pem -text -noout | grep -E "(Not Before|Not After)"
如果Not After早于当前日期(比如显示2026-06-14),就是它了。MySQL 8.0.29+ 可用SHOW VARIABLES LIKE 'ssl_cert_expire_date';查,返回空或旧日期也说明证书失效。
- 云数据库(RDS/AWS/腾讯云)直接去控制台「SSL 设置」页看
ValidTill字段,别SSH翻文件 - 新证书必须带
subjectAltName,否则MySQL 8.0+会静默跳过加载——have_ssl显示DISABLED、SHOW STATUS LIKE 'Ssl_cipher';返回空,你根本意识不到证书被无视了 -
subjectAltName要覆盖所有连接方式:用localhost连?加DNS:localhost;用内网IP10.0.1.5?加IP:10.0.1.5;域名是db.example.com?加DNS:db.example.com
客户端连不上,先关验证再定位责任方
服务端证书更新后,客户端可能还在用旧CA、缓存路径、或默认信任系统根证书。临时绕过验证能快速分清是服务端还是客户端的问题:
- 命令行测试:
mysql --ssl-mode=VERIFY_CA --ssl-ca=/path/to/new-ca.pem -u user -h host -p,报unable to get local issuer certificate说明客户端CA路径不对或文件损坏 - 只写
--ssl-mode=REQUIRED不带--ssl-ca,等于告诉MySQL“只要加密,别管是谁”,生产环境禁用 - 路径必须是绝对路径,
~/ca.pem或./ca.pem在某些shell里会解析失败 - 阿里云RDS、腾讯云CDB等必须用控制台下载的
RDS-Global-Bundle.pem或aliyun-rds-ca-cert.pem,不能用mysql_ssl_rsa_setup生成的本地证书
PDO/Java/JDBC连报SSLHandshakeException怎么办?
这类错误基本锁定在JVM或PHP运行时加载证书环节,跟MySQL服务端关系不大:
- DBeaver:连接编辑页 → Driver properties → 找到
sslTrustCertificate,填绝对路径(如/home/user/certs/aliyun-rds-ca-cert.pem),同时确认useSSL=true且sslMode=REQUIRED - JDBC URL里不能只靠
sslMode=REQUIRED,必须显式传入trustCertificateKeyStoreUrl和trustCertificateKeyStorePassword,例如:jdbc:mysql://xxx:3306/db?sslMode=REQUIRED&trustCertificateKeyStoreUrl=file:/tmp/rds-ca.pem&trustCertificateKeyStorePassword=changeit - PDO必须通过DSN或
options数组显式传入SSL参数,mysqli_ssl_set()对PDO完全无效;ssl_mode=VERIFY_IDENTITY要求PDO::MYSQL_ATTR_SSL_CA必须指定,且CA文件得包含根证书+所有中间证书 - JVM版本太老(如Java 8u151之前)不支持TLSv1.2,而MySQL 8.0+默认协商TLSv1.2,需升级JVM或在JDBC URL加
enabledTLSProtocols=TLSv1.2
真正容易被忽略的是权限和路径细节:ssl-ca必须写在[mysqld]段,不能放[client];文件属主必须是mysql用户,权限必须是600;重启前手动测试sudo -u mysql cat /etc/mysql/ssl/ca.pem | head -1,能读才说明权限和路径都对。











