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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 09:37:14