Подтвердить что ты не робот

SSL для соединений PostgreSQL nodejs

Я пытаюсь подключиться к моей базе данных Heroku PostgreSQL, и я продолжаю получать ошибку SSL. Кто-нибудь знает, как включить SSL в строке подключения?

postgres://user:[email protected]:port/database;

Он искал его везде, но, похоже, это не очень популярная тема. Кстати, я запускаю Nodejs и модуль node -pg с его методом объединения пулов:

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

Комментарии очень ценятся.

4b9b3361

Ответ 1

Вы можете добиться этого следующим образом:

postgres://user:[email protected]:port/database?ssl=true

Ответ 2

Вы также можете использовать этот код ниже при создании нового клиента из 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));

Надеюсь, это поможет!

Ответ 3

С Google Cloud PG и pg-обещанием у меня возникла аналогичная потребность. Ошибка, которую я получил (используя ?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()});

Ответ 4

Вы также можете использовать переменные окружения для настройки соединения. Вот пример.

(Предполагается, что у вас есть БД Postgres, работающая на порту 5432 @localhost, и БД поддерживает соединение SSL)

.env

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

(Убедитесь, что для PGSSLMODE require как показано выше.)

db.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)
    }
}

server.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)

Рекомендации:

Ответ 5

Для любого, кто ищет решение TypeORM, он также {ssl: true}.

Полный пример:

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