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

