16.7. 用 SSL 进行安全的 TCP/IP 联接

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

当编译了SSL进去以后,可以通过设置 postgresql.conf 里的参数 sslon 来打开 PostgreSQL 服务器的SSL支持。 当开始SSL模式后, 服务器将在数据目录里查找 server.key 文件和 server.crt 文件,必须分别包含服务器私钥和证书。 在打开SSL的服务器运行之前必须先正确的设置这些文件。 如果私钥用一个口令保护,那么服务器将提示输入口令,并且在口令成功校验之前不会启动。

服务器将在同一个 TCP 端口上同时监听标准的和SSL的联接, 并且将与任何正在联接的客户端进行协商,协商是否使用SSL。 缺省时,这是根据客户端的选项而定的。 参阅 Section 20.1 获取如何强制服务器端只使用SSL进行某些或者全部联接的信息。

有关创建你的服务器私钥和证书的细节信息,你们可以参考 OpenSSL 的文档。 你可以用一个自认证的证书进行测试, 但是在生产环境中应该使用一个由认证中心(CA) (全球的 CA或者区域的CA都可以)签发的证书, 这样客户端才能够识别服务器的身份。 要创建一份自认证的证书,可以使用下面的OpenSSL命令

openssl req -new -text -out server.req

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

openssl rsa -in privkey.pem -out server.keyrm privkey.pem

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

openssl req -x509 -in server.req -text -key server.key -out server.crtchmod og-rwx server.key

把证书变成自签名的证书,然后把秘钥和证书拷贝到服务器寻找它们的地方。

如果需要验证客户端的证书,那么在数据目录的 root.crt 里放置你想校验的 CA 的证书。 如果出现这个证书,那么在 SSL 连接启动的时候就会要求客户端提供客户端的证书, 并且这个证书必须是已经由 root.crt 里面出现的认证之一签发的。

如果没有 root.crt 文件,那么就不需要检查客户端认证。 这个模式下,SSL 提供通讯安全但不保证认证。

文件 server.keyserver.crt,和 root.crt 只是在服务器启动的时候检查;如果你修改了他们,那么必须重启服务器才能生效。