我正在尝试连接到我的Heroku PostgreSQL数据库,并且我一直收到SSL错误。有没有人知道如何在连接字符串中启用SSL?
postgres://user:pass@host:port/database;
一直在寻找它,但它似乎不是一个非常热门的话题。 顺便说一句,我运行Nodejs和node-pg模块及其连接池方法:
pg.connect(connString, function(err, client, done) {
/// Should work.
});
非常感谢评论。
答案 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 的密钥的组合(BaltimoreCyberTrustRoot.crt.pem 即将到期)。一个具有多个密钥的文件为
----- 开始认证 -----
BaltimoreCyberTrustRoot.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 配置
注意:您觉得需要更改的内容,请告诉我