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

EC2 Node.js调用RDS PostgreSQL 17时pg_hba.conf匹配错误求助

解决EC2通过Sequelize连接AWS RDS PostgreSQL时的pg_hba.conf认证错误(PostgreSQL 17)

问题重现

使用EC2上的Node.js+Sequelize连接AWS RDS PostgreSQL 17时,出现以下错误:

original: error: no pg_hba.conf entry for host "172.31.8.1", user "postgres", database NAME, no encryption
5|Server   |       at Parser.parseErrorMessage (/home/ec2-user/Narra/re_testproj/backend/node_modules/pg-protocol/dist/parser.js:283:98)
5|Server   |       at Parser.handlePacket (/home/ec2-user/Narra/re_testproj/backend/node_modules/pg-protocol/dist/parser.js:122:29)
5|Server   |       at Parser.parse (/home/ec2-user/Narra/re_testproj/backend/node_modules/pg-protocol/dist/parser.js:35:38)
5|Server   |       at Socket.<anonymous> (/home/ec2-user/Narra/re_testproj/backend/node_modules/pg-protocol/dist/index.js:11:42)
5|Server   |       at Socket.emit (node:events:517:28)
5|Server   |       at Socket.emit (node:domain:489:12)
5|Server   |       at addChunk (node:internal/streams/readable:368:12)
5|Server   |       at readableAddChunk (node:internal/streams/readable:341:9)
5|Server   |       at Readable.push (node:internal/streams/readable:278:10)
5|Server   |       at TCP.onStreamRead (node:internal/stream_base_commons:190:23) {
5|Server   |     length: 163,
5|Server   |     severity: 'FATAL',
5|Server   |     code: '28000',
5|Server   |     detail: undefined,
5|Server   |     hint: undefined,
5|Server   |     position: undefined,
5|Server   |     internalPosition: undefined,
5|Server   |     internalQuery: undefined,
5|Server   |     where: undefined,
5|Server   |     schema: undefined,
5|Server   |     table: undefined,
5|Server   |     column: undefined,
5|Server   |     dataType: undefined,
5|Server   |     constraint: undefined,
5|Server   |     file: 'auth.c',
5|Server   |     line: '533',
5|Server   |     routine: 'ClientAuthentication'
5|Server   |   }
5|Server   | }

已尝试以下操作但未解决:

  • 修改pg_hba.conf添加trust规则
  • 设置postgresql.conf的listen_address='*'
  • 将RDS参数组的rds.force_ssl设为0
  • 在Sequelize的config.js中配置rejectUnauthorized: false

核心原因

  1. AWS RDS不允许直接编辑pg_hba.conf:手动修改的配置会被RDS定期重置,必须通过RDS参数组的pg_hba_rules参数配置认证规则。
  2. SSL配置冲突:客户端强制要求SSL(ssl.require: true)但RDS的rds.force_ssl设为0,导致连接时未使用加密,而pg_hba规则中无匹配非加密连接的条目。

解决方案

1. 通过RDS参数组配置pg_hba规则

  • 登录AWS控制台,进入RDS服务,找到目标实例的参数组(若为默认参数组,需先创建自定义参数组,默认组不可修改)。
  • 找到pg_hba_rules参数,点击编辑,添加以下规则(生产环境推荐使用scram-sha-256而非trust):
    host    all             all             172.31.8.1/32           scram-sha-256
    host    all             all             all                     scram-sha-256
    
    若明确需要允许非加密连接,可添加hostnossl规则:
    hostnossl    all             all             172.31.8.1/32           scram-sha-256
    
  • 保存参数组,重启RDS实例使配置生效。

2. 调整Sequelize的SSL配置

由于已设置rds.force_ssl=0(允许非SSL连接),修改config.js移除强制SSL的配置:

production: {
    "username": "postgres",
    "password": "你的数据库密码",
    "database": "NAME",
    "host": "你的RDS主机地址",
    "dialect": "postgres",
    "dialectOptions": {
        "ssl": false // 禁用SSL,匹配rds.force_ssl=0的设置
    }
}

若后续需启用SSL,将rds.force_ssl设为1,并配置SSL选项:

"dialectOptions": {
    "ssl": {
        "require": true,
        "rejectUnauthorized": false
    }
}

3. 验证VPC安全组

确保RDS实例的安全组允许EC2实例的私有IP(172.31.8.1)通过5432端口访问:

  • 进入RDS实例的「连接与安全性」标签,查看关联的安全组。
  • 编辑安全组的入站规则,添加:
    • 类型:PostgreSQL(5432)
    • 源:EC2实例私有IP(172.31.8.1/32)或EC2所在子网CIDR。

4. 验证用户连接权限

使用psql连接到RDS实例,执行以下命令确保postgres用户有权限从目标IP连接:

GRANT CONNECT ON DATABASE "NAME" TO postgres;
ALTER USER postgres WITH LOGIN CONNECTION LIMIT -1;

注意事项

  • PostgreSQL 17默认禁用trust认证方式,生产环境建议使用scram-sha-256提升安全性。
  • RDS参数组修改后必须重启实例,否则配置不会生效。

内容的提问来源于stack exchange,提问作者Yuki Chan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 21:05:16