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
核心原因
- AWS RDS不允许直接编辑
pg_hba.conf:手动修改的配置会被RDS定期重置,必须通过RDS参数组的pg_hba_rules参数配置认证规则。 - 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-256hostnossl规则: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
相关产品推荐
相关产品推荐

