31

我正在使用 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 问题,但不应该像这里提到的那样。开箱即用应支持 SSL。所以我很难过,只能问什么可能导致这个错误?

我不确定是否必须在我的系统上编辑 pg_hba.conf,但我什至找不到它。

4

7 回答 7

48

通过在 Heroku 上设置PGSSLMODEhttp://www.postgresql.org/docs/9.0/static/libpq-envars.html )解决了这个问题。它告诉 PostgreSQL 默认使用 SSL。

$ heroku config:set PGSSLMODE=require
于 2015-01-01T16:16:13.160 回答
27

node-postgres 在它的 javascript 绑定中不支持 SSL,如果你这样做,你正在使用它:

var pg = require('pg');

要获得 SSL,您需要通过执行以下操作来使用本机绑定:

var pg = require('pg').native;

当您的应用在 Heroku 中运行时,您不需要使用 SSL,您只需要使用 SSL 进行远程连接(当您的应用在本地运行时)。

于 2012-06-28T20:45:17.897 回答
19

我添加了这些参数,现在可以从外部服务器连接到我的 heroku postgres 实例,特别是在节点 express 服务器中的 knex.js 配置中:

var knex = require('knex')({
  client: 'postgres',
  connection: 'postgres://username:password@host:5432/yourdbname?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory'
});
于 2014-07-23T04:56:25.463 回答
9

遇到同样的问题。刚刚在 db 参数中启用了 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();
于 2014-01-09T09:26:43.937 回答
3

我自己遇到了这个,这是一个简单的修复。只需通过 HTTPS 连接即可

于 2012-05-09T22:53:30.860 回答
1

我也在 2021 年 4 月在我的 Heroku PRODUCTION 实例中收到了'ClientAuthentication' no pg_hba.conf entry错误。我曾经并继续使用 Plan“Hobby Dev”免费帐户。

Heroku 于 2021 年 2 月开始对平台进行更改,为所有 Heroku Postgres 客户端连接强制实施 SSL。 所有 Heroku Postgres 客户端连接都需要 SSL

ssl: { rejectUnauthorized: false }我通过在使用node-postgres v8时添加以下配置来修复我的 PRODUCTION 实例(我的 NextJS 应用程序连接到 Heroku Postgres 插件):

const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
  ssl: {
    rejectUnauthorized: false
  }
});

于 2021-04-14T22:58:55.280 回答
0
const db = new Pool({
   connectionString: process.env.DATABASE_URL,
   ...
   ssl: { rejectUnauthorized: false }
});

我刚刚通过添加ssl: { rejectUnautorized: false }到我的数据库配置解决了这个问题。另外,运行heroku config:set PGSSLMODE=no-verify -a appName

注意:“appName”应该是您托管的应用程序的名称

于 2021-10-28T18:21:02.717 回答