
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 -y3、目录初始化# 数据持久化目录 mkdir -p /data/pg2-data # SSL证书存放目录 mkdir -p /data/pg2-ssl # 授权目录权限 chmod 700 /data/pg2-ssl4、生成全套SSL CA证书生产加密证书进入证书目录生成根证书、服务端证书、私钥规避CN主机名校验报错服务端CN绑定数据库IP10.1.1.196cd /data/pg2-ssl # 1.生成CA根证书 root.crt root.key openssl req -new -x509 -days 3650 -nodes -text -out root.crt -keyout root.key -subj /CNpg-root-ca # 2.生成服务端证书请求文件 openssl req -new -nodes -text -out server.csr -keyout server.key -subj /CN10.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/*.crt5、启动PostgreSQL容器关键SSL启动参数注入核心优化不修改postgresql.conf全部ssl配置通过启动参数注入彻底解决配置文件换行、特殊字符启动崩溃问题docker run -d \ --name postgres-ssl \ --restart always \ --nethost \ -v /data/pg2-data:/var/lib/postgresql/data \ -v /data/pg2-ssl:/var/lib/postgresql/ssl \ -e POSTGRES_USERpostgres \ -e POSTGRES_PASSWORDpostgres \ -e POSTGRES_DBpostgres \ postgres:10.15 \ -c sslon \ -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_cipherson6、配置强制SSL访问规则拦截明文连接6.1 写入pg_hba.conf访问控制规则规则释义仅允许本地免密登录所有远程IP仅放行SSL加密连接彻底禁止明文TCP连接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 EOF6.2 修复配置文件权限重载生效# 修改为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运行参数docker exec -it postgres-ssl psql -U postgres -c show ssl;show ssl_ca_file;show ssl_cert_file;7.2 带证书SSL连接自测验证加密通道docker exec -it postgres-ssl psql -U postgres host127.0.0.1 dbnamepostgres sslmodeverify-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 明文连接拦截验证核心验收docker exec -it postgres-ssl psql -U postgres -h 127.0.0.1 sslmodedisable预期报错代表明文彻底封禁部署达标psql: FATAL: no pg_hba.conf entry for host 127.0.0.1, user postgres, database postgres, SSL off8.1 客户端前置准备从服务器拉取CA根证书/data/pg2-ssl/root.crt本地保存私钥、服务端证书无需下发客户端8.2 命令行psql连接psql host10.1.1.196 port5432 dbnamepostgres userpostgres passwordpostgres sslmodeverify-ca sslrootcert本地root.crt路径8.3 DBeaver可视化连接规避协议报错最优方案禁止手动拼接JDBC URL极易协议报错使用原生可视化配置新建连接 → PostgreSQL填写IP10.1.1.196:5432顶部标签向右滑动打开SSL标签页勾选 Use SSLCA证书选择本地root.crtSSL模式选择verify-ca填写账号密码直接测试连接8.4 开发JDBC连接串Windows路径使用正斜杠规避转义报错jdbc:postgresql://10.1.1.196:5432/postgres?ssltruesslmodeverify-casslrootcertD:/a_tencent_jiance/pgtest/root.crtsslprotocolTLSv1.29、全局配置说明安全解释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执行授权命令chown 999:999 /data/pg2-ssl/* chmod 600 /data/pg2-ssl/*.key11、环境回滚方案如需临时关闭强制SSL远程加密修改pg_hba重载配置即可无需重建容器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参数为onCA证书加载成功明文sslmodedisable连接直接拦截报错携带root.crt证书SSL连接握手成功TLS1.2加密无修改postgresql.conf零启动崩溃风险备注如果开始的时候证书没有写上IP更改证书操作步骤 1重新生成服务端证书核心CN 必须写数据库 IP登录服务器进入证书目录cd /data/pg2-ssl # 1. 重新生成服务端请求CN固定为 10.1.1.196数据库访问IP openssl req -new -nodes -text -out server.csr -keyout server.key -subj /CN10.1.1.196 # 2. 使用原有root.crt根证书签发新服务端证书 openssl x509 -req -in server.csr -days 3650 -CA root.crt -CAkey root.key -CAcreateserial -out server.crt # 3. 修复容器读取权限postgres用户UID999 chown 999:999 /data/pg2-ssl/* chmod 600 /data/pg2-ssl/*.key chmod 644 /data/pg2-ssl/*.crt步骤 2重启 PostgreSQL 容器加载新证书docker restart postgres-ssl