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

