MariaDB终端连接SSL证书验证失败,Java/JDBC连接正常问题求助
问题分析与解决方案
你的Java Servlet+JDBC连接MariaDB正常,但终端连接时报ERROR 2026 (HY000): TLS/SSL error: Validation of SSL server certificate failed,核心原因是JDBC驱动与终端MySQL客户端的SSL验证逻辑、信任机制完全独立,以下是具体排查和修复方向:
1. 服务器证书主机名与终端连接地址不匹配
终端MySQL客户端会严格校验服务器证书中的**Common Name(CN)或Subject Alternative Name(SAN)**字段,必须与你连接时使用的主机名/IP完全一致:
- 查看服务器证书的主机名信息:
重点看openssl x509 -in /etc/mysql/certs/server-cert.pem -text -nooutSubject:行的CN=,以及X509v3 Subject Alternative Name:字段。 - 如果你终端用
mysql -u root -p默认连接localhost,但证书里的CN/SAN是设备主机名(比如raspberrypi),就会触发验证失败。 - 修复方式:
- 重新生成包含
localhost作为SAN/CN的服务器证书; - 终端连接时使用证书匹配的主机名:
mysql -u root -p -h raspberrypi。
- 重新生成包含
2. 终端MySQL客户端未正确加载CA证书配置
虽然你配置了50-client.cnf,但可能存在配置未生效的情况:
- 确认配置文件路径:
50-client.cnf必须放在/etc/mysql/mariadb.conf.d/目录下(MariaDB客户端默认读取路径),否则需要手动指定:mysql -u root -p --defaults-extra-file=/etc/mysql/mariadb.conf.d/50-client.cnf - 检查证书文件权限:确保当前终端用户能读取CA证书:
chmod 644 /etc/mysql/certs/*.pem - 手动指定CA证书测试:跳过配置文件,直接指定CA证书连接,验证是否有效:
mysql -u root -p --ssl-ca=/etc/mysql/certs/ca-cert.pem --ssl-mode=REQUIRED
3. SSL协议与加密套件不兼容
你的MariaDB服务器强制使用TLSv1.2,但终端MySQL客户端的默认加密套件可能不匹配:
- 手动指定TLSv1.2套件连接测试:
mysql -u root -p --ssl-cipher=TLSv1.2 --ssl-mode=REQUIRED - 查看客户端支持的加密套件:
确保输出中包含TLSv1.2相关套件,若没有则需更新MySQL客户端版本。mysql --ssl-cipher=?
4. 双向SSL配置冲突
你在50-client.cnf中配置了客户端证书(ssl-cert/ssl-key),但如果MariaDB服务器未启用客户端证书验证,会导致不必要的验证异常:
- 临时注释
50-client.cnf中的以下两行,重新尝试连接:# ssl-cert = /etc/mysql/certs/client-cert.pem # ssl-key = /etc/mysql/certs/client-key.pem - 如果确实需要双向SSL,需在MariaDB服务器的
50-server.cnf中添加:
并确保客户端证书由服务器信任的CA签名。ssl-verify-client=on
5. 系统CA信任库未包含根证书
终端MySQL客户端可能优先使用系统默认CA信任库(比如/etc/ssl/certs/ca-certificates.crt),若你的自签名CA证书未添加到该库,会导致验证失败:
- 将CA证书添加到系统信任库:
sudo cp /etc/mysql/certs/ca-cert.pem /usr/local/share/ca-certificates/mariadb-ca.crt sudo update-ca-certificates
内容的提问来源于stack exchange,提问作者Marco Renella
相关产品推荐
相关产品推荐

