DBeaver报SSL错误90%是证书信任链未打通,需将CA证书导入JVM信任库或在驱动属性中正确配置ssl=true、sslmode=verify-full及绝对路径的sslrootcert。

直接说结论:DBeaver 报 SSL 错误,90% 是证书信任链没打通,不是配错开关,而是根本没让 JVM 看见可信证书。 你点“测试连接”弹出 PKIX path building failed 或 SSLHandshakeException,说明 DBeaver(底层是 Java)在握手阶段找不到能验证服务器证书的根证书。这时候改 sslmode=require 没用,删掉重装驱动也没用——得把证书塞进信任路径里。
为什么 sslmode=verify-full 会失败
很多人填了 sslmode=verify-full 就以为万事大吉,结果连不上。其实这个模式要求三件事同时满足:
① 服务器发来的证书必须由你指定的 CA 根证书签发;
② 证书里的 Common Name 或 Subject Alternative Name 必须和你填的主机名完全一致;
③ 本地 Java 运行时(JVM)必须能加载到那个根证书文件。
常见卡点:
- 填了
sslrootcert=/path/to/ca.pem,但路径写错、文件权限不对、或 PEM 格式不标准(比如多空行、含 BOM) - 用了自签名证书,却没在 DBeaver 的 SSL 标签页里勾选“启用 SSL/TLS”,导致参数压根没传给驱动
- 证书是内部 CA 签发的,但没导入到 JVM 的默认信任库
$JAVA_HOME/jre/lib/security/cacerts,而 DBeaver 又没指定自定义 truststore
手动导入证书到 JVM 信任库(最稳方案)
这是绕过 DBeaver 界面限制、确保所有连接都认证成功的底层解法。适用于生产环境或多个连接共用同一套证书的场景。
操作步骤:
- 用
openssl s_client -showcerts -connect your-db-host:5432抓下服务器证书,保存为db-server.crt - 执行命令导入:
keytool -import -trustcacerts -file db-server.crt -alias db-prod -keystore $JAVA_HOME/jre/lib/security/cacerts - 密码默认是
changeit,输完确认“是” - 重启 DBeaver(必须重启,JVM 启动后才加载一次 cacerts)
注意:keytool 要和 DBeaver 使用的 JDK 版本一致。如果你用的是 DBeaver 自带 JRE,路径可能是 dbeaver/jre/lib/security/cacerts,别导到系统 JDK 里去了。
DBeaver 界面里怎么填 SSL 参数才生效
不是所有字段都起作用,也不是所有数据库驱动支持同一套 key。PostgreSQL JDBC 驱动只认这些关键属性:
-
ssl=true:必须显式开启,否则其他 sslxxx 参数全被忽略 -
sslmode=verify-full:比require多一步证书校验,别图省事选低等级 -
sslrootcert=/full/path/to/root.crt:路径必须绝对,不能用~或相对路径;文件需可读 -
sslcert和sslkey:仅双向认证需要,单向加密不用填
填写位置:右键连接 → 编辑连接 → 驱动属性(不是 SSL 标签页!)→ 点“添加”逐个输入 key/value。SSL 标签页里的勾选项只是快捷开关,底层还是转成这些参数。
容易被忽略的兼容性坑
PostgreSQL 15+ 默认禁用 TLSv1.0/1.1,而旧版 DBeaver 自带的 JDK 8u202 以下可能不支持 TLSv1.2。现象是连接卡住几秒后报 SSL handshake timed out,不是证书错,是协议谈崩了。
解决方法:
- 升级 DBeaver 到 23.3+(内置 JDK 17),或手动配置 JVM 启动参数:
-Djdk.tls.client.protocols=TLSv1.2,TLSv1.3 - 检查 PostgreSQL 服务端的
postgresql.conf:确认ssl_min_protocol_version = 'TLSv1.2'且没写死只允许某套 cipher - 如果用云数据库(如 Azure DB for PostgreSQL),务必看平台文档——有些强制要求
sslmode=verify-full+ 指定官方 CA 路径,填错一个字符就拒连
最后提醒一句:别在“驱动属性”里混用大小写参数名,SSLMode 和 sslmode 在某些驱动版本里行为不同;也别把 sslrootcert 指向目录,它只接受单个 PEM 文件。


















