You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

设置rejectUnauthorized: false后PostgreSQL仍不接受自签名证书

Node.js pg库连接Docker自签名证书PostgreSQL故障排查方案

核心配置调整

1. 显式指定客户端证书文件

既然你已经有cert和key文件,别只依赖rejectUnauthorized: false,直接在ssl配置里加载证书:

import pg from 'pg';
import fs from 'fs';
const { Pool } = pg;

let connectionString = process.env.DB_CONNECTION_STRING

export const pool = new Pool({
    connectionString: connectionString, 
    ssl: {
        rejectUnauthorized: false,
        cert: fs.readFileSync('/容器内证书绝对路径/client.cert').toString(),
        key: fs.readFileSync('/容器内证书绝对路径/client.key').toString()
    },
})

console.log('connectionString:', connectionString);

注意替换成容器内可访问的证书绝对路径,同时确保Node进程有读取这些文件的权限。

2. 检查连接字符串冲突

如果你的DB_CONNECTION_STRING里包含ssl=true或其他ssl参数,可能会覆盖代码中的配置。可以二选一处理:

  • 统一在连接字符串里指定证书信息:
    postgresql://用户名:密码@数据库地址:端口/库名?ssl=true&sslcert=/路径/client.cert&sslkey=/路径/client.key&sslmode=require
    
  • 删除连接字符串里的ssl相关参数,仅保留代码中的ssl配置块。

3. 验证证书有效性

  • 检查cert和key是否配对:执行以下两条命令,输出的md5值必须完全一致
    openssl x509 -noout -modulus -in client.cert | openssl md5
    openssl rsa -noout -modulus -in client.key | openssl md5
    
  • 确认证书未过期:
    openssl x509 -in client.cert -text -noout
    
    查看输出里的Not Before和Not After字段,确认当前时间在有效期范围内。

4. 核对PostgreSQL的认证规则

确保pg_hba.conf里允许证书认证的连接,添加或修改规则:

hostssl 你的数据库名 你的用户名 0.0.0.0/0 cert

修改完成后重启PostgreSQL容器。

快速排查步骤

  1. 开启pg库的调试日志,抓取具体错误信息:
pg.defaults.log = console.log;

运行后查看控制台输出的详细报错,比如是否存在证书路径错误、格式不兼容等问题。
2. 用psql测试连接,确认数据库端配置正常:

psql "postgresql://用户名:密码@数据库地址:端口/库名?sslmode=require&sslcert=/路径/client.cert&sslkey=/路径/client.key"

如果psql能正常连接,说明问题确实出在Node.js端的配置上。

内容的提问来源于stack exchange,提问作者Terry Windwalker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 09:05:16