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

Strapi连接Digital Ocean托管PostgreSQL数据库SSL配置问题求助

Strapi连接Digital Ocean PostgreSQL SSL证书错误解决指南

问题描述

启动Strapi生产服务器时出现SSL证书错误:

[2024-07-22 16:30:50.780] error: self-signed certificate in certificate chain
Error: self-signed certificate in certificate chain
    at TLSSocket.onConnectSecure (node:_tls_wrap:1659:34)
    at TLSSocket.emit (node:events:517:28)
    at TLSSocket.emit (node:domain:489:12)
    at TLSSocket._finishInit (node:_tls_wrap:1070:8)
    at ssl.onhandshakedone (node:_tls_wrap:856:12)

当前database.ts配置:

export default ({ env }) => ({
    connection: {
        client: 'postgres',
        connection: {
            host: env('DATABASE_HOST'),
            port: env.int('DATABASE_PORT'),
            database: env('DATABASE_NAME'),
            user: env('DATABASE_USERNAME'),
            password: env('DATABASE_PASSWORD'),
            ssl: {
                ca: env('DATABASE_CA')
            },
        },
        debug: false,
    },
});

已配置所有环境变量(包括Digital Ocean提供的CA证书),但错误依然存在。

解决方案

1. 正确配置Strapi连接Digital Ocean PostgreSQL的SSL方式

Digital Ocean托管PostgreSQL强制要求SSL连接,以下两种配置方式可解决证书错误问题:

方式一:启用完整证书验证(生产环境推荐)

修改database.ts的SSL配置,显式开启证书验证,并处理环境变量中的换行符转义:

export default ({ env }) => ({
    connection: {
        client: 'postgres',
        connection: {
            host: env('DATABASE_HOST'),
            port: env.int('DATABASE_PORT'),
            database: env('DATABASE_NAME'),
            user: env('DATABASE_USERNAME'),
            password: env('DATABASE_PASSWORD'),
            ssl: {
                rejectUnauthorized: true,
                ca: env('DATABASE_CA').replace(/\\n/g, '\n')
            },
        },
        debug: false,
    },
});

方式二:临时跳过证书验证(仅测试用,禁止生产环境使用)

若需快速验证连接,可临时关闭证书验证,但会带来安全风险:

ssl: {
    rejectUnauthorized: false
}

2. CA证书的正确格式与提供方式

Digital Ocean提供的CA证书为PEM格式(以-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾的文本),配置时需注意两点:

  • 环境变量换行符处理:将PEM证书存入环境变量时,多数系统会把换行符转义为\n,必须通过replace(/\\n/g, '\n')还原为真实换行符,否则Strapi无法识别完整证书。
  • 直接读取证书文件(更可靠):若部署环境允许,将CA证书文件放在项目目录(如config/do-ca-cert.pem),直接读取文件内容可避免环境变量转义问题:
import fs from 'fs';

export default ({ env }) => ({
    connection: {
        client: 'postgres',
        connection: {
            host: env('DATABASE_HOST'),
            port: env.int('DATABASE_PORT'),
            database: env('DATABASE_NAME'),
            user: env('DATABASE_USERNAME'),
            password: env('DATABASE_PASSWORD'),
            ssl: {
                rejectUnauthorized: true,
                ca: fs.readFileSync('./config/do-ca-cert.pem', 'utf8')
            },
        },
        debug: false,
    },
});

注意:需确保证书文件路径正确,且部署环境中该文件具备可读权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 15:53:11