根本原因是GoLand JDBC驱动仅认显式指定的PEM格式SSL根证书路径,且必须含完整信任链;路径错误、格式非法或缺失CA证书时会静默降级为非加密连接,而非报错。

PostgreSQL 连接中 sslmode=verify-full 为什么连不上
根本原因不是证书没放对位置,而是 GoLand 的 JDBC 驱动默认不读取你本地的 root.crt 或 postgresql.crt 文件——它只认自己配置界面里显式指定的证书路径,且必须是 PEM 格式、包含完整信任链(CA + 中间证书)。
常见现象:连接测试弹出 FATAL: connection requires a valid client certificate 或 SSL error: certificate verify failed,但命令行 psql "host=xxx sslmode=verify-full sslrootcert=/path/to/root.crt" 能通。
- GoLand 数据源设置中,“SSL”选项卡下的
SSL mode必须选verify-full(不能用require代替) -
SSL root certificate字段必须指向一个 .pem 文件,且该文件内容不能只含公钥,要包含全部 CA 证书(可 cat 多个 crt 合并) - 如果服务端证书是自签名的,
SSL root certificate就是那个自签 CA 的ca.crt;如果是公共 CA(如 Let's Encrypt),则用系统级 CA bundle(如/etc/ssl/certs/ca-certificates.crt) - GoLand 不支持
sslcert和sslkey(客户端证书认证),仅支持服务端证书验证;如需双向认证,得换用 SSH 隧道或改用 Go 程序直连
在 GoLand 里填错 SSL root certificate 路径的典型后果
路径填错不会报“文件不存在”,而是静默 fallback 到 sslmode=prefer 行为,连接看似成功,实则走的是明文或弱加密通道——这在审计时属于高危配置偏差。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
- 路径写成相对路径(如
./certs/root.pem):GoLand 以项目根目录为基准解析,但实际工作目录可能是 IDE 安装目录,导致加载失败 - 路径含中文或空格:JDBC 驱动解析 URL 时可能截断,建议全用英文下划线命名
- 证书文件权限为 600 且属主不是当前用户:GoLand 进程无权读取,日志里只显示
connection refused,不提证书问题 - 证书 PEM 文件末尾缺换行符或含 BOM:某些 JDBC 版本会解析失败,建议用
file -i root.pem确认编码,用sed -i '$a\' root.pem补换行
如何验证 GoLand 是否真正在用证书做 verify-full
最直接的办法是临时篡改证书内容:把 root.pem 里任意一行字母改掉,再点“Test Connection”。如果仍显示成功,说明根本没加载该证书——大概率是路径错误或格式非法。
- 打开 GoLand 日志(Help → Show Log in Explorer),搜索
org.postgresql.ssl,能看到类似SSL Root Certificate: /absolute/path/to/root.pem的加载记录 - 连接成功后,在数据库工具窗口右键数据源 → “Properties” → 查看 JDBC URL,确认里面包含
sslmode=verify-full&sslrootcert=%2Fpath%2Fto%2Froot.pem - 服务端 PostgreSQL 的
log_connections = on且log_line_prefix = '%m [%p] %u@%d '开启时,连接日志会带SSL enabled (protocol=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384, bits=256),这是真正启用加密的铁证
GoLand + PostgreSQL 证书配置和 Go 程序行为不一致?
是的,而且很常见。GoLand 用的是 JetBrains 自研 JDBC 驱动(基于 PostgreSQL 官方 JDBC),而你的 Go 程序用的是 lib/pq 或 pgx,二者 SSL 参数映射规则不同。
- GoLand 的
sslmode=verify-full对应 lib/pq 的sslmode=verify-full&sslrootcert=/path/to/root.crt,但 pgx/v5 默认不支持sslrootcert参数,得用pgconn.Config.TLSConfig手动注入 - GoLand 不支持
sslcert/sslkey,但 Go 程序可以;反过来,GoLand 支持sslhostname(用于 SNI),Go 驱动不处理这个字段 - 最关键差异:GoLand 连接测试通过 ≠ 你的 Go 程序能连上。必须单独验证程序里的 DSN,尤其是
sslmode和证书路径是否与 GoLand 设置一致
证书路径、格式、信任链完整性,三者缺一不可;任何一环出问题,都会退化成非加密连接而不报错——这是最容易被忽略的生产隐患。

















