“SSL connection is required”错误是PostgreSQL服务端在连接准入阶段直接拦截非SSL请求,根本未进入SSL握手或证书加载环节;关键在于pg_hba.conf中必须存在匹配来源IP、数据库和用户的host规则,且auth-method为md5/password/trust,修改后须执行SELECT pg_reload_conf()重载配置。
“SSL connection is required”是服务端强制拦截,不是Navicat配错了
这个报错根本没走到证书加载或握手阶段,而是postgresql在连接准入时直接拒绝了非ssl请求。关键不在navicat里填不填证书路径,而在于pg_hba.conf里有没有一条匹配你来源ip、且允许非ssl连接的规则。
常见错误现象:勾了Use SSL、填了证书路径、sslmode设成require,还是报这个错——说明服务端压根没打算跟你谈SSL,它连TCP连接都还没放行。
- 先确认你连接用的是IPv4(比如
192.168.1.100),那pg_hba.conf里就得有host开头的规则,不能只靠local或hostssl - 规则格式必须是:
host <db> <user> <address>/<mask> <auth-method>,例如host all all 192.168.1.100/32 md5 -
auth-method用md5、password或trust才允许非SSL;用scram-sha-256或cert则仍需SSL通道 - 改完必须执行
SELECT pg_reload_conf();,不是重启Navicat,也不是重启PostgreSQL服务
想走SSL但连不上,先查server.key权限和pg_hba.conf写法
如果报错是“SSL connection closed”或日志里出现private key file has group or world access,问题大概率出在私钥文件权限上。PostgreSQL 14+对server.key极其敏感,哪怕只是多了一个组读权限,服务就会静默跳过SSL初始化。
- 运行
ls -l /path/to/server.key,确认输出权限字段是-rw-------(即600) - 如果不是,立刻执行
chmod 600 /path/to/server.key,并确保属主是postgres用户 -
pg_hba.conf中对应SSL连接的规则必须是hostssl开头,不是host。写成host all ... md5再怎么配证书也白搭 - 若用
hostssl all all 0.0.0.0/0 md5,要同步确认postgresql.conf中listen_addresses包含客户端IP,且不能是localhost单值
Navicat里填证书路径总提示“file not found”,其实是解析规则太死
Navicat不支持反斜杠、空格、中文、波浪号~、环境变量,也不识别相对路径。它要的是一个字面量字符串,能被操作系统原样打开。
- 路径必须用正斜杠
/,Windows下也要写成C:/certs/root.crt,写C:\certs\root.crt必失败 - 证书文件必须是PEM格式,以
-----BEGIN CERTIFICATE-----开头,.pfx、.der、带BOM的UTF-8都不行 - 路径不能含括号
( )、中文、空格;推荐固定放在C:/pg-ssl/或/opt/pg-ssl/这类干净路径 - 填的是
sslrootcert(即CA证书),不是server.crt;verify-full模式下,Host字段值还必须和证书里的CN或SAN完全一致
PostgreSQL 15+连不上,可能根本不是SSL问题,而是datlastsysoid字段缺失
Navicat老版本(16.1及以下)在连接PostgreSQL 15+时,会执行一条已删除的SQL:SELECT DISTINCT datlastsysoid FROM pg_database。这跟SSL无关,是协议兼容性问题。
- 最稳妥解法:升级Navicat到
16.2+版本,官方已修复 - 临时绕过:在Navicat连接设置中把SSL mode设为
disable,看能否连通;能连说明就是这个字段问题 - 不推荐手动改
libcc.dll,Hex编辑风险高,且每次升级Navicat都要重做 - 若必须用旧版Navicat,可在
pg_hba.conf中将认证方式降级为md5,并配合ssl = off(仅测试环境)
pg_hba.conf那条规则没命中,或者server.key权限不对——这两处细节一错,所有SSL配置都成了空中楼阁。


















