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

运行pgtyped连接DigitalOcean Postgres时,如何让Node加载自签名证书?

问题概述

在Next.js项目中使用npx pgtyped连接DigitalOcean Postgres实例时,已将平台提供的自签名证书放在项目根目录,并通过NODE_EXTRA_CA_CERTS环境变量指定路径,但仍报错:

Error: self-signed certificate in certificate chain

错误代码为SELF_SIGNED_CERT_IN_CHAIN。需要验证环境变量是否生效,或确认报错的证书详情。当前package.json命令及pgtyped-config.json配置如下:

package.json命令

"pgtyped-watch": "cross-env NODE_EXTRA_CA_CERTS=\"./digital-ocean.crt\" npx pgtyped -w -c pgtyped-config.json"

pgtyped-config.json配置

{
  "transforms": [
    {
      "mode": "sql",
      "include": "**/*.sql",
      "emitTemplate": "{{dir}}/{{name}}.queries.ts"
    }
  ],
  "srcDir": "./src/",
  "failOnError": false,
  "camelCaseColumnNames": false,
  "db": {
    "host": "db-postgresql-ams3-myproj-do-user-14475298-0.b.db.ondigitalocean.com",
    "port": 25060,
    "user": "doadmin",
    "dbName": "defaultdb",
    "password": "xxxxxxxxxxxxxxxxxxxxxxx",
    "ssl": true
  }
}
解决步骤

1. 验证NODE_EXTRA_CA_CERTS环境变量是否生效

创建测试脚本test-env.js,检查环境变量传递情况及证书文件存在性:

const fs = require('fs');
console.log('NODE_EXTRA_CA_CERTS 路径:', process.env.NODE_EXTRA_CA_CERTS);
console.log('证书文件是否存在:', fs.existsSync(process.env.NODE_EXTRA_CA_CERTS));

运行以下命令测试:

cross-env NODE_EXTRA_CA_CERTS="./digital-ocean.crt" node test-env.js

若输出显示路径正确且文件存在,说明环境变量已生效;若路径错误或文件不存在,检查证书位置及命令中的路径写法。

2. 获取并对比服务器返回的证书详情

用openssl命令获取Postgres实例返回的证书,与本地证书对比:

# 获取服务器证书并保存到server-cert.crt
openssl s_client -connect db-postgresql-ams3-myproj-do-user-14475298-0.b.db.ondigitalocean.com:25060 < /dev/null | openssl x509 -text > server-cert.crt

打开生成的server-cert.crt,与本地digital-ocean.crt对比以下信息:

  • 证书的Subject和Issuer字段
  • 证书指纹(运行openssl x509 -fingerprint -in digital-ocean.crt和openssl x509 -fingerprint -in server-cert.crt对比)
    确认两者是否一致,排除证书不匹配问题。

3. 直接在pgtyped配置中指定SSL证书

若环境变量方式不生效,可直接在pgtyped-config.json的db配置中指定CA证书路径:

"db": {
  "host": "db-postgresql-ams3-myproj-do-user-14475298-0.b.db.ondigitalocean.com",
  "port": 25060,
  "user": "doadmin",
  "dbName": "defaultdb",
  "password": "xxxxxxxxxxxxxxxxxxxxxxx",
  "ssl": {
    "ca": "./digital-ocean.crt"
  }
}

修改后重新运行pgtyped-watch命令,此时pgtyped的底层Postgres客户端会直接加载指定的CA证书,避免环境变量传递问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 12:35:17