最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何解决MySQL SSL证书配置失败?
时间:2026-08-25 09:55:49 编辑:袖梨 来源:一聚教程网
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根本没用上证书,连校验环节都没走到。
为什么ssl_ca路径正确却加载失败?
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+拒绝加载?
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 - OpenSSL 3.0+可用
-addext "subjectAltName=...",但老版本必须用配置文件,否则生成的证书无SAN - 生成后用
openssl x509 -in server-cert.pem -text -noout | grep -A1 "Subject Alternative Name"确认字段存在 - 若输出为空,证书就被MySQL无视,
have_ssl永远是DISABLED
客户端连不上,真是证书问题吗?
先排除服务端证书过期,再动客户端配置:
- 查服务端CA有效期:
openssl x509 -in /var/lib/mysql/ca.pem -text -noout | grep -E "(Not Before|Not After)",Not After早于当前时间即失效 - 云数据库(RDS/AWS/腾讯云)无法读文件,直接去控制台查
ValidTill字段 - 命令行连接必须同时指定
--ssl-mode=VERIFY_IDENTITY和--ssl-ca=/path/to/ca.pem,只写--ssl-mode=REQUIRED等于没校验 - DBeaver需填
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;——否则你改了证书、改了配置、清了缓存,还是连不上。