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=true
或 sslmode
。
如果在您的连接字符串中设置了ssl
,它将覆盖您配置的ssl
部分,这意味着行为相当于:
...
production:
client: 'postgresql',
connection:
connectionString: process.env.DATABASE_URL,
ssl: true
...
从连接字符串中删除 ssl
条目将解决问题。
【讨论】:
以上是关于Knex Heroku 错误:自签名证书的主要内容,如果未能解决你的问题,请参考以下文章
Sailsjs Heroku Postgresql 错误:自签名证书