如何将 SSL 证书(ca-cert)添加到 node.js 环境变量以连接到 Digital Ocean Postgres 托管数据库?

问题描述 投票:0回答:2

我目前正在使用 node-postgres 来创建我的池。这是我当前的代码:

const { Pool } = require('pg')

const pgPool = new Pool({
  user: process.env.PGUSER,
  password: process.env.PGPASSWORD,
  host: process.env.PGHOST,
  database: process.env.PGDATABASE,
  port: process.env.PGPORT,
  ssl: {
    rejectUnauthorized: true,
    // Would like to add line below
    // ca: process.env.CACERT,
},
})

我发现了另一篇文章,他们使用“fs”在证书中读取内容,如下所示。

const config = {
database: 'database-name',
host: 'host-or-ip',
user: 'username',
password: 'password',
port: 1234,
// this object will be passed to the TLSSocket constructor
ssl: {
  ca: fs.readFileSync('/path/to/digitalOcean/certificate.crt').toString()
 }
}

我无法做到这一点,因为我正在使用 git 部署我的应用程序。特别是 Digital Oceans 新的应用程序平台。我曾尝试联系他们,但没有成功。我不想将我的证书提交到我的源代码管理中。我看到很多人建议设置的帖子

ssl : { rejectUnauthorized: false}

这不是我想要采取的方法。我的代码确实可以使用,但我希望它是安全的。

如有任何帮助,我们将不胜感激。

node.js postgresql ssl digital-ocean node-postgres
2个回答
12
投票

好吧,我终于弄清楚了。我认为问题是多行的,只是对我本地开发环境的 dotenv 不熟悉。

我能够像这样使用我的代码来完成所有工作。它也可以与 fs.readFileSync() 一起使用,但我不想将其提交到我的源代码管理中。

const { Pool } = require('pg')
const fs = require('fs')

const pgPool = new Pool({
user: process.env.PGUSER,
password: process.env.PGPASSWORD,
host: process.env.PGHOST,
database: process.env.PGDATABASE,
port: process.env.PGPORT,
ssl: {
    rejectUnauthorized: true,
    // ca: fs.readFileSync(
    //     `${process.cwd()}/cert/ca-certificate.crt`.toString()
    // ),
    ca: process.env.CA_CERT,
},
})
.on('connect', () => {
    console.log('connected to the database!')
})
.on('error', (err) => {
    console.log('error connecting to database ', err)
})

现在在我的 config.env 中,我必须使其看起来像这样:

CA_CERT="-----BEGIN CERTIFICATE-----\nVALUES HERE WITH NO SPACES AND A \n 
AFTER EACH LINE\n-----END CERTIFICATE-----"

我必须将其保留为单行字符串才能使其正常工作。但我终于联系上了

{rejectUnauthorized:true} 

对于数字海洋应用程序平台环境变量,我复制了包括双引号在内的所有内容并将其粘贴到那里。看起来效果很好。不过,我认为您无法在他们的 7 美元开发数据库中将此设置设置为 true。我必须升级到托管证书才能找到要下载的 CA 证书。


0
投票

这是由于我的 DO 证书格式问题造成的。如果从 texfile 复制并粘贴证书,它会在每行之前添加空格。 如果您在从 env 或 dotenv 文件读取数据时遇到问题,请确保没有空格。 @Petey 通过添加表明了这一点 ,这给了我一个线索,那就是这是一个格式错误的字符串,而不是一个不正确的证书。

下面是 .env 文件的示例。

使用空格不起作用

POSTGRES_CA="-----BEGIN CERTIFICATE-----
          MIIEQTCCAqmgAwIBAgIUG9FCIwnnJpmHO0iG5diqtueJgGkwDQYJKoZIhvcNAQEM
          BQAwOjE4MDYGA1UEAwwvYjRkNGJlMDQtOTg3Ni00NTEwLTliNjQtZjk2ODc5MmFm
          NWYxIFByb2plY3QgQ0EwHhcNMjQwNDA2MTk1NTM5WhcNMzQwNDA0MTk1NTM5WjA6
          MTgwNgYDVQQDDC9iNGQ0YmUwNC05ODc2LTQ1MTAtOWI2NC1mOTY4NzkyYWY1ZjEg
          Z1rOPFzpnX0Yf086KV4ghVCe3Z26xfxIX/SJA+uGtzJkbFV3EN69oISRIwL/bO9J
          AaaYybJhx4jeLpqOQz82ZSC0nqAhRZ+3f2BiIacjGHXhiaGxxw==
          -----END CERTIFICATE-----"

没有空格就可以

提示:如果将证书内容粘贴到新行中,大多数 IDE 默认不会添加空格。这样排列比手动删除空格更容易!

POSTGRES_CA="-----BEGIN CERTIFICATE-----
MIIEQTCCAqmgAwIBAgIUG9FCIwnnJpmHO0iG5diqtueJgGkwDQYJKoZIhvcNAQEM
BQAwOjE4MDYGA1UEAwwvYjRkNGJlMDQtOTg3Ni00NTEwLTliNjQtZjk2ODc5MmFm
NWYxIFByb2plY3QgQ0EwHhcNMjQwNDA2MTk1NTM5WhcNMzQwNDA0MTk1NTM5WjA6
MTgwNgYDVQQDDC9iNGQ0YmUwNC05ODc2LTQ1MTAtOWI2NC1mOTY4NzkyYWY1ZjEg
Z1rOPFzpnX0Yf086KV4ghVCe3Z26xfxIX/SJA+uGtzJkbFV3EN69oISRIwL/bO9J
AaaYybJhx4jeLpqOQz82ZSC0nqAhRZ+3f2BiIacjGHXhiaGxxw==
-----END CERTIFICATE-----"

然后使用环境变量添加就很简单了

ssl: {
    ca: process.env.POSTGRES_CA,
    rejectUnauthorized: true,
},
© www.soinside.com 2019 - 2024. All rights reserved.