前言
因数据加密传输的要求,应用连接postgres也要配置ssl连接加密,从而防止数据泄露或被篡改。
启用ssl连接有利于加强数据安全性,但也会增加连接通信的成本。对于企业级应用,当然还是以安全性为首位。
本文使用的postgres版本为15.3
配置步骤
- 企业内一般用权威CA机构签发的证书,本地开发测试的话,还是自签名证书方便点。注意如果使用自签名证书的话,根证书的私钥文件最好不要泄露。
# 生成根证书
openssl req -new -nodes -text -out ca.csr -keyout ca.key -subj "/CN=pg1.rainux.int"
openssl x509 -req -in ca.csr -text -days 3650 -extfile /etc/ssl/openssl.cnf -extensions v3_ca -signkey ca.key -out ca.crt
# 生成服务器端证书
openssl req -new -x509 -days 365 -nodes -text -out server.crt -keyout server.key -subj "/CN=pg1.rainux.int"
openssl req -new -nodes -text -out server.csr -keyout server.key -subj "/CN=pg1.rainux.int"
openssl x509 -req -in server.csr -text -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
- 编辑postgresql.conf来启用ssl连接。三个证书和私钥文件可以放到数据目录,和
postgresql.conf
在一个层级。或者放到其它目录,配置改为绝对路径。
ssl = on
ssl_ca_file = 'ca.crt'
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
- 编辑pg_hba.conf,允许远程客户端的ssl请求
# 原先为 host all all all scram-sha-256
# 单向验证
hostssl all all all scram-sha-256
# 双向验证客户端的ca证书和客户端证书
hostssl all all all scram-sha-256 clientcert=verify-ca
# 双向验证客户端的ca证书及客户端证书,并要求证书中的CN部分与用户名或其它映射机制相匹配
hostssl all all all scram-sha-256 clientcert=verify-full
- 重启postgres
- psql客户端连接,连接参数中指定使用ssl
# 方式1: 要求建立ssl连接
psql 'host=127.0.0.1 port=5432 dbname=postgres user=postgres sslmode=require'
# 方式2: 要求验证ca证书
psql 'host=127.0.0.1 port=5432 dbname=postgres user=postgres sslmode=verify-ca sslrootcert=ca.crt'
# 方式3: 要求验证客户端证书
## 生成客户端证书
openssl req -new -x509 -days 365 -nodes -text -out client.crt -keyout client.key -subj "/CN=pg1.rainux.int"
openssl req -new -nodes -text -out client.csr -keyout client.key -subj "/CN=pg1.rainux.int"
openssl x509 -req -in client.csr -text -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt
## 使用客户端证书连接
psql 'host=127.0.0.1 port=5432 dbname=postgres user=postgres sslmode=verify-ca sslrootcert=ca.crt sslkey=client.key sslcert=client.crt'