Ошибка «Самозаверяющий сертификат» во время запроса к базе данных Heroku Postgres из приложения Node.js - PullRequest
3 голосов
/ 08 апреля 2020
Приложение

My Node.js может работать с локальной базой данных Postgres через модуль npm pg. Я также могу подключиться к размещенной в Heroku базе данных Postgres (бесплатный план Hobby Dev) через командную строку с помощью команды heroku pg:psql. Но когда мое приложение Node.js пытается выполнить запрос к базе данных Heroku Postgres Я получаю ошибку self signed certificate.

Вот вывод с ошибкой self signed certificate:

(node:2100) UnhandledPromiseRejectionWarning: Error: self signed certificate
    at TLSSocket.onConnectSecure (_tls_wrap.js:1051:34)
    at TLSSocket.emit (events.js:189:13)
    at TLSSocket._finishInit (_tls_wrap.js:633:8)
(node:2100) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:2100) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
D:\MY\DEV\PROJECTS\AdsSubscribeBot\test.js:57
  if (err) throw err;
           ^

Error: Connection terminated unexpectedly
    at Connection.con.once (D:\MY\DEV\PROJECTS\AdsSubscribeBot\node_modules\pg\lib\client.js:264:9)
    at Object.onceWrapper (events.js:277:13)
    at Connection.emit (events.js:189:13)
    at Socket.<anonymous> (D:\MY\DEV\PROJECTS\AdsSubscribeBot\node_modules\pg\lib\connection.js:76:10)
    at Socket.emit (events.js:194:15)
    at TCP._handle.close (net.js:597:12)

Самый простой способ воспроизвести эту ошибку - попытаться использовать пример кода для подключения к Node.js из устройства Heroku devcenter: https://devcenter.heroku.com/articles/heroku-postgresql#connecting -in- node-js

Вот пример кода, который вызывает ошибку self signed certificate:

const connectionString = 'postgres://USERNAME:PASSWORD@HOST:PORT/DB_NAME';

const { Client } = require('pg');

const client = new Client({
  connectionString: connectionString,
  ssl: true
});

client.connect();

client.query('SELECT * FROM users;', (err, res) => {
  if (err) throw err;
  for (let row of res.rows) {
    console.log(JSON.stringify(row));
  }
  client.end();
});

Возможно, кто-то сталкивался с той же проблемой и знает, как ее решить.

Заранее спасибо за любую помощь.

1 Ответ

5 голосов
/ 09 апреля 2020

Проверьте ваш pg config. Похоже, вы используете pg 8, который неявно отключает проверку сертификата (как в вашей конфигурации, где для ssl установлено значение true, но конфигурация ssl не предоставляется). Укажите rejectUnauthorized: true, чтобы требовать действительный CA или rejectUnauthorized: false для явного отказа от защиты MITM.

Вы можете сделать это, когда вы настраиваете свою конфигурацию pg следующим образом

const client = new Client({
  connectionString: connectionString,
  ssl: { rejectUnauthorized: false }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...