©
This document uses PHP Chinese website manual Release
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-SHA或NULL-MD5可能有身份验证开销而没有加密开销。 不过,中间人能够读取和通过客户端和服务器的通信。此外,加密开销相比身份认证的开销是最小的。 有这些原因建议不使用NULL加密。
要SSL模式中启动服务器,server.crt和server.key必须存在服务器的数据目录里. 这些文件应分别包含服务器证书和私钥。在Unix系统,server.key的权限禁止任何world或group访问; 通过命令chmod0600server.key来做。如果私钥受密码保护,服务器将会提示输入密码,将会等到输入后启动。
在有些情况下,服务器证书可能由一个"中间"认证授权签名,而不是直接由受信任的客户端。 若要使用这样的证书,请追加授权签名证书到theserver.crt文件,然后其父颁发机构的证书, 等到一个可信任的客户端的"根"授权。server.crt包含多个证书,在任何情况下应包括根证书。
需要客户端提供受信任的证书,证书颁发机构的地方证书(CAs) 你信任的在数据目录下的root.crt文件,并且在pg_hba.conf相应hostssl行, 设置参数clientcert为1。 然后将在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获取详细信息。
server.key,server.crt, root.crt,和root.crl这些文件仅在服务器启动时检查; 所以你改变它们必须重启服务器生效。
Table 17-3. 使用SSL服务器文件
File | Contents | Effect |
---|---|---|
server.crt | 服务器证书 | 发送到客户端标识服务器的身份 |
server.key | 服务器私钥 | 证明是发送服务器证书的所有者,并不表示证书所有者是可信的 |
root.crt | 受信任的颁发机构证书 | 检查该客户端证书由受信任的证书颁发机构签署 |
root.crl | 由证书颁发机构吊销的证书 | 客户端证书不能在此列表中 |
创建自签名的证书,可以使用下面的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。