我正在使用PostgreSQL开发一个Node.js应用程序并在Heroku上托管。我的问题是我收到了如下身份验证错误:
14:32:05 web.1 | { [error: no pg_hba.conf entry for host "193.40.244.196", user "username", database "database_name", SSL off]
14:32:05 web.1 | length: 168,
14:32:05 web.1 | name: 'error',
14:32:05 web.1 | severity: 'FATAL',
14:32:05 web.1 | code: '28000',
14:32:05 web.1 | detail: undefined,
14:32:05 web.1 | hint: undefined,
14:32:05 web.1 | position: undefined,
14:32:05 web.1 | internalPosition: undefined,
14:32:05 web.1 | internalQuery: undefined,
14:32:05 web.1 | where: undefined,
14:32:05 web.1 | file: 'auth.c',
14:32:05 web.1 | line: '483',
14:32:05 web.1 | routine: 'ClientAuthentication' }
这可能是一个SSL问题,但不应该提到here。应该支持开箱即用的SSL。所以我很难过,只能问可能导致这个错误的原因是什么?
我不确定是否必须在我的系统上编辑pg_hba.conf,但我甚至找不到它。
答案 0 :(得分:36)
在Heroku上设置PGSSLMODE
(http://www.postgresql.org/docs/9.0/static/libpq-envars.html)解决了这个问题。它告诉PostgreSQL默认为SSL。
$ heroku config:set PGSSLMODE=require
答案 1 :(得分:27)
node-postgres在它的javascript绑定中不支持SSL,如果你这样做就会使用它:
var pg = require('pg');
要获取SSL,您需要使用本机绑定:
var pg = require('pg').native;
当您的应用在Heroku中运行时,不需要使用SSL,您只需要使用SSL进行远程连接(当您的应用在本地运行时)。
答案 2 :(得分:17)
我添加了这些参数,现在可以从外部服务器连接到我的heroku postgres实例,特别是在节点快速服务器中配置knex.js:
var knex = require('knex')({
client: 'postgres',
connection: 'postgres://username:password@host:5432/yourdbname?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory'
});
答案 3 :(得分:8)
遇到同样的问题。刚刚在db params中启用了ssl = true。
var pg = require('pg');
var params = { host: 'heroku_hostname',user: 'username',password: 'password',database: 'database',ssl: true };
var client = new pg.Client(params);
client.connect();
答案 4 :(得分:3)
自己动手,这是一个简单的修复。只需通过HTTPS连接
答案 5 :(得分:1)
我在 2021 年 4 月的 Heroku PRODUCTION 实例中也收到了 'ClientAuthentication'
no pg_hba.conf entry
错误。我曾经并将继续使用“Hobby Dev”计划免费帐户。
Heroku 于 2021 年 2 月开始对平台进行更改,对所有 Heroku Postgres 客户端连接强制实施 SSL。 All Heroku Postgres client connections require SSL。
我通过在使用 node-postgres v8 时添加以下配置 ssl: { rejectUnauthorized: false }
修复了我的 PRODUCTION 实例(我的 NextJS 应用程序连接到 Heroku Postgres 插件的位置):
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
ssl: {
rejectUnauthorized: false
}
});