用于PostgreSQL连接nodejs的SSL

时间:2014-03-10 13:37:49

标签: node.js postgresql ssl node-postgres

我正在尝试连接到我的Heroku PostgreSQL数据库,并且我一直收到SSL错误。有没有人知道如何在连接字符串中启用SSL?

postgres://user:pass@host:port/database;

一直在寻找它,但它似乎不是一个非常热门的话题。 顺便说一句,我运行Nodejs和node-pg模块及其连接池方法:

pg.connect(connString, function(err, client, done) { /// Should work. });

非常感谢评论。

8 个答案:

答案 0 :(得分:55)

你可以这样做:

postgres://user:pass@host:port/database?ssl=true

答案 1 :(得分:10)

node-postgres创建新客户端时,您也可以使用以下代码:

var pg = require("pg");

var client = new pg.Client({
  user: "yourUser",
  password: "yourPass",
  database: "yourDatabase",
  port: 5432,
  host: "host.com",
  ssl: true
});

client.connect();

var query = client.query('CREATE TABLE people(id SERIAL PRIMARY KEY, name VARCHAR(100) not null)');

query.on('row', function(row) {
  console.log(row.name);
});

query.on('end', client.end.bind(client));

希望这有帮助!

答案 2 :(得分:3)

我有同样的问题。 就今天而言,pg >= 8.0.0存在问题。 因此,如果您遇到此问题,请使用pg版本7及更低版本。

yarn add pg@7

答案 3 :(得分:1)

对于Google Cloud PG和pg-promise,我有类似的需求。 我(使用?ssl=true得到的错误是connection requires a valid client certificate

没有为pg-promise记录SSL连接,但是它建立在node-postgres上。如链接中所述,ssl配置参数可以不仅仅是true

const pgp = require('pg-promise')();
const fs = require('fs');

const connectionConf = {
    host: 'myhost.com',
    port: 5432,
    database: 'specific_db_name',
    user: 'my_App_user',
    password: 'aSecretePass',
    ssl: {
        rejectUnauthorized : false,
        ca   : fs.readFileSync("server-ca.pem").toString(),
        key  : fs.readFileSync("client-key.pem").toString(),
        cert : fs.readFileSync("client-cert.pem").toString(),
  }

};
const new_db = pgp(connectionConf);
new_db.any('SELECT * FROM interesting_table_a LIMIT 10')
    .then(res => {console.log(res);})
    .catch(err => {console.error(err);})
    .then(() => {new_db.$pool.end()});

答案 4 :(得分:1)

如果以上都不起作用。

考虑我的情况,以前在工作,最近刚换过工作台-突然不再工作并出现上述错误。

原因是我克隆了一个GitHub存储库(我自己的),该存储库在切换计算机后调用了私有变量。回购没有一个.env文件(显然),该文件包含数据库连接字符串以及许多其他变量。因此,直到我在本地创建.env文件之前,对代码中的调用不再起作用。

TLDR

// database_config.js
const { Client } = require("pg");
const client = new Client({
  connectionString: process.env.DATABASE_CONNECTION, // <--- not defined without .env file definition
  ssl: {
    rejectUnauthorized: false,
  },
});

client
.connect()
.then(() => console.log("connected to database"))
.catch((err) => console.error(err));

module.exports = client;

解决方案

// .env
DATABASE_CONNECTION = your_connection_string

答案 5 :(得分:0)

您还可以使用环境变量来建立连接。这是一个例子。

(假设您有一个Postgres数据库在端口5432 @ localhost上运行,并且该数据库支持SSL连接)

.env

TreeMap

(确保如上所述将PGHOST=localhost PGPORT=5432 PGDATABASE=mydb PGUSER=pguser1 PGPASSWORD=mypassword PGSSLMODE=require 设置为PGSSLMODE。)

db.js

require

server.js

require('dotenv').config()
const { Pool } = require('pg')

// pools will use environment variables for connection information
const pool = new Pool()
// const pool = new Pool({ ssl: true }); This works too in the absence of PGSSLMODE
pool.on('error', function (err) {
    console.log('idle client error', err.message, err.stack)
})

module.exports = {
    pool,
    query: (text, params, callback) => {
        return pool.query(text, params, callback)
    }
}

注意:如果您的Postgres数据库不支持SSL连接,则当您的应用程序尝试进​​行查询时,将出现以下错误:

const express = require('express')
const { pool } = require('./db')

const app = express()
const port = 3000

app.get('/', async (req, res) => {
  console.log('Request received...')
  const result = await pool.query(`SELECT * FROM organization`);
  res.send(result)
})

app.listen(port, () => console.log(`Example app listening on port ${port}!`))

参考文献:

答案 6 :(得分:0)

对于任何正在寻找TypeORM解决方案的人来说,它也是{ssl: true}

完整示例:

const connectionOptions: PostgresConnectionOptions = {
    name: `default`,
    type: `postgres`,
    url: process.env.DATABASE_URL,
    ssl: process.env.DATABASE_SSL === `true`
}

答案 7 :(得分:0)

const sequelize = new Sequelize(
    configuration.get("postgresConnectionString"),
    {
        logging: false,
        dialectOptions: {
            ssl: {
                ca: fs.readFileSync(path.join(__dirname, "/ssl/DigiCertGlobalRootG2.crt.pem")),
                rejectUnauthorized: true,
                require: true,
            },
        },
    },
);

DigiCertGlobalRootG2.crt.pem:是 2 个用于 constitency 的密钥的组合(BaltimoreCyber​​TrustRoot.crt.pem 即将到期)。一个具有多个密钥的文件为 ----- 开始认证 ----- BaltimoreCyber​​TrustRoot.crt.pem ----- 结束证书 ----- ----- 开始认证 ----- DigiCertGlobalRootG2.crt.pem -----结束证书----- 使用支持 SSL 的 Sequelize ORM 从 node.js 应用程序连接到 Azure postgress。
DigiCertGlobalRootG2.crt.pem:您将从 Azure portal 获取。

注意:如果不使用任何密钥,那么 ssl 配置是这样的:

const sequelize = new Sequelize(
    configuration.get("postgresConnectionString"),
    {
        logging: false,
        dialectOptions: {
            ssl: true,
        },
    },
);

注意:请检查 connectionString 是否以 sslmode=require|| ssl_ca=required: https://docs.microsoft.com/en-us/azure/mysql/concepts-certificate-rotation 结尾,基于此,请相应添加 SSL 配置 注意:您觉得需要更改的内容,请告诉我