使用--ssl-verify-server-cert连接本地MySQL报SSL证书验证失败求助
环境:db-host运行MariaDB 5.5(数月内无法升级),web-host运行Tomcat。此前已配置CA证书包实现TLS加密连接,近期连接被拒绝。
登录db-host执行连接命令:
db-host> mysql -h localhost -u dbuser -p --ssl-ca=/etc/pki/bundle-of-certs.crt --ssl-verify-server-cert Enter password: (输入正确密码) ERROR 2026 (HY000): SSL connection error: SSL certificate validation failure
- 不加
--ssl-verify-server-cert参数能成功连接,但ssl_cipher为空 - 已确认
ssl_ca、ssl_cert、ssl_key配置正确,指向对应文件 /etc/pki/bundle-of-certs.crt包含多个CA证书(含过期和有效证书),文件数月未修改- 用
openssl验证服务器证书有效:
db-host> openssl verify -CAfile /etc/pki/bundle-of-certs.crt /etc/pki/db-host.crt /etc/pki/db-server.crt: OK
- 已确认
db-host.crt的CN和SAN符合预期
附注:Web应用连接时报错SSHHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate),怀疑是证书验证失败导致,优先解决证书问题。
更新1(回复Georg Richter)
执行mysql -h db-host -u user --ssl-verify-server-cert ....仍报SSL certificate validation failure。执行show variables like '%ssl%';结果:
| Variable_name | Value +---------------+-------------- | have_openssl | YES | have_ssl | YES | ssl_ca | /etc/pki/bundle-of-certs.crt | ssl_capath | (空) | ssl_cert | /etc/pki/db-host.crt | ssl_cipher | (空) | ssl_key | /etc/pki/db-host.key
更新2
执行以下命令出现结果不一致:
db-host> mysql -u user -h db-host -p --ssl Enter password: MariaDB [(none)]: \s SSL: Cipher in use is DHE-RSA-AES256-GCM-SHA384 MariaDB> show variables like 'ssl_cipher' | ssl_cipher | (空)
即使命令行指定--ssl-ca --ssl-cert --ssl-key正确值,\s显示已使用RSA密码套件,但show variables仍为空。
更新2.1:确认服务器证书的X509 Subject Alternative Name包含DNS: db-host.foo.bar.baz, DNS:db-host, DNS:localhost,主机名/短名/localhost连接在证书层面等效。
更新3
查询状态变量发现:
> show status like 'ssl_version'; | Ssl_version | TLSv1.2 > show status like 'ssl_cipher'; | Ssl_cipher | DHE-RSA-AES256-GCM-SHA384 > show variables like 'ssl_cipher'; | Ssl_cipher | (空)
怀疑此前方向错误,需重新排查。
清理CA证书包中的过期证书
MariaDB 5.5的SSL验证逻辑可能因证书包中存在过期证书触发失败,即使目标证书由有效CA签发。移除bundle-of-certs.crt中的过期证书,仅保留有效CA证书后重新测试连接。检查TLS协议与密码套件兼容性
Web应用的No appropriate protocol错误,大概率是Tomcat与MariaDB 5.5的TLS支持不匹配:- 执行
openssl version查看db-host的OpenSSL版本,若低于1.0.1则不支持TLSv1.2 - 检查Tomcat的JVM参数(如
-Djdk.tls.disabledAlgorithms)或连接器配置,是否禁用了MariaDB支持的协议/密码套件
- 执行
澄清
ssl_cipher变量与状态的差异show variables like 'ssl_cipher'显示的是服务器强制密码套件列表(为空表示允许所有支持的套件),show status like 'ssl_cipher'和\s显示的是当前连接实际使用的套件,二者差异是正常现象,无需纠结。检查主机名解析与证书验证细节
尝试用127.0.0.1连接测试,部分旧版本SSL库对localhost和127.0.0.1的验证逻辑不同,若IP连接失败,需在证书中添加IP类型的SAN。验证证书文件权限
确认/etc/pki/bundle-of-certs.crt、db-host.crt、db-host.key的权限允许MariaDB进程读取(如属主为mysql用户,权限设为600/644),权限不足会导致证书读取失败,间接引发验证错误。抓包分析SSL握手过程
在db-host执行tcpdump -i any port 3306 -w mysql-ssl.pcap抓包,用Wireshark分析SSL/TLS流的详细阶段,定位握手失败的具体原因。
内容的提问来源于stack exchange,提问作者Codes with Hammer

