如何正确解决Heroku Node.js连接Heroku Postgres出现sql_error_code=28000报错
报错根本原因
- Heroku Postgres生产级实例强制要求所有数据库连接使用SSL加密,未启用SSL的请求会被直接拦截,你看到的28000错误提示里的
SSL off就是未启用SSL的明确标识。 - 你混淆了两个独立的SSL链路:Heroku为你的Next.js应用配置的SSL,是面向终端用户访问站点时的传输加密;而本次报错对应的是你的Next.js后端作为客户端,连接PostgreSQL服务端时的传输加密,前者的默认配置不会自动作用于后者,所以会出现未开启SSL的问题。
临时方案的安全风险
你找到的取消ssl注释、设置rejectUnauthorized: false的方案,本质是跳过SSL证书校验步骤,即使遇到伪造、过期的非法证书也会继续建立连接,等于放弃了SSL的身份验证能力,很容易遭遇中间人攻击,绝对不能在生产环境长期使用。
符合安全规范的修复方案
你可以任选以下任意一种方案,不需要关闭证书校验即可正常连接:
- 方案一:添加环境变量(无代码改动)
在Heroku控制台的应用环境变量配置页,新增变量PGSSLMODE=require,重新发布应用后即可生效。pg库会自动读取该环境变量,为所有数据库连接启用SSL并正常校验证书。 - 方案二:修改连接字符串
在原有的数据库连接字符串后追加ssl参数即可,代码如下:const pool = new Pool({ connectionString: process.env.DATABASE_URL + '?sslmode=require', }) - 方案三:显式配置可信证书
如果上述方案仍有证书校验问题,可以下载Heroku Postgres的官方根证书内置到项目中,显式传入证书完成校验:const fs = require('fs') const pool = new Pool({ connectionString: process.env.DATABASE_URL, ssl: { ca: fs.readFileSync('./heroku-postgres-root.crt').toString() } })
内容的提问来源于stack exchange,提问作者cozycoder
相关产品推荐
相关产品推荐

