PostgreSQL 开启 SSL 加密连接需要在服务端修改配置文件并重启实例,同时客户端连接字符串需指定 sslmode 参数。该措施适用于数据库与应用跨网络部署或使用公共云环境的场景,开启过程中会导致数据库实例重启,需确保业务具备重连机制。
先说结论:PostgreSQL 默认以明文传输数据,开启 SSL 是防止中间人攻击和数据窃听的核心措施,但会增加 CPU 负荷且需要重启服务。
- 先判断:确认数据库实例版本为 PostgreSQL 10 及以上,云数据库实例需确认控制台支持 SSL 开关。
- 优先做:生成或获取 SSL 证书与私钥,修改 postgresql.conf 启用 ssl 参数,配置 pg_hba.conf 强制 SSL 连接。
- 再验证:通过 pg_stat_ssl 系统视图确认连接加密状态,客户端连接串添加 sslmode=require 测试连通性。
命令速用版
使用 OpenSSL 生成自签名证书和服务端密钥,适用于测试环境或内部网络:
openssl req -newkey rsa:2048 -nodes -keyout server.key -x509 -days 365 -out server.crt将生成的 server.crt 和 server.key 文件放置于 PostgreSQL 数据目录,并在配置文件中指定路径。
为什么会这样
PostgreSQL 默认通信协议不加密,敏感信息在网络传输中容易被截获。
SSL/TLS 协议在传输层对网络连接进行加密,能够提升通信数据的安全性和完整性,但会同时增加网络连接响应时间。SSL 仅加密传输中的数据,不加密存储数据,需配合透明数据加密 TDE 或文件系统加密保护静态数据。开启 SSL 加密后,所有网络流量包括 SQL 查询和结果都会被加密,防止数据在传输过程中被截取、篡改或窃听。
分步处理
1. 准备证书文件:生成自签名证书或从受信任的证书颁发机构获取证书,确保私钥文件权限设置为 600,防止未授权访问。
2. 修改服务端配置:在 postgresql.conf 文件中设置 ssl = on,指定 ssl_cert_file 和 ssl_key_file 路径,可选配置 ssl_ca_file 用于验证客户端证书。
3. 配置访问控制:在 pg_hba.conf 中将 host 记录修改为 hostssl,强制特定网段或用户必须使用 SSL 连接,非 SSL 连接设置为 reject。
4. 重启数据库实例:配置修改后需要重启 PostgreSQL 服务以加载 SSL 证书,云数据库实例在控制台开启 SSL 功能时会自动重启。
5. 客户端连接配置:应用程序连接字符串中添加 sslmode 参数,根据安全需求选择 require、verify-ca 或 verify-full 模式。
怎么验证是否生效
登录数据库执行查询语句 SELECT * FROM pg_stat_ssl WHERE pid = pg_backend_pid();,若返回结果中 ssl 字段为 t,则表示当前连接已加密。
客户端连接时使用 psql 命令添加 sslmode=require 参数,若未配置证书或 SSL 未开启则连接失败。云数据库实例可在控制台数据安全页查看 SSL 状态为已开启,并下载 SSL CA 证书验证有效期。
常见坑
1. 私钥权限错误:server.key 文件权限必须为 600 且属主为 postgres 用户,否则服务端拒绝启动。
2. 实例重启影响:开启 SSL 过程中会重启数据库实例,需确保业务具备重连机制,避免连接中断导致业务失败。
3. 只读实例配置:若需要对只读实例开启 SSL 连接加密,建议对只读组内的所有只读实例开启,否则可能因保护地址为只读组 VIP 导致部分请求失败。
4. 证书有效期管理:自签名证书需关注有效期,过期会导致连接失败,云数据库下载的 SSL CA 证书有效期通常为 20 年。
常见问题
开启 SSL 会对性能有多大影响?
开启 SSL 会增加一些 CPU 负荷,具体损耗取决于加密算法和数据吞吐量,公开资料中没有看到可靠的量化数据。
PostgreSQL 哪些版本支持 SSL?
适用于 PostgreSQL 10 及以上版本,云数据库实例版本通常要求 PostgreSQL 11 及以上版本。
自签名证书和 CA 证书有什么区别?
自签名证书适用于测试环境,CA 证书由受信任机构签发适用于生产环境,verify-full 模式推荐配合公共 CA 使用。
参考来源
- PostgreSQL:如何配置数据库的传输层加密 (SSL 加密连接)
- 设置 SSL 加密 - 云数据库 PostgreSQL
- PostgreSQL - 数据库安全:加密、审计与防注入
- PostgreSQL 连接安全设置
- PostgreSQL SSL 安全连接配置指南 - jl1771 - 博客园
- 在 PostgreSQL 中如何实现数据的加密传输?
- 开启 SSL 加密 - 数据库与缓存关系型数据库 PostgreSQL