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

如何部署支持多标识的Postgres容器,解决SSL跨场景连接问题

Postgres自签名SSL证书适配内外连接问题解决

问题场景

云虚拟机(VM)上部署了开启verify-full SSL验证的Postgres Docker容器:

  • 同一主机内的API通过Docker网络,以主机名「postgres」连接数据库,一切正常;
  • 现在需要开放数据库供外部通过VM的IP地址连接,但外部连接因主机名/IP与证书的CN、SAN不符而失败(证书CN为「postgres」)。

同时提问:是否可为同一Postgres实例配置多个CA?


原证书生成步骤

CA根证书:

openssl req  -nodes -new -x509  -keyout server.key -out server.crt -subj '/C=BR/ST=SP/L=SP/O=postgres/CN=postgres'

扩展文件内容:

echo "subjectAltName=DNS:postgres,IP:10.40.2.5" >> extfile.cnf

客户端证书:

openssl genrsa -des3 -out client/postgresql.key 2048
openssl rsa -in client/postgresql.key -out client/postgresql.key
openssl req -new -key client/postgresql.key -out client/postgresql.csr -subj '/C=BR/ST=SP/L=SP/O=postgres/CN=postgres'
openssl x509 -req -in client/postgresql.csr -CA root.crt -CAkey server.key -out client/postgresql.crt -extfile extfile.cnf -CAcreateserial

Postgres配置行:

hostssl all all all cert clientcert=verify-full

问题分析与解决办法

1. 核心问题:服务器根证书未包含VM IP的SAN

你已经在扩展文件里加了VM的IP,但生成**根证书(server.crt)**时没有指定-extfile参数,导致根证书的SAN字段只有CN=postgres,不包含VM IP。外部用IP连接时,Postgres会验证服务器证书的SAN是否匹配连接标识,因此报错。

2. 修正步骤:重新生成带完整SAN的证书

  • 先清理旧证书文件:
    rm server.crt server.key root.crt client/postgresql.*
    
  • 重新生成根证书,这次要指定扩展文件:
    openssl req -nodes -new -x509 -keyout server.key -out server.crt -subj '/C=BR/ST=SP/L=SP/O=postgres/CN=postgres' -extfile extfile.cnf
    
  • 复制根证书到root.crt(如果客户端用这个文件验证):
    cp server.crt root.crt
    
  • 重新生成客户端证书:
    openssl genrsa -des3 -out client/postgresql.key 2048
    openssl rsa -in client/postgresql.key -out client/postgresql.key
    openssl req -new -key client/postgresql.key -out client/postgresql.csr -subj '/C=BR/ST=SP/L=SP/O=postgres/CN=postgres'
    openssl x509 -req -in client/postgresql.csr -CA root.crt -CAkey server.key -out client/postgresql.crt -extfile extfile.cnf -CAcreateserial
    
  • 重启Postgres Docker容器,让新证书生效。

3. 关于多CA配置的问题

Postgres不支持单独配置多个CA文件,但可以把多个CA的根证书内容合并到同一个root.crt文件里,Postgres会信任该文件内所有的CA证书。不过你的场景完全不需要多CA,修正现有证书的SAN就能解决问题。

验证方法

生成新证书后,用以下命令检查服务器证书的SAN字段,确认包含DNS:postgres和IP:10.40.2.5:

openssl x509 -in server.crt -text -noout

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:38:09