概念描述
SSL可以防止信息在传输过程中被窃听和篡改,openssl就是目前比较流行、成熟的ssl密码库工具。
SSL在远程连接的时候就不再需要输入密码。
配置过程
一、准备
查看系统是否安装openssl
# rpm -qa |grep openssl-devel
openssl-devel-1.0.2k-19.0.1.el7.x86_64
查看postgresql软件编译安装时是否带“–with-openssl”参数
$ pg_config | grep ssl
CONFIGURE = '--prefix=/usr/local/pg12.9' '--with-openssl'
LIBS = -lpgcommon -lpgport -lpthread -lssl -lcrypto -lz -lreadline -lrt -lcrypt -ldl -lm
-- 在数据库中也能查到:
postgres=# show ssl_library;
ssl_library
-------------
OpenSSL
(1 row)
二、配置ssl单向认证
只要服务端创建证书和私钥即可。
1.配置生成证书和私钥文件
mkdir ~/openssl_crw # 创建存放文件夹
cd ~/openssl_crw
openssl req -new -x509 -days 365 -nodes -text -subj '/CN=postgres' -out server.crt -keyout server.key ## 生成证书和私钥文件
chmod 600 ~/openssl/server.key ## 必须设置,否则重启pg会报错
2.修改postgresql.conf配置文件
$ cat postgresql.conf | grep ssl |grep -v "#"
ssl = on
ssl_cert_file = '/home/pg12/openssl_crw/server.crt'
ssl_key_file = '/home/pg12/openssl_crw/server.key'
# 修改完成后,重启pg
3.验证远程登入时使用ssl连接
4.查看当前会话是否使用ssl连接
postgres=# create extension sslinfo; ## 需要先创建此扩展ssl信息,否则select ssl_is_used();无法执行成功。
CREATE EXTENSION
postgres=# select ssl_is_used();
ssl_is_used
-------------
t
(1 row)
## 注意:如果是本地连接,则显示结果为“f”,因为本地连接不会使用ssl。
5.远程登入时可以手动指定需要ssl连接
$ psql 'host=localhost user=pg12 dbname=postgres password=1qaz@WSX sslmode=require' ##当然不加ssl参数,也是默认会使用ssl连接
psql (12.9)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
postgres=# select ssl_is_used();
ssl_is_used
-------------
t
(1 row)
三、ssl双向认证
服务端、客户端都要创建私钥、证书、根证书。
1.服务器端
1.1.生成服务器端的私钥:
$ mkdir ~/openssl_shuangxiang_server
$ cd ~/openssl_shuangxiang_server
$ openssl genrsa -des3 -out server.key 2048
Generating RSA private key, 2048 bit long modulus
........................................+++
.............+++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
$ openssl rsa -in server.key -out server.key ## 去掉上面这个证书的密码保护功能
Enter pass phrase for server.key:
writing RSA key
$ chmod 400 server.key
1.2.生成服务器端的证书 和 根证书
$ openssl req -new -key server.key -days 365 -out server.crt -x509 -subj '/C=CN/ST=Fujian/L=Fuzhou/O=enmo/CN=crw/emailAddress=crw@enmo.com'
--由于没有公证机构提供,只能使用自签名证书,因此可以将服务器证书作为根证书。
$ cp server.crt root.crt
1.3.修改postgresql.conf配置文件
$ cat postgresql.conf | grep ssl |grep -v "#"
ssl = on
ssl_ca_file = '/home/pg12/openssl_shuangxiang_server/root.crt'
ssl_cert_file = '/home/pg12/openssl_shuangxiang_server/server.crt'
ssl_key_file = '/home/pg12/openssl_shuangxiang_server/server.key'
1.4.修改pg_hba.conf配置文件
注意,需要注释掉原有的。修改完成后,重启pg。
2.客户端(可以在服务端生成后拷贝到客户端侧)
##如果客户端没有相关ssl的配置,远程登入时会报错。
$ psql -U pg12 -d postgres -h 192.168.129.133 -p 5666
2023-06-01 11:50:13.242 CST [6940] FATAL: connection requires a valid client certificate
2023-06-01 11:50:13.245 CST [6941] FATAL: no pg_hba.conf entry for host "192.168.129.133", user "pg12", database "postgres", SSL off
psql: error: FATAL: connection requires a valid client certificate
FATAL: no pg_hba.conf entry for host "192.168.129.133", user "pg12", database "postgres", SSL off
2.1.生成客户端的私钥
$ mkdir ~/openssl_shuangxiang_client
$ cd ~/openssl_shuangxiang_client
$ openssl genrsa -des3 -out postgresql.key 2048
Generating RSA private key, 2048 bit long modulus
........................................+++
.............+++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
$ openssl rsa -in postgresql.key -out postgresql.key ## 去掉上面这个证书的密码保护功能
Enter pass phrase for server.key:
writing RSA key
$ chmod 400 postgresql.key
2.2.生成客户端的证书postgresql.csr 和 根证书postgresql.crt
$ openssl req -new -key postgresql.key -out postgresql.csr -subj '/C=CN/ST=Fujian/L=Fuzhou/O=enmo_client/CN=pg12/emailAddress=crw@enmo.com' # CN必须是数据库的用户名
$ openssl x509 -req -in postgresql.csr -CA /home/pg12/openssl_shuangxiang_server/root.crt -CAkey /home/pg12/openssl_shuangxiang_server/server.key -out postgresql.crt -CAcreateserial
Signature ok
subject=/C=CN/ST=Fujian/L=Fuzhou/O=enmo_client/CN=pg12/emailAddress=crw@enmo.com
Getting CA Private Key
2.3.复制客户端证书到当前用户的.postgresql目录下
$ mkdir ~/.postgresql
$ cp /home/pg12/openssl_shuangxiang_client/* ~/.postgresql
[pg12@localhost openssl_shuangxiang_client]$ ll ~/.postgresql
total 12
-rw-rw-r-- 1 pg12 pg12 1216 Jun 1 12:19 postgresql.crt
-rw-rw-r-- 1 pg12 pg12 1017 Jun 1 12:19 postgresql.csr
-r-------- 1 pg12 pg12 1675 Jun 1 12:19 postgresql.key
2.4.远程登入验证测试:
[pg12@localhost openssl_shuangxiang_client]$ psql -U pg12 -d postgres -h 192.168.129.133
psql (12.9)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
注意,也可以指定环境变量,删除~/.postgresql,再如下export PGSSLCERT=/xx/postgresql.crt;export PGSSLKEY=/xx/postgresql.key
注意,也可以远程登入时手动指定,删除~/.postgresql,重新登入session使环境变量失效,最后登入如下:
psql postgresql://pg12@192.168.129.133:5666/postgres?ssl=true\&sslrootcert=/home/pg12/openssl_shuangxiang/root.crt\&sslkey=/home/pg12/openssl_shuangxiang_client/postgresql.key\&sslcert=/home/pg12/openssl_shuangxiang_client/postgresql.crt
# pg12是pg系统用户
在window端使用工具连接时如Navicat,需要指定三个文件,如下:
如上就是postgresql上配置ssl的全部内容。