Docker部署PostgreSQL10 开启SSL和证书安装文档

1、文档说明

1.1 环境信息

  • 服务器地址:10.1.1.196

  • 系统版本:CentOS7

  • 数据库版本:PostgreSQL 10.15

  • 部署方式:Docker容器部署

  • 核心安全要求:远程所有TCP连接强制SSL加密+CA根证书校验,禁止明文连接;本地容器socket免密登录

1.2 最终生效能力

  1. 远程客户端需要开启SSL + 携带合法root.crt根证书连接

  2. 规避postgresql.conf配置换行乱码、启动崩溃问题,全部SSL参数通过容器启动命令注入

  3. TLS1.2加密协议,高强度加密套件

2、前置依赖

  • Docker已安装

  • 服务器防火墙放行5432端口

  • 安装openssl,用于生成SSL证书:yum install openssl -y

3、目录初始化

bash 复制代码
# 数据持久化目录
mkdir -p /data/pg2-data
# SSL证书存放目录
mkdir -p /data/pg2-ssl
# 授权目录权限
chmod 700 /data/pg2-ssl

4、生成全套SSL CA证书(生产加密证书)

进入证书目录,生成根证书、服务端证书、私钥;规避CN主机名校验报错,服务端CN绑定数据库IP:10.1.1.196

bash 复制代码
cd /data/pg2-ssl

# 1.生成CA根证书 root.crt + root.key
openssl req -new -x509 -days 3650 -nodes -text -out root.crt -keyout root.key -subj "/CN=pg-root-ca"

# 2.生成服务端证书请求文件
openssl req -new -nodes -text -out server.csr -keyout server.key -subj "/CN=10.1.1.196"

# 3.CA签发服务端证书
openssl x509 -req -in server.csr -days 3650 -CA root.crt -CAkey root.key -CAcreateserial -out server.crt

# 4.关键权限修复:PG要求私钥权限600,属主999(postgres运行用户)
chown 999:999 /data/pg2-ssl/*
chmod 600 /data/pg2-ssl/*.key
chmod 644 /data/pg2-ssl/*.crt

5、启动PostgreSQL容器(关键:SSL启动参数注入)

核心优化:不修改postgresql.conf,全部ssl配置通过启动参数注入,彻底解决配置文件换行、特殊字符启动崩溃问题

bash 复制代码
docker run -d \
--name postgres-ssl \
--restart always \
--net=host \
-v /data/pg2-data:/var/lib/postgresql/data \
-v /data/pg2-ssl:/var/lib/postgresql/ssl \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=postgres \
-e POSTGRES_DB=postgres \
postgres:10.15 \
-c ssl=on \
-c ssl_cert_file=/var/lib/postgresql/ssl/server.crt \
-c ssl_key_file=/var/lib/postgresql/ssl/server.key \
-c ssl_ca_file=/var/lib/postgresql/ssl/root.crt \
-c ssl_prefer_server_ciphers=on

6、配置强制SSL访问规则(拦截明文连接)

6.1 写入pg_hba.conf访问控制规则

规则释义:仅允许本地免密登录;所有远程IP仅放行SSL加密连接,彻底禁止明文TCP连接

bash 复制代码
cat > /data/pg2-data/pg_hba.conf <<EOF
local   all             all                                     trust
hostssl all             all             0.0.0.0/0            md5
hostssl all             all             ::/0                 md5
EOF

6.2 修复配置文件权限+重载生效

bash 复制代码
# 修改为postgres运行用户权限
chown 999:999 /data/pg2-data/pg_hba.conf

# 重载数据库权限配置,无需重启容器
docker exec postgres-ssl psql -U postgres -c "SELECT pg_reload_conf();"

查询证书

docker exec -it postgres-ssl psql -U postgres -c "show ssl; show ssl_ca_file;"

7、服务端有效性校验(必做,验收部署)

7.1 查看数据库SSL运行参数

bash 复制代码
docker exec -it postgres-ssl psql -U postgres -c "show ssl;show ssl_ca_file;show ssl_cert_file;"

7.2 带证书SSL连接自测(验证加密通道)

bash 复制代码
docker exec -it postgres-ssl psql -U postgres "host=127.0.0.1 dbname=postgres sslmode=verify-ca sslrootcert=/var/lib/postgresql/ssl/root.crt"

正常输出:SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)

7.3 明文连接拦截验证(核心验收)

bash 复制代码
docker exec -it postgres-ssl psql -U postgres -h 127.0.0.1 "sslmode=disable"

预期报错,代表明文彻底封禁,部署达标:

psql: FATAL: no pg_hba.conf entry for host "127.0.0.1", user "postgres", database "postgres", SSL off

8.1 客户端前置准备

从服务器拉取CA根证书:/data/pg2-ssl/root.crt,本地保存,私钥、服务端证书无需下发客户端

8.2 命令行psql连接

bash 复制代码
psql "host=10.1.1.196 port=5432 dbname=postgres user=postgres password=postgres sslmode=verify-ca sslrootcert=本地root.crt路径"

8.3 DBeaver可视化连接(规避协议报错最优方案)

禁止手动拼接JDBC URL(极易协议报错),使用原生可视化配置:

  1. 新建连接 → PostgreSQL,填写IP:10.1.1.196:5432

  2. 顶部标签向右滑动,打开 SSL 标签页

  3. 勾选 Use SSL;CA证书选择本地root.crt

  4. SSL模式选择:verify-ca;

  5. 填写账号密码,直接测试连接

8.4 开发JDBC连接串

Windows路径使用正斜杠,规避转义报错

bash 复制代码
jdbc:postgresql://10.1.1.196:5432/postgres?ssl=true&sslmode=verify-ca&sslrootcert=D:/a_tencent_jiance/pgtest/root.crt&sslprotocol=TLSv1.2

9、全局配置说明&安全解释

9.1 pg_hba.conf规则详解

  • local:容器内部本地socket登录,免密放行,用于运维排查

  • hostssl:仅放行SSL加密TCP连接,无任何明文host规则,远程强制加密

  • 全网0.0.0.0/0放行,适配内网所有业务服务器

9.2 两种SSL校验模式区别

  • verify-full:校验CA合法 + 证书CN与数据库IP完全一致,最高安全,公网生产首选

  • verify-ca:仅校验CA证书合法性,忽略主机名,适配内网DBeaver连接,规避JDBC主机名校验报错

9.3 规避历史故障方案

  • 禁止手动修改postgresql.conf写入ssl配置:规避换行符、斜杠语法崩溃

  • 证书私钥强制600权限:规避postgres无权读取证书启动失败

  • 固定TLSv1.2协议:规避新旧客户端TLS算法不兼容、Protocol error握手报错

10、常见故障排错

10.1 明文连接报错:no pg_hba.conf entry SSL off

正常现象,代表强制SSL规则生效,非故障

10.2 DBeaver提示Protocol error. Session setup failed

  • 不要拼接JDBC URL,改用DBeaver原生SSL可视化面板配置

  • Windows证书路径统一使用 正斜杠 /,规避转义字符报错

  • 更新Postgres JDBC驱动至42.2.x稳定版本

10.3 容器启动读取证书失败

原因:证书属主不是999,执行授权命令:

bash 复制代码
chown 999:999 /data/pg2-ssl/*
chmod 600 /data/pg2-ssl/*.key

11、环境回滚方案

如需临时关闭强制SSL远程加密,修改pg_hba,重载配置即可,无需重建容器

bash 复制代码
cat > /data/pg2-data/pg_hba.conf <<EOF
local   all             all                                     trust
host    all             all             0.0.0.0/0            md5
EOF
docker exec postgres-ssl psql -U postgres -c "SELECT pg_reload_conf();"

12、部署验收标准(全部满足即为上线达标)

  1. 容器正常启动,无SSL日志报错

  2. 数据库show ssl参数为on,CA证书加载成功

  3. 明文sslmode=disable连接直接拦截报错

  4. 携带root.crt证书SSL连接,握手成功,TLS1.2加密

  5. 无修改postgresql.conf,零启动崩溃风险

相关推荐
bukeyiwanshui2 小时前
20260626 k8sControllers介绍
云原生·容器·kubernetes
EnCi Zheng3 小时前
N3A-一个端口只能给一个程序使用吗?[特殊字符]
网络·nginx·docker
能有时光3 小时前
] K8s 核心组件使用指南
云原生·容器·kubernetes
云烟成雨TD4 小时前
Kubernetes 系列【13】控制器:可视化操作 Deployment
云原生·容器·kubernetes
承渊政道4 小时前
OneNav书签导航实操:极空间Docker部署、分类整理与公网访问
运维·docker·内网穿透·cpolar·nas·onenav·轻量级部署
weixin_545019324 小时前
Nginx 配置SSL实现HTTPS访问
nginx·https·ssl
oioihoii5 小时前
CentOS运行Teemii实操:Docker Compose部署、漫画导入与公网阅读
linux·docker·centos
AAA@峥20 小时前
容器数据不丢失:Docker 分层存储 + Volume 共享、备份迁移完整指南
运维·docker·容器
十年磨一剑~21 小时前
docker 为何每次 docker tag才能 docker push
docker·容器·eureka