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

TypeORM连接Postgres证书校验失败但node-postgres可正常连接

问题原因

两种连接方式表现不一致的核心原因是客户端默认SSL校验策略不同:

  • 你使用的node-postgres版本在仅传入ca证书参数时,不会强制校验「当前连接的主机名」是否匹配服务端返回证书的SAN(主体备用名称)列表,只要证书由可信CA签发即可建立连接,因此通过localhost端口转发访问时不会触发报错。
  • TypeORM 0.3.x 版本对Postgres驱动的SSL配置做了安全强化,默认开启严格主机名校验:会检查你配置的连接host(即当前场景下的localhost)是否存在于RDS实例返回证书的域名列表中。AWS RDS签发的证书仅包含RDS实例自身的官方域名,不会包含localhost,因此直接抛出主机名不匹配的错误。
修复方案

按优先级从高到低可选:

方案1:本地host映射+端口转发(零代码修改,安全性最高)

不需要修改任何连接配置,仅调整本地环境:

  • 修改本地hosts文件,将RDS实例的真实域名(即证书SAN列表中展示的AWS官方域名)解析到127.0.0.1
  • 调整跳板机端口转发规则,将原本绑定localhost:5432的转发改为绑定上述RDS域名的5432端口
  • 将TypeORM配置中的host参数改为RDS实例的真实域名
    此时TLS握手阶段的主机名与证书内置域名完全匹配,不需要调整SSL校验规则,全程保持证书校验的最高安全等级。

方案2:自定义SSL校验规则(兼容端口转发场景,安全性可控)

如果不想修改本地host配置,可以在TypeORM的SSL配置中自定义校验逻辑,保留证书有效性校验、仅跳过主机名匹配检查,不存在中间人攻击风险,生产环境也可使用:

const AppDataSource = new DataSource({
    type: "postgres",
    host: DB_HOST,
    port: DB_PORT,
    username: DB_USER,
    password: async () => signer.getAuthToken({}),
    database: DB_DATABASE,
    entities: [],
    synchronize: false,
    logging: false,
    ssl: {
        ca: fs.readFileSync('./cert.pem').toString(),
        rejectUnauthorized: true,
        // 跳过主机名匹配校验,适配本地端口转发场景
        checkServerIdentity: () => undefined
    },
})

方案3:临时关闭SSL严格校验(仅本地调试可用,禁止生产使用)

如果仅需要本地快速调试,可以直接关闭证书合法性校验,该方案存在中间人攻击风险,绝对不能在生产环境配置:

ssl: {
    ca: fs.readFileSync('./cert.pem').toString(),
    rejectUnauthorized: false
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 03:45:47