9

有许多 Heroku CLI Postgres 命令都返回相同的错误。例如:

$ heroku pg:bloat
psql: FATAL:  no pg_hba.conf entry for host "...", user "...", database "...", SSL off

这些命令中至少有一个在过去有效,但现在无效。

否则数据库似乎工作正常。我可以通过我的应用程序的界面访问它。

我看不到在 Heroku Postgres 仪表板中切换 SSL 的方法。可能是什么原因造成的,我该如何解决?

4

10 回答 10

15

从外部应用程序连接到Postgres时出现错误。修复与您使用的语言有关。在Java中,您需要链接?sslmode=require查询字符串,在NodeJS(我的情况)中,您应该添加rejectUnauthorized: false如下 -

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

有关详细信息,请参阅https://devcenter.heroku.com/articles/heroku-postgresql

享受!

于 2020-10-13T12:04:42.833 回答
8

我通过在 Heroku 上设置 PGSSLMODE 来解决它。这告诉 Postres 默认使用 SSL。在命令行上,这可以通过以下命令完成。

heroku config:set PGSSLMODE=require
于 2021-03-11T16:02:20.257 回答
4

您需要sslmode=require在连接字符串中进行设置。当 JDBC 驱动程序为时的示例:

String dbUrl = "jdbc:postgresql://" + dbUri.getHost() + ':' + dbUri.getPort() + 
dbUri.getPath() + "?sslmode=require";

您始终可以ssl_mode在配置变量中切换,但我建议在连接字符串中进行。

于 2020-02-04T04:59:18.910 回答
3

该错误基本上表示您正在尝试在不使用 SSL 连接的情况下连接到数据库实例,但服务器设置为拒绝没有 SSL 连接的连接。

pg_hba.conf文件驻留在服务器中,并包含允许连接的详细信息。在您的情况下,在具有给定详细信息的文件中找不到匹配的记录(在非 ssl 连接下)。

您可以通过强制连接遵循 SSL 协议来解决此问题。正如 Raj 已经提到的,您需要修改连接字符串以包含“sslmode=require”。这是关于相同的heroku文档。查看文档中的“外部连接”块。

于 2020-02-04T09:56:20.270 回答
2

事实证明,像heroku pg:bloat使用 Postgres 的本地安装和psql引擎盖之类的命令。我使用 ssl 支持 ( ) 重新编译了我的 Postgres 安装,--with-openssl一切正常。

于 2020-02-04T17:49:38.360 回答
2

添加ssl option数据库配置最终解决了这个问题:

如果你使用 sequelize 作为你的 ORM

const config = {
  ...
  production: {
    use_env_variable: 'DATABASE_URL',
    dialect: 'postgresql',
    logging: false,
        dialectOptions: {
      ssl: {      /* <----- Add SSL option */
        require: true,
        rejectUnauthorized: false 
      }
    },
  },
  ...
}

如果您没有使用任何 ORM:

const pool = new Pool({
  connectionString:DATABASE_URL ,
  ssl: {    /* <----- Add SSL option */
    rejectUnauthorized: false,
  },
});
于 2021-03-01T19:49:31.303 回答
1

这适用于 Nodejs。指定 PGSSLMODE 配置变量:heroku config:set PGSSLMODE=no-verify你可以通过终端使用 Heroku CLI 来完成。

于 2021-03-21T10:37:23.967 回答
1

我认为在 Heroku 上 SSL is not disabledbut require,这可能是导致此错误的原因。

于 2020-08-11T00:05:58.980 回答
0

这有助于解决我的问题。在 config.json 中添加ssl属性(续集)

{
  "production": {
    "ssl": {
      "require": true,
      "rejectUnauthorized": false
    },
  }
}
于 2021-01-31T08:22:07.577 回答
0

正如在这个相关答案中所解释的那样,设置rejectUnauthorized: false是一个坏主意,因为它允许您创建与数据库的非加密连接,从而使您受到 MITM 攻击(中间人攻击)。

更好的解决方案是为您的 Postgre 客户端提供您希望它使用的 CA。在您的情况下,它可能是 Heroku CA,但在我的情况下,它是 AWS RDS 用于北弗吉尼亚地区 (us-east-1) 的 CA。我从这个 AWS 页面下载了 CA ,将它放在与我想用来创建连接的文件相同的目录中,然后将我的配置修改为:

{
  ...
  dialectOptions: {
    ssl: {
      require: true,
      ca: fs.readFileSync(`${__dirname}/us-east-1-bundle.pem`),
    },
  },
}
于 2021-08-18T19:38:51.680 回答