17.8. 用SSL进行安全的TCP/IP连接

PostgreSQL有一个内建的通过SSL进行加密的客户端/服务器端的通讯, 这样可以增加安全性。这个特性要求在客户端和服务器端都安装OpenSSL 并且在编译PostgreSQL的时候打开(参阅Chapter 15)。

当编译了SSL进去以后,可以通过将postgresql.conf中的 ssl设置为on打开PostgreSQL服务器的SSL支持。 服务器在同一个TCP端口监听通常和SSL的连接,将判断客户端连接是否使用SSL。 缺省,这是在客户端的选项;参阅Section 19.1关于如何设置服务器要求部分或全部连接使用SSL

PostgreSQL读取系统范围的OpenSSL配置文件。缺省,这文件名为openssl.cnf opensslversion-d报告所在的目录。通过设置环境变量OPENSSL_CONF指定你想要的配置文件名可以覆盖此缺省配置。

OpenSSL支持多种不同强度的加密和认证算法。 而在OpenSSL配置文件可以指定一个密码列表, 你可以通过在postgresql.conf中修改ssl_ciphers, 指定数据库服务器使用的专用密码。

Note: 使用NULL-SHANULL-MD5可能有身份验证开销而没有加密开销。 不过,中间人能够读取和通过客户端和服务器的通信。此外,加密开销相比身份认证的开销是最小的。 有这些原因建议不使用NULL加密。

SSL模式中启动服务器,server.crtserver.key必须存在服务器的数据目录里. 这些文件应分别包含服务器证书和私钥。在Unix系统,server.key的权限禁止任何world或group访问; 通过命令chmod0600server.key来做。如果私钥受密码保护,服务器将会提示输入密码,将会等到输入后启动。

在有些情况下,服务器证书可能由一个"中间"认证授权签名,而不是直接由受信任的客户端。 若要使用这样的证书,请追加授权签名证书到theserver.crt文件,然后其父颁发机构的证书, 等到一个可信任的客户端的"根"授权。server.crt包含多个证书,在任何情况下应包括根证书。

17.8.1. 使用客户端证书

需要客户端提供受信任的证书,证书颁发机构的地方证书(CAs) 你信任的在数据目录下的root.crt文件,并且在pg_hba.conf相应hostssl行, 设置参数clientcert1。 然后将在SSL连接启动时从客户端请求该证书。(见Section 31.17描述了如何设置客户端证书。) 服务器将验证客户端的证书是由受信任的证书颁发机构之一签名。证书撤销清单(CRL)如果存在root.crl 文件,也要检查。 (见http://h71000.www7.hp.com/DOC/83final/BA554_90007/ch04s02.html图表显示SSL证书的使用。)

pg_hba.conf文件中clientcert选项对于所有的认证方法都可用,但仅适用hostssl指定的行。 当clientcert没有指定或设置为0,如果存在root.crt仍然阻止客户端证书, 但它不会坚持提交客户端证书。

请注意root.crt列出顶级的客户端证书,认为是受信任的客户端证书签名。 原则上不需要列出服务器签名的客户端证书,然而在大多数情况下,这些证书也是受信任的客户端证书。

如果你设置客户端证书,你可能希望用cert认证方法,因此使证书控制用户身份验证,以及提供连接安全。参阅Section 19.3.9获取详细信息。

17.8.2. 使用SSL服务器文件

server.keyserver.crtroot.crt,和root.crl这些文件仅在服务器启动时检查; 所以你改变它们必须重启服务器生效。

Table 17-3. 使用SSL服务器文件

FileContentsEffect
server.crt服务器证书发送到客户端标识服务器的身份
server.key服务器私钥 证明是发送服务器证书的所有者,并不表示证书所有者是可信的
root.crt受信任的颁发机构证书检查该客户端证书由受信任的证书颁发机构签署
root.crl由证书颁发机构吊销的证书客户端证书不能在此列表中

17.8.3. 创建自签名的证书

创建自签名的证书,可以使用下面的OpenSSL命令:

opensslreq-new-text-outserver.req

填充那些openssl向你询问的信息。 确保把本地主机名当做"CommonName"输入;挑战密码可以留空。 该程序将生成一把用口令保护的密钥。小于四字符的 口令保护是不被接受的。要移去密钥(如果你想自动启动服务 器就得这样),运行下面的命令:

opensslrsa-inprivkey.pem-outserver.key
rmprivkey.pem

输入旧口令把现有密钥解锁。然后:

opensslreq-x509-inserver.req-text-keyserver.key-outserver.crt

要将一个证书变成自签名证书的,并将复制它们的密钥和证书到服务器能找到的地方。最后执行操作:

chmodog-rwxserver.key

因为,服务器将拒绝该文件,如果其权限是比这更多自由。更多关于怎样创建你的服务器私钥和证书, 请参考OpenSSL文档。

自签名的证书可以用于测试,但证书是应使用由证书颁发机构签署(CA)(要么是全局CAs中的一个或者一个本地的) 产生的,因此客户端可以验证服务器的身份。如果如果所有客户都是本地组织的,建议使用本地CA