运行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
相关产品推荐
相关产品推荐

