PostgreSQL加密连接SSL配置
环境说明
操作系统 | 主机名 | IP | 类型 | 说明 |
---|---|---|---|---|
CentOS Linux release 7.6.1810 (Core) | centos7.6 | 192.168.1.150 | PostgreSQL Server | PostgreSQL 12.17 |
CentOS Linux release 7.6.1810 (Core) | testLinux | 192.168.1.200 | client | psql 13.11 |
Winserver 2012 | 192.168.1.99 | client | navicat |
SSL说明
什么是SSL?
SSL的全名叫做secure socket layer(安全套接字层),最开始是由一家叫网景的互联网公司开发出来,主要是防止信息在互联网上传输的时候不被窃听或者篡改,后来网景公司提交SSL给ISOC组织做标准化,改名为TLS。
什么是openssl?
openssl 是目前最流行的 SSL 密码库工具,其提供了一个通用、健壮、功能完备的工具套件,用以支持SSL/TLS 协议的实现。
SSL双向认证和SSL单向认证的区别?
双向认证 SSL 协议要求服务器和用户双方都有证书。
单向认证 SSL 协议不需要客户拥有CA证书,服务器端不会验证客户证书,以及在协商对称密码方案,对称通话密钥时,服务器发送给客户的是没有加过密的(这并不影响 SSL 过程的安全性)密码方案。
一般Web应用都是采用SSL单向认证的,无需在通讯层对用户身份进行验证,一般都在应用逻辑层来保证用户的合法登入。但如果是企业应用对接,可能会要求对客户端(相对而言)做身份验证。这时就需要做SSL双向认证。
单向认证和双向认证的区别仅在于创建连接阶段,数据的传输均为加密的,因此客户端与PG服务端的连接采取SSL单向认证即可,即仅在PG Server端配置SSL证书。
前提条件:必须使用openssl来编译安装pg,否则后期不能启用ssl加密连接
查看postgresql是否使用openssl选项编译安装,没有则需重新编译:
[postgres@centos7 ~]$ pg_config|grep CONFIGURE|grep ssl
CONFIGURE = '--prefix=/postgresql/pg12' '--with-openssl'
[postgres@centos7 ~]$
在启用了–with-openssl这个编译选项的情况下,ssl_library的参数值是OpenSSL,否则为空。
[postgres@centos7 ~]$ psql -c "select name,setting,unit,context from pg_settings where name ~* 'ssl_library';"
name | setting | unit | context
-------------+---------+------+----------
ssl_library | OpenSSL | | internal
(1 row)
配置单向SSL认证连接
1、为服务器创建一个有效期为365天的简单自签名证书,创建服务端证书和私钥文件:
su - postgres
mkdir ~/openssl
openssl req -new -x509 -days 365 -nodes -text -subj '/CN=postgres' -out ~/openssl/server.crt -keyout ~/openssl/server.key
chmod 600 ~/openssl/server.key
创建过程
[postgres@centos7 ~]$ mkdir ~/openssl
[postgres@centos7 ~]$ openssl req -new -x509 -days 365 -nodes -text -subj '/CN=postgres' -out ~/openssl/server.crt -keyout ~/openssl/server.key
Generating a 2048 bit RSA private key
.............+++
.+++
writing new private key to '/home/postgres/openssl/server.key'
-----
[postgres@centos7 ~]$ chmod 600 ~/openssl/server.key
[postgres@centos7 ~]$ ll openssl/
total 8
-rw-rw-r-- 1 postgres postgres 4058 Nov 11 08:16 server.crt
-rw------- 1 postgres postgres 1704 Nov 11 08:16 server.key
[postgres@centos7 ~]$
2、修改postgreql.conf配置文件
cat >> /postgresql/pgdata/postgresql.conf << "EOF"
ssl = on
ssl_cert_file = '/home/postgres/openssl/server.crt'
ssl_key_file = '/home/postgres/openssl/server.key'
EOF
参数说明
参数 | 说明 |
---|---|
ssl | 支持SSL连接。默认是关闭的。这个参数只能在服务器启动时设置。SSL通信只能通过TCP/IP连接进行。 |
ssl_cert_file | 指定包含SSL服务器证书的文件的名称。默认是server.crt,相对路径相对于数据目录$PGDATA。此参数只能在服务器启动时设置。 |
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。
3、重启数据库,创建sslinfo扩展,验证ssl连接
pg_ctl start
psql -c "create e