Knex Heroku 错误:自签名证书

Posted

技术标签:

【中文标题】Knex Heroku 错误:自签名证书【英文标题】:Knex Heroku Error: self signed certificate 【发布时间】:2020-08-30 07:13:46 【问题描述】:

我不断收到此错误:

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 的 knexfile 中的生产中:true 并且我得到了同样的错误。我过去很多次都这样做过,从来没有遇到过这个问题。想知道 Heroku 是否改变了任何东西,但是在搜索他们的文档时我找不到任何东西。

【问题讨论】:

您可以尝试将您的 pg 版本降级到 7.4.3 @dfrancese 您找到解决方案了吗? 【参考方案1】:

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

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

...

DATABASE_URL 是您通过运行heroku config --yourAppName 得到的结果

【讨论】:

你刚刚把我从地狱中救了出来 谢谢,在 knex 文档上很难找到关于 ssl 选项的文档。你的回答为我解决了问题 关于此选项的文档在哪里?【参考方案2】:

这是由于 pg@^8 (2020/02/25) cf. this heroku help forum.

你可以得到full pg@^8 announcement,但这里是相关的段落:

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

看来 heroku 在某处使用自签名证书。

可能的解决方案:

降级到 pg@^7 指示 pg@^8 忽略有问题的证书 ssl: rejectUnauthorized: false (参见上面链接的公告) 想办法下载并信任证书instructions

【讨论】:

添加ssl: rejectUnauthorized: false 无效,我仍然收到同样的错误:( @j86 我也坚持尝试了上述 SSL 配置。你能继续前进吗?如果你能确认,那将是非常好的你。谢谢【参考方案3】:

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

设置以下配置变量:

heroku config:set PGSSLMODE=no-verify

【讨论】:

【参考方案4】:

对我有用的不仅仅是使用连接字符串,还可以将我的数据库中的 CA 作为选项添加到 knex 中的连接对象中。

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

【讨论】:

【参考方案5】:

如果您使用的配置如下:

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

...

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

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

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

...

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

【讨论】:

以上是关于Knex Heroku 错误:自签名证书的主要内容,如果未能解决你的问题,请参考以下文章

Sailsjs Heroku Postgresql 错误:自签名证书

Heroku 运行 sequelize db:migrate 时出现“自签名证书”错误

Openssl:错误“证书链中的自签名证书”

Openssl:错误“证书链中的自签名证书”

Ionic Cordova 资源错误:证书链中的自签名证书

nodejs - 证书链中的错误自签名证书