【问题标题】:Heroku Postgres: "psql: FATAL: no pg_hba.conf entry for host"Heroku Postgres:“psql:致命:主机没有 pg_hba.conf 条目”
【发布时间】:2020-05-19 18:23:40
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: postgresql heroku heroku-postgres heroku-cli postgres-10


    【解决方案1】:

    我从外部应用程序连接到 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

    享受吧!

    【讨论】:

      【解决方案2】:

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

      heroku config:set PGSSLMODE=require
      

      【讨论】:

      • 这导致我出现错误“错误:自签名证书”有什么想法吗?
      【解决方案3】:

      您需要在连接字符串中设置sslmode=require。 JDBC驱动时的一个例子:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • 我无法将字符串传递给 Heroku 命令,尽管当我将连接字符串传递给本地 psql 命令时确实解决了问题。
        【解决方案5】:

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

        【讨论】:

        • 使用 asdf-vm 安装 Postgres 时,可以添加一个文件 ~/.asdf-postgres-configure-options,其内容为 export POSTGRES_EXTRA_CONFIGURE_OPTIONS="--with-openssl"。这将在asdf install 期间使用。见here
        【解决方案6】:

        在数据库配置中添加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,
          },
        });
        

        【讨论】:

          【解决方案7】:

          我认为 Heroku 上的 SSL 不是 disabled 而是 require,这可能是导致此错误的原因。

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

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

              {
                "production": {
                  "ssl": {
                    "require": true,
                    "rejectUnauthorized": false
                  },
                }
              }
              

              【讨论】:

                【解决方案10】:

                正如this related answer 中所解释的,设置rejectUnauthorized: false 是一个坏主意,因为它允许您创建与数据库的非加密连接,从而使您面临 MITM 攻击(中间人攻击) )。

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

                {
                  ...
                  dialectOptions: {
                    ssl: {
                      require: true,
                      ca: fs.readFileSync(`${__dirname}/us-east-1-bundle.pem`),
                    },
                  },
                }
                

                【讨论】:

                  猜你喜欢
                  • 2020-07-29
                  • 2013-10-19
                  • 2014-10-27
                  • 2014-06-14
                  • 1970-01-01
                  • 2019-04-28
                  • 1970-01-01
                  • 2021-06-11
                  相关资源
                  最近更新 更多