SSL的验证流程
利用openssl环境自制证书
CA 证书签发
创建私钥ca.key,使用des3算法,有效期2048天
openssl genrsa -des3 -out ca.key 2048
生成根CA证书请求(.csr)
openssl req -new -key ca.key -out ca.csr -subj "/C=CN/ST=GuangDong/L=GuangZhou/O=example/OU=GZYFZX/CN=example"
自签名得到公钥根证书(.crt)
openssl x509 -req -days 2048 -in ca.csr -signkey ca.key -out ca.crt
服务器证书签发
生成服务器私钥
openssl genrsa -des3 -out server.key 2048
生成服务端证书签名请求
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=GuangDong/L=GuangZhou/O=example/OU=GZYFZX/CN=PGServer"
使用ca根证书对服务器证书签名生成公钥
openssl x509 -req -days 2048 -sha256 -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt
客户端证书
生成客户端私钥
openssl genrsa -des3 -out postgresql.key 2048
生成客户端证书签名请求
openssl req -new -key postgresql.key -out postgresql.csr -subj "/C=CN/ST=GuangDong/L=GuangZhou/O=example/OU=GZYFZX/CN=PGClient"
使用ca根证书对客户端证书签名生成公钥
openssl x509 -req -days 2048 -sha256 -CA ca.crt -CAkey ca.key -CAcreateserial -in postgresql.csr -out postgresql.crt
pg配置postgresql.conf修改
直接 cp ca.crt root.crt 使用ca的就可以。
我们一般会配置ssl、ssl_cert_file、ssl_key_file这三个,其他的一般维持默认值。这是三个参数分别的含义如下:
ssl: 是否支持SSL连接。默认是关闭的。
ssl_cert_file:指定包含SSL服务器证书的文件的名称。默认是server.crt。相对路径相对于数据目录。
ssl_key_file:指定包含SSL服务器私钥的文件的名称。默认是server.key。相对路径相对于数据目录。
ssl = on
ssl_ca_file = 'root.crt'
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
将ssl设置为on,即表示打开ssl。SSL打开后,此时服务器将侦听同一TCP端口上的正常连接和SSL连接,并与任何连接客户机协商是否使用SSL。
注意:
(1)要在SSL模式下启动,必须包含服务器证书和私钥的文件。默认情况下,这些文件将被命名为server.crt和server.key。但是可以使用配置参数ssl_cert_file和ssl_key_file指定其他名称和位置。
(2)配置了SSL=on,并不代表会确保所有客户端总是通过SSL连接, 它只是表示允许使用SSL。如果想要确保所有连接都是用ssl, 还需要结合pg_hba.conf进行配置。比如添加类似“hostssl all all 0.0.0.0/0 md5 \n hostnossl all all 0.0.0.0/0 reject” 这样的配置。