选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.0 已于 2015 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

17.8. 使用 SSL 的安全 TCP/IP 连接 #

PostgreSQL原生支持使用SSL连接来加密客户端与服务器之间的通信,以提高安全性。这要求客户端和服务器系统上都安装了OpenSSL,并且在构建PostgreSQL时启用了该支持(见第 15 章)。

如果构建时启用了 SSL 支持,那么在 postgresql.conf 中将参数 ssl 设为 on,就可以在启动 PostgreSQL 服务器时启用 SSL。服务器会在同一个 TCP 端口上同时监听普通连接和 SSL 连接,并与每个连接进来的客户端协商是否使用 SSL。默认情况下,这由客户端决定;关于如何把服务器配置为要求某些或全部连接必须使用 SSL,请参阅 第 19.1 节

PostgreSQL会读取系统范围的OpenSSL配置文件。默认情况下,该文件名为openssl.cnf,位于openssl version -d报告的目录中。可以通过把环境变量OPENSSL_CONF设为所需配置文件的名称,覆盖这一默认值。

OpenSSL支持种类繁多、强度不一的密码套件和认证算法。虽然可以在OpenSSL配置文件中指定密码套件列表,但你也可以通过修改postgresql.conf中的ssl_ciphers,专门为数据库服务器指定要使用的密码套件。

注意

使用NULL-SHANULL-MD5密码套件,可以在没有加密开销的情况下完成认证。不过,中间人仍然能够读取并转发客户端与服务器之间的通信。此外,与认证的开销相比,加密开销本身很小。基于这些原因,不建议使用 NULL 密码套件。

要以SSL模式启动,服务器数据目录中必须存在文件server.crtserver.key。这两个文件应分别包含服务器证书和私钥。在 Unix 系统上,server.key的权限必须禁止任何组或全局访问;这可以通过命令chmod 0600 server.key实现。如果私钥受口令保护,服务器将提示输入该口令,输入之前不会启动。

在某些情况下,服务器证书可能由一个中间证书颁发机构签名,而不是由客户端直接信任的机构签名。要使用这样的证书,请把签名机构的证书追加到server.crt文件中,然后是其上级机构的证书,依此类推,直到客户端信任的机构。只要server.crt包含多个证书,就应包含根证书。

17.8.1. Using client certificates #

要要求客户端提供受信任的证书,请把你信任的证书颁发机构(CA)的证书放在数据目录中的root.crt文件里,并把pg_hba.conf中相应hostssl行上的clientcert参数设置为1。此后,在 SSL 连接启动时会向客户端请求证书。(关于如何在客户端设置证书,见第 31.17 节。)服务器将验证客户端的证书是否由某个受信任的证书颁发机构签名。如果文件root.crl存在,还将检查证书吊销列表(CRL)条目。 (SSL 证书用法的图示见http://h71000.www7.hp.com/doc/83final/ba554_90007/ch04s02.html。)

pg_hba.conf中的clientcert选项可用于所有认证方法,但只适用于指定为hostssl的行。当未指定clientcert或将其设置为0时,如果root.crt文件存在,服务器仍会根据它验证出示的客户端证书——但不会坚持要求客户端出示证书。

注意,root.crt列出的是被认为可为客户端证书签名、受信任的顶层 CA。原则上它不必列出为服务器证书签名的 CA,尽管在大多数情况下该 CA 也会为客户端证书所信任。

如果正在设置客户端证书,可以考虑使用 cert 认证方法,让证书在提供连接安全性的同时也控制用户认证。详情参见 第 19.3.9 节

17.8.2. SSL 服务器文件用法 #

文件server.keyserver.crtroot.crtroot.crl只在服务器启动时检查;因此更改它们后必须重启服务器才能生效。

表 17.3. SSL 服务器文件用法

文件 内容 效果
server.crt 服务器证书 发送给客户端以表明服务器的身份
server.key 服务器私钥 证明服务器证书由其所有者发送;并不表明证书所有者可信
root.crt 受信任的证书颁发机构 检查客户端证书是否由受信任的证书颁发机构签名
root.crl 被证书颁发机构吊销的证书 客户端证书不能出现在此列表中

17.8.3. Creating a Self-Signed Certificate #

要为服务器快速创建一个自签名证书,可以使用下面的OpenSSL命令:

openssl req -new -text -out server.req

请填写openssl要求的信息。确保把本地主机名输入为Common Name;挑战密码可以留空。该程序会生成一个带口令保护的密钥;它不接受少于四个字符的口令。要移除口令(如果希望服务器自动启动就必须这样做),请运行命令:

openssl rsa -in privkey.pem -out server.key
rm privkey.pem

输入旧口令以解锁现有密钥。接着执行:

openssl req -x509 -in server.req -text -key server.key -out server.crt

把证书转换为自签名证书,并把密钥和证书复制到服务器将会查找它们的位置。最后执行:

chmod og-rwx server.key

因为如果文件的权限比这更宽松,服务器将拒绝该文件。关于如何创建服务器私钥和证书的更多细节,请参阅OpenSSL文档。

自签名证书可用于测试,但在生产环境中应使用由证书颁发机构(CA)(全局CA之一或本地 CA)签名的证书,以便客户端能验证服务器的身份。如果所有客户端都在组织内部,建议使用本地CA

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。