证书生成
#!/bin/sh
数据目录=$1
如果[-z\’$DATADIR\’];
echo \’您必须输入数据目录\’
1号出口
菲
echo \’将SSL 配置设置为${DATADIR}\’
cd $数据目录
# 为CA创建私钥(-aes256选项需要密钥保护私钥,但如果不需要保护可以删除)
openssl genrsa -aes256 -out rootCA.key 2048
# 生成自签名CA证书
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.crt -subj \’/C=CN/ST=山东/L=济南/O=MyCompany/OU=IT部/CN=MyCompany.example.com”
# 生成服务器私钥(-aes256选项需要密钥保护私钥,但如果不需要保护可以将其删除)
openssl genrsa -aes256 -out server.key 2048
# 创建服务器证书请求(/CN=127.0.0.1 /CN值必须匹配服务器IP或域名,否则完整验证配置连接将失败)
openssl req -new -keyserver.key -outserver.csr -subj \’/C=CN/ST=山东/L=济南/O=MyCompany/OU=IT部/CN=127.0.0.1\’
openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 365 -sha256
# 生成客户端私钥(-aes256选项需要密钥保护私钥,但如果不需要保护可以删除)
openssl genrsa -aes256 -out client.key 2048
# 创建客户端证书请求(/CN=user1 /CN值必须与客户端用户名匹配,否则会因clientcert=verify-full配置而失败)
openssl req -new -key client.key -out client.csr -subj \’/C=CN/ST=山东/L=济南/O=MyCompany/OU=IT部/CN=user1\’
openssl x509 -req -in client.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out client.crt -days 365 -sha256
chmod 600 服务器.crt
chmod 600 服务器密钥
chmod 600 rootCA.crt
# 请单独保存
chmod 600 rootCA.key
chmod 600 客户端.crt
chmod 600 客户端密钥
#更改postgresql.conf文件
sed -i \’s/^#ssl=.*$/ssl=on/g\’ postgresql.conf
sed -i \’s/^#ssl_ca_file=.*$/ssl_ca_file=\’\\\’\’rootCA.crt\’\\\’\’/g\’ postgresql.conf
sed -i \’s/^#ssl_key_file=.*$/ssl_key_file=\’\\\’\’server.key\’\\\’\’/g\’ postgresql.conf
sed -i \’s/^#ssl_cert_file=.*$/ssl_cert_file=\’\\\’\’server.crt\’\\\’\’/g\’ postgresql.conf
# ssl_passphrase_command 选项需要私钥保护密码。如果您在生成上述私钥时没有保护密码,则可以跳过此步骤。如果您有保护密钥,则需要在此处将123456 更改为您的实际密码。
sed -i \’s/^#ssl_passphrase_command=.*$/ssl_passphrase_command=\’\\\’\’echo -n 123456\’\\\’\’/g\’ postgresql.conf
# 已吊销的证书列表。将所有未使用的已吊销客户端证书保存到这两个参数指定的文件或文件夹中。
#ssl_crl_file=\’\’
#ssl_crl_dir=\’\’
mkdir -p ~/.postgresql
mv client.crt ~/.postgresql/postgresql.crt
mv client.key ~/.postgresql/postgresql.key
cp rootCA.crt ~/.postgresql/root.crt
# 已吊销的证书列表。所有已撤销和未使用的服务器证书都存储在此文件中。
# ~/.postgresql/root.crl
1、上面的脚本需要一个参数来指定postgresql数据库数据目录。该脚本进入数据目录,生成证书,并更改postgresql.conf中与SSL相关的参数设置。
2、上面的脚本首先会生成一个自签名的根证书,然后该根证书会分别颁发服务器证书和客户端证书。运行此脚本时,您将需要重复输入密码以保护根证书的私钥。服务器证书、客户端证书和密码保护,从脚本中的私钥生成命令openssl genrsa -aes256 中删除-aes256 并删除ssl_passphrase_command 设置。否则,请更改默认密码。将123456 从ssl_passphrase_command 更改为您的实际密码。
3、生成证书后,脚本将客户端证书复制到默认指定目录:~/.postgresql/。如果客户端在其他设备上运行,请手动将客户端证书复制到指定设备上的指定目录。客户端证书存储在其他路径中。在使用psql 连接之前,请设置环境变量PGSSLCERT、PGSSLKEY 和PGSSLROOTCERT 以分别指定客户端证书、密钥和根证书文件。
使用上述脚本生成证书后,您可以使用pg_hba.conf 文件中的hostssl 设置使用SSL 进行连接。成功的SSL 连接如下所示:
[postgres@localhost bin]$ ./psql -U user1 -h 127.0.0.1 -p 5432 -d postgres
请输入PEM 密码:
用户user1: 的密码
请输入PEM 密码:
psql (14.7)
SSL 连接(协议: TLSv1.3,密码: TLS_AES_256_GCM_SHA384,位: 256,压缩: 关闭)
键入help 以获得帮助。
postgres=
verify-full配置
verify-full 是要求最高的SSL 配置。
服务器使用verify-full 配置如下:
Hostssl postgres user1 127.0.0.1/32 md5 clientcert=verify-full
Hostssl postgres user2 127.0.0.1/32 md5 clientcert=verify-full
clientcert=verify-full 要求客户端提供证书。服务器不仅检查证书是否合法(由服务器的根证书颁发且未被吊销),还检查客户端的CN 值。如果证书与用户名相同,则检查将失败并且连接将被断开。如果CN值不匹配,则更改证书中生成客户端证书时指定的CN值,并重新运行脚本生成新证书。
客户端使用verify-full 配置如下:
客户端可以使用PGSSLMODE 配置模式来验证完整。
导出PGSSLMODE=验证完整
PGSSLMODE=verify-full 要求连接的服务器的IP 或域名与服务器证书的CN 值匹配。否则,服务器将不受信任并且连接将失败。要更改服务器证书的CN 值,请更改服务器证书生成脚本中的CN 值并重新生成脚本。
PGSSLMODE解析
禁用:
不使用SSL 连接。
数据在传输过程中未加密,可能存在安全风险。
适合本地开发或可信网络环境。
授予许可:
不要尝试使用SSL 进行连接。但是,如果您的服务器需要SSL,请创建加密连接。
如果您的服务器支持SSL,您的数据在传输过程中会被加密。
如果需要,您可以启用SSL,但即使服务器不支持SSL,您也可以进行连接。
更喜欢:
将尝试SSL 连接,但如果服务器不支持SSL,则将建立未加密的连接。
如果您的服务器支持SSL,您的数据在传输过程中会被加密。
与“允许”类似,但优先考虑SSL。
我需要:
需要SSL 连接。
如果服务器不支持SSL,连接将会失败。
为了确保您的数据安全,数据在传输过程中会被加密。
验证-ca:
需要SSL 连接并验证服务器的SSL 证书。
如果服务器的SSL 证书无效,连接将失败。
数据在传输过程中进行加密,并验证服务器的身份。
完整验证:
需要SSL 连接并验证服务器的SSL 证书和主机名。
如果服务器的SSL 证书无效或主机名不匹配,连接将失败。
数据在传输过程中是加密的,需要严格验证服务器身份。
注意:如果未配置PGSSLMODE,则首选默认值。也就是说,如果客户端(psql、libpq.so)支持SSL,如果服务器不支持SSL,或者配置为hostnossl,则会首先尝试使用SSL连接。在pg_hba.conf中,服务器发送错误并断开连接,但客户端自动使用非SSL模式重试连接。
以上#PostgreSQL学习生成和配置SSL证书的相关内容摘自网络,仅供参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92253.html