1、文档说明
1.1 环境信息
-
服务器地址:10.1.1.196
-
系统版本:CentOS7
-
数据库版本:PostgreSQL 10.15
-
部署方式:Docker容器部署
-
核心安全要求:远程所有TCP连接强制SSL加密+CA根证书校验,禁止明文连接;本地容器socket免密登录
1.2 最终生效能力
-
远程客户端需要开启SSL + 携带合法root.crt根证书连接
-
规避postgresql.conf配置换行乱码、启动崩溃问题,全部SSL参数通过容器启动命令注入
-
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(极易协议报错),使用原生可视化配置:
-
新建连接 → PostgreSQL,填写IP:10.1.1.196:5432
-
顶部标签向右滑动,打开 SSL 标签页
-
勾选 Use SSL;CA证书选择本地root.crt
-
SSL模式选择:verify-ca;
-
填写账号密码,直接测试连接


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、部署验收标准(全部满足即为上线达标)
-
容器正常启动,无SSL日志报错
-
数据库show ssl参数为on,CA证书加载成功
-
明文sslmode=disable连接直接拦截报错
-
携带root.crt证书SSL连接,握手成功,TLS1.2加密
-
无修改postgresql.conf,零启动崩溃风险




