PostgreSQL 原生支持利用基于 OpenSSL 驱动的 TLS 协议对客户端与服务端之间的网络通信实施全局强加密传输,防止会话流量在链路上被窃听篡改。
在配置文件 postgresql.conf 中将参数 ssl 设置为 on 即可激活服务端 TLS 监听:
ssl = on ssl_cert_file = 'server.crt' ssl_key_file = 'server.key'
服务端私钥文件 server.key 的权限在 Unix 系统上必须严格限制为仅宿主属主可读(权限位必须设为 0600 或 0640),否则服务将拒绝启动。
在客户端认证配置文件 pg_hba.conf 中,将连接类型声明为 hostssl 可强制要求连接必须走加密通道,直接拒绝对明文连接的响应。
除了账号口令之外,还可以配置双向证书认证(Mutual TLS,mTLS)。通过配置 ssl_ca_file 并在 pg_hba.conf 中声明 clientcert=verify-full,服务端在握手时会强制校验客户端提供的数字证书,并要求证书的主题通用名称(Common Name,CN)必须与登录用户名相符,实现军事级安全的无密码客户端认证。
可以通过 ssl_min_protocol_version 和 ssl_ciphers 强制要求客户端使用 TLSv1.3 以及高安全强度的密码套件。
服务端 SSL 证书(server.crt)与私钥(server.key)存放于数据目录中,私钥文件权限必须严格设为 0600。
Table 18.2. SSL 证书与密钥文件用途
| 文件名 | 用途 |
|---|---|
server.crt | 服务端数字证书链 |
server.key | 服务端私钥文件(权限 0600) |
root.crt | 受信任的客户端根 CA 证书 |
在开发与测试环境中,可以使用 openssl 工具快速生成自签名证书与密钥:
openssl req -new -x509 -days 365 -nodes -text -out server.crt \ -keyout server.key -subj "/CN=db.example.com" chmod 0600 server.key