Sequelize连接错误:自签名证书

47

我正在尝试连接到我在Heroku上设置的PostgreSQL数据库。

const { Sequelize, DataTypes, Model } = require("sequelize");

// DB Configuration
const sequelize = new Sequelize({
  database: "[won't show db]",
  username: "[won't show username]",
  password: "[won't show password]",
  host: "ec2-54-221-195-148.compute-1.amazonaws.com",
  port: 5432,
  dialect: "postgres",
  dialectOptions: {
    ssl: true,
  },
});

以下是我得到的输出:

SequelizeConnectionError: 自签名证书


注:本文中的“Sequelize”是一种IT技术,不做翻译。
6个回答

126
这是由于node-postgres 8版本中的(意外)破坏性更改导致的(请参见此GitHub问题)。
解决方法是在dialectOptions>ssl内将rejectUnauthorized: false传递给sequelize连接参数,如GitHub用户jsanta所述,绕过SSL证书检查(当通过安全连接连接到受信任的服务器时,例如在本地主机或在同一网络中的自己的服务器之间),这是可以接受的。
const sequelize = new Sequelize({
  database: "xxxxx",
  username: "xxxxx",
  password: "xxxxx",
  host: "xxxxx",
  port: 5432,
  dialect: "postgres",
  dialectOptions: {
    ssl: {
      require: true,
      rejectUnauthorized: false // <<<<<<< YOU NEED THIS
    }
  },
});

1
这个与“sequelize”:“^5.21.10”,“pg”:“^8.2.1”一起工作。 - Jorge Alonso
5
严肃地说,sequelize团队完全理解已发布的API吗?就是...完全理解吗?(叹气) - ChrisH
4
对于Sequelize 6.3.5,我需要执行以下操作:ssl: { rejectUnauthorized: false } - Richard
@WithoutATowel 我已经回答了你的问题。如果解决了你的问题,请检查并点赞。谢谢。 - camelCase
1
误报!我打错了一个字。这个修复方法有效 :) - WithoutATowel
一个多小时我都没搞清楚为什么这个解决方案对我不起作用。原来,我在“dialectOptions”中的“ssl”之外有了“rejectUnauthorized: false”。如果还有人遇到问题,请确保正确嵌套它。 - Bryson Kruk

9

在我的情况下,以上方法都无法使用,我使用连接字符串方法来应用pg配置,所以我设置了查询参数sslmode=no-verify,这样就可以运行了。

示例

postgres://myuser:mypassword@myhost:5432/mydatabasename?sslmode=no-verify

是的,在我的情况下也是这样。有人知道为什么我们必须这样做吗? - Burak Karakuş
在我的情况下,这是解决方案,我的堆栈是数字海洋中的kubernetes、托管数据库,并且我创建了一个不是默认的数据库和用户。 - agusgambina
这是因为您使用 uri 参数来定义连接,而不是 pg 对象参数。PostgreSQL 接受几个值用于 sslmode 参数,这些值在此处有所解释:https://www.postgresql.org/docs/current/libpq-ssl.html。它用于定义我们对未经验证的证书的接受级别。 - Luki B. Subekti

2

对我来说有效(在sequelize config.json文件上):

    "dialect": "postgres",
    "dialectOptions": {
      "ssl": {
        "require": true,
        "rejectUnauthorized": false
      }
    }

1

这对我有效,在config.json文件中

  "development": {
    "username": "dummy",
    "password": "dummy",
    "database": "dummy",
    "host": "dummy",
    "dialect": "postgres",
    "dialectOptions":{
      "ssl": {
        "require": true,
        "rejectUnauthorized": false
      }
    }
  }

很好,但这与我发布的完全相同的解决方案,只是没有解释... 相反,它引用了并非每个人都拥有的文件。 - CherryDT

0

1
根据目前的写法,你的回答不够清晰。请编辑以添加更多细节,帮助其他人理解这如何回答所提出的问题。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - undefined

-1
在你的代码中添加以下内容...
dbRDS=false

你能否给出一个更完整的例子?它看起来像是一个变量赋值,但仅有这些代码是没有任何作用的。 - CherryDT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接