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

Pet*_*tey 6 postgresql ssl node.js node-postgres digital-ocean

我目前正在使用 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,
},
})
Run Code Online (Sandbox Code Playgroud)

我发现了另一篇文章,他们使用“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()
 }
}
Run Code Online (Sandbox Code Playgroud)

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

ssl : { rejectUnauthorized: false}
Run Code Online (Sandbox Code Playgroud)

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

任何帮助表示感谢。

Pet*_*tey 10

好吧,我终于能弄清楚了。我认为问题是多行的,只是对我当地的开发环境的 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)
})
Run Code Online (Sandbox Code Playgroud)

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

CA_CERT="-----BEGIN CERTIFICATE-----\nVALUES HERE WITH NO SPACES AND A \n 
AFTER EACH LINE\n-----END CERTIFICATE-----"
Run Code Online (Sandbox Code Playgroud)

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

{rejectUnauthorized:true} 
Run Code Online (Sandbox Code Playgroud)

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