46

我正在尝试连接到我的 Heroku PostgreSQL 数据库,但我不断收到 SSL 错误。有谁知道如何在连接字符串中启用 SSL?

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

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

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

非常感谢评论。

4

9 回答 9

74

你可以这样实现:

postgres://user:pass@host:port/database?ssl=true
于 2014-07-25T18:13:17.733 回答
20

从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));

希望这可以帮助!

于 2015-05-07T19:16:14.550 回答
16

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

SSL 连接没有记录,pg-promise但它建立在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()});
于 2018-08-21T09:23:10.593 回答
4

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

完整示例:

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

于 2019-07-10T20:18:29.610 回答
4

我也有同样的问题。至于今天,有问题pg >= 8.0.0。因此,如果您遇到此问题,请使用 pg 版本 7 及以下版本。

yarn add pg@7
于 2020-04-14T05:58:43.177 回答
2

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

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

.env

PGHOST=localhost
PGPORT=5432
PGDATABASE=mydb
PGUSER=pguser1
PGPASSWORD=mypassword
PGSSLMODE=require

(确保您设置PGSSLMODErequire如上所示。)

数据库.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)
    }
}

服务器.js

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}!`))

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

Error: The server does not support SSL connections
at Socket.<anonymous> (node_modules/pg/lib/connection.js:87:35)

参考:

于 2019-03-19T21:38:52.137 回答
2

如果以上都不起作用。

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

原因是我克隆了一个 GitHub 存储库(我自己的),它在切换计算机后调用了私有变量。repo 没有.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
于 2020-10-23T06:12:25.790 回答
1
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 个选区密钥的组合(BaltimoreCyber​​TrustRoot.crt.pem 即将到期)。一个具有多个密钥的文件 ----- BEGIN CERTIFICATE ----- BaltimoreCyber​​TrustRoot.crt.pem -- --- END CERTIFICATE ----- ----- BEGIN CERTIFICATE ----- DigiCertGlobalRootG2.crt.pem -----END CERTIFICATE----- 使用 Sequelize 从 node.js 应用程序连接到 Azure postgress支持 SSL 的 ORM。
DigiCertGlobalRootG2.crt.pem:您将从Azure 门户获取它。

注意:如果不使用任何密钥,则 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配置注意:您认为需要更改的内容,请告诉我

于 2021-02-08T10:28:56.657 回答
0

如果您使用 AWS RDS Proxy for Postgresql,那么ssl: true就足够了。完整的例子在这里

let getConnection = async () => {
    let connParam = {
        host: {RDS_PROXY_URL},
        port: {PORT},
        user: {USERNAME},
        database : {DB_ANME},
        password: {PASSWORD},
        ssl: true
    };
    
    let pgClient = new pg.Client(connParam);

    await pgClient.connect();

    return pgClient;
}
于 2022-02-28T08:26:23.390 回答