如何强制PostgreSQL客户端使用SSL连接?本地PG12环境配置问题
PostgreSQL SSL强制连接配置问题及解决方案
环境
Windows 10, localhost, 同一设备 PostgreSQL 12 Node.js 14 OpenSSL 1.1.1k
已参考PostgreSQL官方SSL-TCP配置相关说明完成基础操作。
初始配置
服务端配置文件 postgresql.conf
文件路径:C:\Program Files\PostgreSQL\12\data,为PostgreSQL服务端核心配置文件,配置内容如下:
ssl = on # 服务端会在同一TCP端口监听普通连接和SSL连接,会与接入的客户端协商是否使用SSL ssl_cert_file = 'server.crt' ssl_key_file = 'server.key' ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' ssl_prefer_server_ciphers = on ssl_ca_file = 'root.crt' # 用于要求客户端提供受信任的证书 ssl_crl_file = ''
访问控制配置文件 pg_hba.conf
文件路径:C:\Program Files\PostgreSQL\12\data,用于管控所有数据库客户端的访问权限,初始配置如下:
... hostssl all all 127.0.0.1/32 cert clientcert=1 ...
测试验证
通过pSQL工具测试,确认连接已走SSL协议:
问题表现
简单Node.js测试项目可不使用SSL正常连接数据库,测试代码如下:
require('dotenv').config({ path: './environment/PostgreSql.env'}); const pgp = require('pg-promise')(); const db = pgp( { user: process.env.PGuser, host: process.env.PGhost, database: process.env.PGdatabase, password: process.env.PGpassword, port: process.env.PGport, ssl: false // 非必填,设为true时报错code: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE' } ); var sql = 'select * from current.testssl()'; db.any(sql) .then( good => { console.log(good); // ssl设为false可正常获取查询数据 }, bad => { console.log(bad); /* ssl设为true时报错 at TLSWrap.callbackTrampoline (internal/async_hooks.js:130:17) { code: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE', stack: 'Error: unable to verify the first certificate…ckTrampoline (internal/async_hooks.js:130:17)', message: 'unable to verify the first certificate' } */ } );
最终解决方案
调整pg_hba.conf的访问规则即可实现强制所有连接走SSL协议,注意pg_hba.conf的规则是从上到下匹配生效,拒绝非SSL连接的规则必须放在首行:
# TYPE DATABASE USER ADDRESS METHOD hostnossl all all 0.0.0.0/0 reject # 必须放在首行! host all all 127.0.0.1/32 md5 host all all ::1/128 md5 host replication all 127.0.0.1/32 md5 host replication all ::1/128 md5 hostssl all all 0.0.0.0/0 cert clientcert=verify-full
内容的提问来源于stack exchange,提问作者Jeb50
相关产品推荐
相关产品推荐

