Heroku PostgreSQL DBに接続しようとしていますが、SSLエラーが発生し続けます。接続文字列でSSLを有効にする方法に関するアイデアはありますか?
postgres://user:pass@Host:port/database;
どこでも探していましたが、あまり話題にならないようです。ちなみに、私はNodejsとnode-pgモジュールをその接続プールメソッドで実行しています。
pg.connect(connString, function(err, client, done) {
// Should work.
});
コメントは大歓迎です。
これは次のようにして実現できます。
postgres://user:pass@Host:port/database?ssl=true
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));
お役に立てれば!
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()});
TypeORMソリューションを探している人にとっては、{ssl: true}
。
完全な例:
const connectionOptions: PostgresConnectionOptions = {
name: `default`,
type: `postgres`,
url: process.env.DATABASE_URL,
ssl: process.env.DATABASE_SSL === `true`
}
環境変数を使用して接続を設定することもできます。例を示します。
(Postgres DBがポート5432 @ localhostで実行されており、DBが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)
参照: