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

PostgreSQL Docker容器无法加载SSL证书问题求助

PostgreSQL Docker容器SSL证书加载失败(错误码2147483661)解决方案

问题回顾

尝试在Docker中运行PostgreSQL并启用SSL连接时,先遇到私钥权限问题,修复权限后出现证书加载失败错误:

FATAL: could not load server certificate file "/etc/ssl/postgres.crt": SSL error code 2147483661

使用的证书生成命令:

openssl req -x509 \
        -sha256 -days 356 \
        -nodes \
        -newkey rsa:4096 \
        -subj "/CN=$domain/C=US/L=$location" \
        -keyout $name.key \
        -out $name.crt

docker-compose配置:

version: "3"
services:
  postgres:
    container_name: postgres
    image: postgres:15.2-alpine3.17
    hostname: postgre
    restart: on-failure:3
    networks:
      net:
        ipv4_address: 173.19.0.10
    ports:
      - 5432:5432
    environment:
      - POSTGRES_USER=root
      - POSTGRES_PASSWORD=somepassword
      - POSTGRES_DB=system
      - PGDATA=/var/lib/postgres/data
    command: postgres -c ssl=on -c ssl_cert_file=/etc/ssl/postgres.crt -c ssl_key_file=/etc/ssl/postgres.key
    volumes:
      - /var/data/postgres:/var/lib/postgres/data
      - /etc/config/certs:/etc/ssl

networks:
  net:
    driver: bridge
    ipam:
      config:
        - subnet: 173.19.0.0/24
          gateway: 173.19.0.1

解决方案

1. 修正证书文件的所有权

PostgreSQL容器默认以postgres用户(UID/GID=999)运行,映射的证书文件可能属于主机root用户,导致容器内无读取权限。执行以下命令修改本地证书文件的所有权:

chown 999:999 /etc/config/certs/postgres.key /etc/config/certs/postgres.crt

2. 严格设置证书权限

确保权限符合PostgreSQL的要求:

# 私钥仅允许所有者读写
chmod 600 /etc/config/certs/postgres.key
# 证书允许所有者读写,其他用户只读
chmod 644 /etc/config/certs/postgres.crt

3. 验证证书与私钥的匹配性

错误码2147483661通常意味着证书和私钥不匹配。用以下命令验证两者的模数是否一致:

openssl x509 -noout -modulus -in /etc/config/certs/postgres.crt | openssl md5
openssl rsa -noout -modulus -in /etc/config/certs/postgres.key | openssl md5

如果输出的MD5值不同,说明证书和密钥不匹配,需要重新生成一对证书。

4. 修改Docker卷映射路径

不要直接覆盖容器的/etc/ssl目录(该目录包含系统默认证书),改为映射到自定义目录:
修改docker-compose的volumes和command部分:

services:
  postgres:
    # ... 其他配置不变
    command: postgres -c ssl=on -c ssl_cert_file=/etc/postgresql/certs/postgres.crt -c ssl_key_file=/etc/postgresql/certs/postgres.key
    volumes:
      - /var/data/postgres:/var/lib/postgres/data
      - /etc/config/certs:/etc/postgresql/certs

5. 重新生成证书(如果需要)

确保生成证书时变量正确赋值,比如:

domain="postgres.local"
name="postgres"
location="NewYork"
openssl req -x509 \
        -sha256 -days 365 \
        -nodes \
        -newkey rsa:4096 \
        -subj "/CN=$domain/C=US/L=$location" \
        -keyout $name.key \
        -out $name.crt

生成后将新的证书文件放到/etc/config/certs目录下,再重新启动容器。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:23:18