如何让PostgreSQL通过dblink使用可信SSL证书连接另一PostgreSQL数据库
解决PostgreSQL dblink SSL证书验证失败的问题
看起来你在配置跨服务器PostgreSQL SSL连接时碰到了证书验证的坑,我来帮你一步步排查可能的问题:
1. 检查服务器端证书链是否完整
SSLForFree(本质基于Let's Encrypt)颁发的证书通常需要中间CA证书才能让客户端完成完整的信任链验证。你当前服务器的server.crt可能只包含服务器证书本身,缺少必要的中间证书。
- 解决方法:把SSLForFree提供的中间CA证书内容追加到
server.crt文件末尾,确保整个证书链是连续的PEM格式(每段证书都以-----BEGIN CERTIFICATE-----开头,-----END CERTIFICATE-----结尾)。 - 验证方式:在服务器上执行以下命令查看证书信息,确认"X509v3 Authority Key Identifier"指向的CA证书存在于你的证书链中:
openssl x509 -in server.crt -text -noout
2. 确认证书域名与连接主机名匹配
当使用verify-ca或verify-full模式时,PostgreSQL会严格检查证书中的**通用名称(CN)或主题备用名称(SAN)**是否和你连接时指定的host(test.example.com)完全一致。
- 检查方法:用上述
openssl命令查看证书的"Subject"字段(CN值)和"X509v3 Subject Alternative Name"字段,确认其中明确包含test.example.com。 - 如果域名不匹配,要么重新申请对应域名的证书,要么修改连接时的
host参数为证书中正确的域名(注意要确保该域名能正常解析到服务器IP)。
3. 检查证书文件格式是否为PEM
PostgreSQL仅支持PEM格式的证书文件,如果你从SSLForFree下载的是DER格式(二进制)证书,会直接导致验证失败。
- 转换方法:如果是DER格式,用OpenSSL命令转换成PEM:
openssl x509 -in server.crt.der -inform der -out server.crt -outform pem - 验证:打开证书文件,应该能看到明文的证书标记,而非乱码内容。
4. 检查Windows环境下的文件权限
在Windows Server上,PostgreSQL服务运行账号(通常是NT SERVICE\postgresql-x64-9.6)需要对以下文件拥有读取权限:
- 服务器端:
server.crt、server.key所在的目录及文件本身 - 客户端:
root.crt所在的目录及文件本身 - 操作方法:右键目标文件→属性→安全→编辑,添加PostgreSQL服务账号,赋予其"读取"权限。
5. 验证客户端root.crt的内容有效性
你将Let's Encrypt根证书和CA包放入root.crt,需要确保:
- 根证书是Let's Encrypt的有效根CA(比如ISRG Root X1),而非已过期的旧根证书(比如DST Root CA X3)
- 若服务器端已配置完整证书链,客户端
root.crt只需包含根证书即可;若服务器端未配置中间证书,则需要将中间证书也加入root.crt - 可以在客户端执行以下命令,验证服务器证书是否能被
root.crt信任:
如果这一步失败,说明证书链存在问题,需要优先修复。openssl verify -CAfile root.crt server.crt
最后重启服务并测试
修改完配置后,务必重启PostgreSQL服务器端服务,然后重新执行dblink命令测试:
SELECT * FROM dblink( 'dbname=postgres port=5432 host=test.example.com user=postgres password=123456 sslmode=verify-ca sslrootcert=C:/PostgreSQL/data/pg96/root.crt', 'SELECT now()::TEXT;' ) AS t(a Text);
如果问题仍未解决,可以查看服务器端的PostgreSQL日志(通常在data/pg_log目录),里面会有更详细的SSL错误细节,帮助定位具体问题。
内容的提问来源于stack exchange,提问作者Philip Nguyen
相关产品推荐
相关产品推荐

