DBeaver 报 SSLHandshakeException,90% 是 JVM 无法验证目标服务器证书链所致,解决方向只有两个:让 JVM 信任它(导入证书)或临时绕过验证(仅限测试)。

直接说结论: DBeaver 报 SSLHandshakeException,90% 是 JVM 无法验证目标服务器证书链导致的,不是数据库配错了,而是客户端没认出对方的“身份证”。解决方向只有两个:让 JVM 信任它(加证书),或告诉它“这次先别验”(绕过验证,仅限测试)。
为什么 SSLHandshakeException 总在首次连接时爆发
这不是偶发网络抖动,而是 DBeaver 启动时用内置 JRE 去校验远端证书——比如连阿里云 RDS、腾讯云 PostgreSQL 或自建启用了 ssl=on 的 GaussDB。JVM 默认只信任 Oracle 自带的 cacerts 里那几百个根证书,而云厂商的中间 CA 往往不在其中。
- 典型错误信息长这样:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target - 触发场景包括:驱动自动下载失败、新建 MySQL/PostgreSQL 连接点“测试连接”、SSH 隧道复用已配置的 SSL 设置
- 注意:即使 URL 里写了
?sslMode=REQUIRED,只要 JVM 证书库不认服务端证书,照样握手失败
改 Use Windows trust store 设置就能救急
这是最轻量、见效最快的临时解法,特别适合 Windows 下企业环境(域控策略常替换系统证书库)。
- 路径:窗口 → 首选项 → 连接 → 取消勾选
Use Windows trust store - 必须重启 DBeaver 才生效(不是重试连接)
- 如果取消后仍失败,再勾选回去重启——这个“开关抖动”动作本身会触发 DBeaver 重建 TLS 上下文,有时能绕过缓存错位
- 原理:DBeaver 默认优先用 Windows 系统证书库,但某些安全软件或组策略会污染该库;切到 JVM 自带库反而更干净
MySQL/PostgreSQL 驱动层必须显式传证书路径
光靠界面勾选 Use SSL 不够,不同驱动对证书加载逻辑差异很大:
- MySQL(
com.mysql.cj.jdbc.Driver):必须填sslTrustCertificate(绝对路径 PEM 文件),且useSSL=true+sslMode=REQUIRED同时存在才生效 - PostgreSQL(
org.postgresql.Driver):需在 Driver properties 里设sslcert和sslkey(PEM 格式),并确保私钥权限为600(Linux/macOS 下否则报Invalid certificate format) - 不要把证书放桌面或 Downloads 目录——DBeaver 会尝试复制证书到工作区
.metadata/.plugins/org.jkiss.dbeaver.core/certificates/,路径含空格或中文会导致复制失败 - 云数据库如 GaussDB、RDS 的 CA 证书,务必从控制台下载原始 PEM,别用浏览器导出的 DER 或 P7B
手动导入证书到 JVM cacerts 是终极方案
当多个连接都要走同一套 CA(比如公司内网统一签发的 TLS 证书),或者你用的是 DBeaver 便携版(无权改系统设置),就得动 cacerts:
- 找到 DBeaver 自带 JRE 的
cacerts路径,通常在dbeaver/jre/lib/security/cacerts - 执行命令导入(以阿里云 RDS CA 为例):
keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias aliyun-rds-ca -file aliyun-rds-ca-cert.pem - 导入后务必验证:
keytool -list -v -keystore cacerts | grep -A1 aliyun-rds-ca - 注意:如果 DBeaver 是通过系统安装包(如 .deb/.rpm)安装的,可能共用系统 JRE,此时要确认
java -XshowSettings:properties -version 2>&1 | grep java.home输出的实际路径
真正麻烦的从来不是“怎么加证书”,而是证书路径被 DBeaver 复制后脱离原始位置、驱动参数名拼错(比如把 sslTrustCertificate 写成 sslTrustCert)、或者 PEM 文件里混入了不可见的 BOM 字节——这些细节不报错,但会让整个 SSL 配置静默失效。


















