繁体   English   中英

Knex Heroku 错误:自签名证书

[英]Knex Heroku Error: self signed certificate

我不断收到此错误:

Error: self signed certificate

在终端中运行此命令时:

knex migrate:latest --env production

我的 knexfile.js

       require('dotenv').config(); 
module.exports = {
      development: {
        client: "pg",
        connection: {
          host: "localhost",
          database: "my-movies"
        }
      },

      production: {
        client: "pg",
        connection: process.env.DATABASE_URL
      }
    };

我的.env 文件:

DATABASE_URL=<my_database_url>?ssl=true

Heroku 应用信息:

Addons:         heroku-postgresql:hobby-dev
Auto Cert Mgmt: false
Dynos:
Git URL:        https://git.heroku.com/path-name.git
Owner:          xxxxxxxxx@xxxx.com
Region:         us
Repo Size:      0 B
Slug Size:      0 B
Stack:          heroku-18
Web URL:        https://my-appname.herokuapp.com/

我已经尝试在 ssl: true 的 knexfile 的生产中放置一个键值对,我得到了同样的错误。 过去我已经这样做了很多很多次,从来没有遇到过这个问题。 想知道 Heroku 是否改变了任何东西,但是在搜索他们的文档时我找不到任何东西。

knexfile.js的以下配置对我有用。

...
production: {
    client: 'postgresql',
    connection: { 
        connectionString: process.env.DATABASE_URL,
        ssl: { rejectUnauthorized: false }
    }
}
...

其中DATABASE_URL是您通过运行heroku config --yourAppName获得的

这是由于 pg@^8 (2020/02/25) cf. 这个 heroku 帮助论坛

您可以获得完整的 pg@^8 公告,但这里是相关段落:

现在我们将对 tls.connect 使用默认的 ssl 选项,其中包括启用的拒绝未授权。 这意味着如果您使用自签名证书,您的连接尝试可能会失败。

似乎 heroku 在某处使用自签名证书。

可能的解决方案:

  • 降级到 pg@^7
  • 指示 pg@^8 忽略有问题的证书ssl: { rejectUnauthorized: false } (参见上面链接的公告)
  • 找到下载和信任证书说明的方法

ssl: { rejectUnauthorized: false } pg 配置目前也不适合我。但我通过heroku 文档找到了一个临时(可能是永久)解决方案

设置以下配置变量:

heroku config:set PGSSLMODE=no-verify

对我有用的不仅仅是使用连接字符串,而且还从我的数据库中添加 CA 作为 knex 中连接 object 的选项。

production: {
    client: 'postgresql',
    connection: { 
        connectionString: process.env.DATABASE_URL,
        ssl: { 
          rejectUnauthorized: false,
          ca: process.env.POSTGRES_CA,
        }
    }
}

如果您使用的配置如下:

...
production: {
    client: 'postgresql',
    connection: { 
        connectionString: process.env.DATABASE_URL,
        ssl: { rejectUnauthorized: false }
    }
}
...

...并且它仍然不适合您,请确保您的连接字符串中没有?ssl=truesslmode在 DB 中设置。

如果ssl在您的连接字符串中设置,它将覆盖您的配置的ssl部分,这意味着行为相当于:

...
production: {
    client: 'postgresql',
    connection: { 
        connectionString: process.env.DATABASE_URL,
        ssl: true
    }
}
...

从连接字符串中删除ssl条目将解决问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM