MySQL SSL证书配置失败主因是证书未被加载:have_ssl=DISABLED、Ssl_cipher为空,根源在于ssl_ca路径非绝对、权限非600、属主非mysql用户,或证书缺失subjectAltName字段;需用sudo -u mysql cat验证可读性,并用openssl确认SAN存在,云数据库须查控制台ValidTill。
MySQL SSL证书配置失败,90%不是配错了参数,而是证书本身不被MySQL 8.0+加载——have_ssl显示DISABLED、SHOW STATUS LIKE 'Ssl_cipher'返回空,说明MySQL根本没用上证书,连校验环节都没走到。
MySQL启动时对ssl_ca文件的读取极为苛刻,静默失败是常态:
ssl-ca必须写在[mysqld]段,写在[client]或[mysql]里完全无效./ca.pem或~/ssl/ca.pem会被忽略mysql用户(Linux),权限必须为600;644或755都会导致加载失败sudo -u mysql cat /etc/mysql/ssl/ca.pem,若报“Permission denied”或“No such file”,就别指望MySQL能读到MySQL 8.0.28+强制要求证书含subjectAltName(SAN),缺它就跳过加载,且不报错:
CN=db.example.com不够,必须显式声明subjectAltName = DNS:db.example.com,IP:10.0.1.5,IP:127.0.0.1
-addext "subjectAltName=...",但老版本必须用配置文件,否则生成的证书无SANopenssl x509 -in server-cert.pem -text -noout | grep -A1 "Subject Alternative Name"确认字段存在have_ssl永远是DISABLED
先排除服务端证书过期,再动客户端配置:
openssl x509 -in /var/lib/mysql/ca.pem -text -noout | grep -E "(Not Before|Not After)",Not After早于当前时间即失效ValidTill字段--ssl-mode=VERIFY_IDENTITY和--ssl-ca=/path/to/ca.pem,只写--ssl-mode=REQUIRED等于没校验sslTrustCertificate(绝对路径),JDBC需传trustCertificateKeyStoreUrl,PDO需DSN里带ssl_mode=VERIFY_IDENTITY并设PDO::MYSQL_ATTR_SSL_CA
最容易被忽略的是:证书换了,但MySQL进程没重载TLS上下文。老版本只能service mysql restart,新版本(5.7.36+/8.0.16+)应优先用ALTER INSTANCE RELOAD TLS;——否则你改了证书、改了配置、清了缓存,还是连不上。