在Deno中使用TLS连接DigitalOcean Postgres数据库失败
问题描述
我编写了如下代码尝试连接DigitalOcean的PostgreSQL数据库,但无法成功:
import { Client } from 'https://deno.land/x/postgres@v0.17.0/mod.ts'; const client = new Client({ hostname: '<url>.ondigitalocean.com', port: 25060, user: 'doadmin', database: 'defaultdb', tls: { enabled: true, enforce: true, caCertificates: [await Deno.readTextFile('./ca-certificate.crt')], }, password: Deno.env.get('DB_PASSWORD') || config().DB_PASSWORD, }); await client.connect();
运行应用时,即使传递--cert选项或--unsafely-ignore-certificate-errors参数,仍出现以下错误:
Sending fatal alert DecodeError error: Uncaught Error: The certificate used to secure the TLS connection is invalid.
解决方案
检查CA证书的正确性与路径
- 确认你使用的是DigitalOcean官方提供的CA证书,不要混用其他来源的证书。
- 验证证书文件路径:确保Deno运行时的工作目录和证书所在目录一致,或直接使用绝对路径(比如
/home/user/ca-certificate.crt)避免路径匹配问题。 - 打开证书文件,确认内容是完整的PEM格式(开头为
-----BEGIN CERTIFICATE-----,结尾为-----END CERTIFICATE-----),没有下载时的截断或格式损坏。
修改TLS配置的证书读取方式
部分版本的deno-postgres客户端要求CA证书以二进制格式传入,而非文本格式。将Deno.readTextFile替换为Deno.readFile尝试:tls: { enabled: true, enforce: true, caCertificates: [await Deno.readFile('./ca-certificate.crt')], },规范命令行参数的使用
- 使用
--cert参数时,需明确指定证书文件路径,示例:deno run --cert=./ca-certificate.crt your-app-file.ts - 若仅用于测试(生产环境禁止),可临时关闭证书强制校验:
tls: { enabled: true, enforce: false, caCertificates: [await Deno.readFile('./ca-certificate.crt')], },
- 使用
排查环境变量与配置加载
确认DB_PASSWORD已正确加载(无论是环境变量还是配置文件),虽不会直接导致证书错误,但可避免因认证问题干扰排查方向。
内容的提问来源于stack exchange,提问作者kumail
相关产品推荐
相关产品推荐

