官网
参考
openssl创建证书
PostgreSQL支持使用SSL连接加密客户端/服务器通信,以提高安全性。这要求在客户端和服务器系统上都安装OpenSSL,并且在构建时启用PostgreSQL中的ssl支持(使用源码安装时的--with-openssl参数)。
首先为了使ssl工作起来,服务端首先需要配置三个参数:
ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
上面提到服务端需要配置三个参数,ssl、ssl_cert_file、ssl_key_file 我们看下其分别代表什么?
ssl: 支持SSL连接。默认是关闭的。这个参数只能在服务器启动时设置。SSL通信只能通过TCP/IP连接进行。
ssl_cert_file:指定包含SSL服务器证书的文件的名称。默认是server.crt。相对路径相对于数据目录。
此参数只能在服务器启动时设置。
ssl_key_file:指定包含SSL服务器私钥的文件的名称。默认是server.key。相对路径相对于数据目录。
此参数只能在服务器启动时设置
要在SSL模式下启动,必须存在包含服务器证书和私钥的文件。默认情况下,这些文件将被命名为server.crt和server.key。但是可以使用配置参数ssl_cert_file和ssl_key_file指定其他名称和位置。
在linux系统中,server.key必须禁止其他用户的访问权限。我们需要通过chown命令将server.key的访问权限设置成600。
SSL打开后,此时服务器将侦听同一TCP端口上的正常连接和SSL连接,并与任何连接客户机协商是否使用SSL。
另外pgsql的客户机身份验证由一个配置文件控制,该配置文件通常名为pg_hba.conf,存储在数据库的数据目录中。(HBA代表基于主机的身份验证。),当initdb初始化数据目录时,将安装一个默认的pg_hba.conf文件。pg_hba.conf文件的一般格式是一组记录,每行一个。其中每个记录指定连接类型、客户机IP地址范围(连接类型相关)、数据库名、用户名和用于匹配这些参数的连接的身份验证方法。具有匹配的连接类型、客户端地址、请求的数据库和用户名的第一条记录用于执行身份验证。不存在“穿透”或“备份”, 如果选择了一条记录,身份验证失败,则不考虑后续记录。如果没有记录匹配,则拒绝访问。
pg_hba.conf与ssl相关的配置有两个。
hostssl: 此记录匹配使用TCP/IP进行的连接尝试,但仅在使用SSL加密进行连接时才匹配。要使用此选项,必
须使用SSL支持构建服务器。此外,必须通过设置SSL配置参数在服务器启动时启用SSL。
hostnossl:此记录类型具有与hostssl相反的行为;它只匹配不使用SSL的TCP/IP上的连接尝试。
使用使用host的话优先使用ssl认证,hostssl表示强制使用ssl, hostnossl 强制不使用ssl。
那么看下怎么创建ssl_cert_file和ssl_key_file文件呢?
默认情况下PostgreSQL 读取openssl的配置文件openssl.cnf, 在openssl version -d返回的目录中。
#openssl version -d OPENSSLDIR: "/etc/pki/tls"
目前不使用第三方权威机构的CA来认证,自己充当CA的角色。也即自签名证书。虽然可以使用自签名证书进行测试,但是应该在生产环境中使用由证书颁发机构(CA)(通常是企业范围的根CA)签名的证书。
创建服务端证书和私钥文件:
openssl req -new -x509 -days 365 -nodes -text -out server.crt -keyout server.key -subj "/CN=dbhost.yourdomain.com"
将文件拷贝的数据目录$PGDATA,为其chown权限,修改postgresql.conf文件,最后重启数据库。
服务端ssl配置好之后,使用客户端连接数据库会有ssl 提示信息。语句:
create extension sslinfo;
select ssl_is_used();
select ssl_ciper();
select ssl_version();