簡體   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