Digital Ocean PostgreSQL连接失败求助:pg_hba.conf及SSL配置异常
问题背景
此前使用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

