You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Digital Ocean PostgreSQL连接失败求助:pg_hba.conf及SSL配置异常

Digital Ocean PostgreSQL连接错误排查与解决

问题背景

此前使用Digital Ocean数据库无异常,数月未执行DB seeding,近期团队重试时在Pgadmin中遇到连接错误,受阻超1周。

错误信息

连接到服务器"DBNAME.b.db.ondigitalocean.com"(IP地址)端口25060失败:FATAL: pg_hba.conf rejects connection for host "IP address", user "NAME", database "NAME", SSL encryption;
connection to server at "DBNAME.b.db.ondigitalocean.com"(IP Address)端口25060失败:FATAL: no pg_hba.conf entry for host "IP Address", user "NAME", database "NAME", no encryption。

当前pg_hba.conf配置

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
  local   all             all                                     scram-sha-256
# IPv4 local connections:
  host    all             all             127.0.0.1/32            scram-sha-256
# IPv6 local connections:
 host    all             all             ::1/128                 scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
  local   replication     all                                     scram-sha-256
  host    replication     all             127.0.0.1/32            scram-sha-256
  host    replication     all             ::1/128                 scram-sha-256

已尝试操作:修改监听所有地址并添加host all all 0.0.0.0/0 trusted配置,错误依旧;Digital Ocean服务器SSL默认设为required且无法修改,怀疑SSL配置不匹配。


核心问题解答

1. pg_hba.conf配置顺序是否重要?正确顺序是什么?

  • 顺序非常重要:PostgreSQL会按配置文件从上到下的顺序匹配连接请求,找到第一个符合条件的规则后立即停止匹配。若将范围大的规则(如0.0.0.0/0)放在范围小的规则(如127.0.0.1/32)之前,会覆盖小范围规则的优先级,导致权限控制失效。
  • 正确顺序原则:
    • 先放范围小、优先级高的规则(如本地IP、特定客户端IP)
    • 再放范围大、优先级低的规则(如所有IP)
    • 同类规则中,权限严格的在前,宽松的在后

2. 解决步骤

步骤1:修正客户端SSL连接配置

由于Digital Ocean PostgreSQL强制SSL required,Pgadmin连接时必须开启SSL:

  • 在Pgadmin服务器连接配置中,将SSL模式设置为Require或Verify-CA,禁止设为Allow或Disable
  • 若需验证证书,下载Digital Ocean提供的CA证书并在Pgadmin中指定证书路径

步骤2:调整pg_hba.conf规则

当前配置仅允许本地IP连接,需添加针对客户端IP的SSL规则(注意顺序):
在现有IPv4本地连接规则之后添加:

# 允许指定客户端IP通过SSL连接所有数据库和用户
hostssl  all             all             你的客户端IP/32            scram-sha-256
# 若需临时允许所有IP(不推荐生产环境使用)
hostssl  all             all             0.0.0.0/0                scram-sha-256
  • 必须使用hostssl而非host,因为Digital Ocean强制SSL,只有hostssl规则会匹配SSL连接
  • 禁止使用trusted方法,该方法跳过密码验证存在安全风险,保持scram-sha-256与原有配置一致

步骤3:修改postgresql.conf监听地址

确保PostgreSQL监听所有外部地址:
找到listen_addresses配置,修改为:

listen_addresses = '*'

修改后重启PostgreSQL服务:

sudo systemctl restart postgresql

步骤4:检查Digital Ocean防火墙规则

确认数据库防火墙已添加客户端IP的入站规则,允许25060端口的TCP连接

3. 参考的Stack Exchange文章是否提供了解决方案?

若参考文章提到hostssl规则、强制SSL配置、监听地址修改这些核心点,那么解决方案已覆盖,但需注意:

  • 不要盲目使用trusted方法,会引发安全问题且与Digital Ocean的SSL强制要求冲突
  • 必须保证pg_hba.conf规则顺序正确,避免大范围规则覆盖小范围规则

4. SSL改为true的操作方法

Digital Ocean托管的PostgreSQL默认强制SSL(ssl = on与ssl = true效果一致),无需修改服务器端SSL配置,仅需确保客户端连接时开启SSL:

  • Pgadmin中:编辑服务器连接 → 连接选项卡 → SSL模式选择Require
  • 代码连接时,在连接字符串中添加sslmode=require参数

内容的提问来源于stack exchange,提问作者Uma Annamalai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:05:29