用SSL进行安全的TCP/IP连接
背景信息
openGauss支持SSL标准协议(TLS 1.2),SSL协议是安全性更高的协议标准,它们加入了数字签名和数字证书来实现客户端和服务器的双向身份验证,保证了通信双方更加安全的数据传输。
openGauss支持TLCP协议,TLCP采用国密算法进行身份认证和安全传输,它采用SM2双证书体系,分别用于签名认证和传输数据的加密。
前提条件
从CA认证中心申请到正式的服务器、客户端的证书和密钥。(假设服务器的私钥为server.key,证书为server.crt,客户端的私钥为client.key,证书为client.crt,CA根证书名称为cacert.pem。)
对于TLCP连接,需要配置双证书。(假设服务器用于签名认证的证书私钥对为server.crt、server.key,用于数据加密传输的证书私钥对为server_enc.crt、server_enc.key ;客户端用于签名验签的证书私钥对为client.crt,client.key,用于数据加密传输的证书私钥对为 client_enc.crt,client_enc.key; CA根证书名称为cacert.pem。)
注意事项
- 当用户远程连接到数据库主节点时,需要使用sha256的认证方式。
- 当内部服务器之间连接时,需要使用trust的认证方式,支持IP白名单认证。
操作步骤
openGauss在数据库部署完成后,默认已开启SSL认证模式。服务器端证书,私钥以及根证书已经默认配置完成。用户需要配置客户端的相关参数。
配置SSL认证相关的数字证书参数,具体要求请参见表1。
-
配置客户端参数。
已从CA认证中心申请到客户端默认证书,私钥,根证书以及私钥密码加密文件。假设证书、私钥和根证书都放在“/home/omm”目录。
双向认证需配置如下参数:
export PGSSLCERT="/home/omm/client.crt"
export PGSSLKEY="/home/omm/client.key"
export PGSSLMODE="verify-ca"
export PGSSLROOTCERT="/home/omm/cacert.pem"
TCLP连接需要额外配置如下参数:
expprt PGSSLTLCP=1
export PGSSLENCCERT="/home/omm/client_enc.crt"
export PGSSLENCKEY="/home/omm/client_enc.key"
单向认证需要配置如下参数:
export PGSSLMODE="verify-ca"
export PGSSLROOTCERT="/home/omm/cacert.pem"
-
修改客户端密钥的权限。
客户端根证书,密钥,证书以及密钥密码加密文件的权限,需保证权限为600。如果权限不满足要求,则客户端无法以SSL连接到openGauss。
chmod 600 client.key
chmod 600 client.crt
chmod 600 client.key.cipher
chmod 600 client.key.rand
chmod 600 client_enc.key
chmod 600 client_enc.crt
chmod 600 client_enc.key.cipher
chmod 600 client_enc.key.rand
chmod 600 cacert.pem
须知:
从安全性考虑,建议使用双向认证方式。
配置客户端环境变量,必须包含文件的绝对路径。
表 1 认证方式
认证方式
|
含义
|
配置客户端环境变量
|
维护建议
|
双向认证-TLS(推荐)
|
客户端验证服务器证书的有效性,同时服务器端也要验证客户端证书的有效性,只有认证成功,连接才能建立。
|
设置如下环境变量:
- PGSSLCERT
- PGSSLKEY
- PGSSLROOTCERT
- PGSSLMODE
|
该方式应用于安全性要求较高的场景。使用此方式时,建议设置客户端的PGSSLMODE变量为verify-ca。确保了网络数据的安全性。
|
双向认证-TLCP(推荐)
|
客户端验证服务器证书的有效性,同时服务器端也要验证客户端证书的有效性,只有认证成功,连接才能建立。
|
设置如下环境变量:
- PGSSLTLCP
- PGSSLCERT
- PGSSLKEY
- PGSSLENCCERT
- PGSSENCLKEY
- PGSSLROOTCERT
- PGSSLMODE
|
该方式应用于安全性要求较高的场景。使用此方式时,建议设置客户端的PGSSLMODE变量为verify-ca。确保了网络数据的安全性。
|
单向认证
|
客户端只验证服务器证书的有效性,而服务器端不验证客户端证书的有效性。服务器加载证书信息并发送给客户端,客户端使用根证书来验证服务器端证书的有效性。
|
设置如下环境变量:
|
为防止基于TCP链接的欺骗,建议使用SSL证书认证功能。除配置客户端根证书外,建议客户端使用PGSSLMODE变量为verify-ca方式连接。
|
相关参考
在服务器端的postgresql.conf文件中配置相关参数,详细信息请参见表2。
表 2 服务器参数
参数
|
描述
|
取值范围
|
ssl
|
表示是否启动SSL功能。
|
默认值:off
|
require_ssl
|
设置服务器端是否强制要求SSL连接。该参数只有当参数ssl为on时才有效。
|
- on:服务器端强制要求SSL连接。
- off:服务器端对是否通过SSL连接不作强制要求。
默认值:off
|
ssl_use_tlcp
|
设置是否使用TLCP连接。该参数只有当参数ssl为on时才有效。
|
- on:服务器端启用TLCP连接功能。
- off:服务器端不启用TLCP连接功能,仍使用TLS连接。
默认值:off
|
ssl_cert_file
|
对于TLS连接,该参数指定服务器证书文件,包含服务器端的公钥。服务器证书用以表明服务器身份的合法性,公钥将发送给对端用来对数据进行加密。
对于TLCP连接,该参数指定服务器用于验证签名的证书文件,包含验证签名所用的公钥。公钥将发送给客户端用来对服务器的签名进行验签,用以表明服务器身份的合法性
|
请以实际的证书名为准,其相对路径是相对于数据目录的。
默认值:server.crt
|
ssl_enc_cert_file
|
仅在TLCP连接中生效。
指定服务器加密证书文件,包含服务器端用于加密的公钥。公钥将发送给对端用来对数据进行加密
|
请以实际的证书名为准,其相对路径是相对于数据目录的。
默认值:server_enc.crt
|
ssl_key_file
|
对于TLS连接,该参数指定服务器私钥文件,用以对公钥加密的数据进行解密。
对于TLCP连接,该参数指定服务器的签名私钥文件,包含签名所用的私钥。
|
请以实际的服务器私钥名称为准,其相对路径是相对于数据目录的。
默认值:server.key
|
ssl_enc_key_file
|
仅在TLCP连接中生效。
指定服务器解密私钥文件,用以对公钥加密的数据进行解密。
|
请以实际的服务器私钥名称为准,其相对路径是相对于数据目录的。
默认值:server_enc.key
|
ssl_ca_file
|
CA服务器的根证书。此参数可选择配置,需要验证客户端证书的合法性时才需要配置。
|
请以实际的CA服务器根证书名称为准。
默认值:cacert.pem
|
ssl_crl_file
|
证书吊销列表,如果客户端证书在该列表中,则当前客户端证书被视为无效证书。
|
请以实际的证书吊销列表名称为准。
默认值:空,表示没有吊销列表。
|
ssl_ciphers
|
SSL通讯使用的加密算法。
|
本产品支持的加密算法的详细信息请参见表4,表5。
默认值:ALL,表示允许对端使用产品支持的所有加密算法,但不包含ADH、LOW、EXP、MD5算法。
|
ssl_cert_notify_time
|
SSL服务器证书到期前提醒的天数。
|
请按照需求配置证书过期前提醒天数。
默认值:90
|
在客户端配置SSL认证相关的环境变量,详细信息请参见表3。
说明:
客户端环境变量的路径以“/home/omm”为例,在实际操作中请使用实际路径进行替换。
表 3 客户端参数
环境变量
|
描述
|
取值范围
|
PGSSLTLCP
|
客户端是否使用TLCP连接。
|
取值及含义:
默认值:0
|
PGSSLCERT
|
对于TLS连接,该变量指定客户端证书文件,包含客户端的公钥。客户端证书用以表明客户端身份的合法性,公钥将发送给对端用来对数据进行加密。 对于TLCP连接,该变量指定客户端用于验签的证书文件,包含验证签名所用的公钥。公钥将发送给服务器用来对客户端的签名进行验签,从而验证客户端身份的合法性。
|
必须包含文件的绝对路径,如: export PGSSLCERT='/home/omm/client.crt'
默认值:空
|
PGSSLENCCERT
|
该变量仅在TLCP连接时生效。指定客户端用于加密的证书文件,包含客户端用于加密的公钥。公钥将发送给对端用来对数据进行加密。
|
必须包含文件的绝对路径,如: export PGSSLENCCERT='/home/omm/client_enc.crt'
默认值:空
|
PGSSLKEY
|
对于TLS连接,该变量指定客户端私钥文件,用以对公钥加密的数据进行解密。
对于TLCP连接,该参数指定客户端用于签名的私钥文件,包含签名所用的私钥。
|
必须包含文件的绝对路径,如: export PGSSLKEY='/home/omm/client.key'
默认值:空
|
PGSSLENCKEY
|
该变量仅在TLCP连接时生效。 指定客户端用于解密的私钥文件,用于对公钥加密的数据进行解密。
|
必须包含文件的绝对路径,如: export PGSSLENCKEY='/home/omm/client_enc.key'
默认值:空
|
PGSSLMODE
|
设置是否和服务器进行SSL连接协商,以及指定SSL连接的优先级。
|
取值及含义:
- disable:只尝试非SSL连接。
- allow:首先尝试非SSL连接,如果连接失败,再尝试SSL连接。
- prefer:首先尝试SSL连接,如果连接失败,将尝试非SSL连接。
- require:只尝试SSL连接。如果存在CA文件,则按设置成verify-ca的方式验证。
- verify-ca:只尝试SSL连接,并且验证服务器是否具有由可信任的证书机构签发的证书。
- verify-full:只尝试SSL连接,并且验证服务器是否具有由可信任的证书机构签发的证书,以及验证服务器主机名是否与证书中的一致。
默认值:prefer
|
PGSSLROOTCERT
|
指定为客户端颁发证书的根证书文件,根证书用于验证服务器证书的有效性。
|
必须包含文件的绝对路径,如: export PGSSLROOTCERT='/home/omm/certca.pem'
默认值:空
|
PGSSLCRL
|
指定证书吊销列表文件,用于验证服务器证书是否在废弃证书列表中,如果在,则服务器证书将会被视为无效证书。
|
必须包含文件的绝对路径,如: export PGSSLCRL='/home/omm/sslcrl-file.crl'
默认值:空
|
服务器端参数ssl、require_ssl与客户端参数sslmode配置组合结果如下:
ssl(服务器)
|
sslmode(客户端)
|
require_ssl(服务器)
|
结果
|
on
|
disable
|
on
|
由于服务器端要求使用SSL,但客户端针对该连接禁用了SSL,因此无法建立连接。
|
disable
|
off
|
连接未加密。
|
allow
|
on
|
连接经过加密。
|
allow
|
off
|
连接未加密。
|
prefer
|
on
|
连接经过加密。
|
prefer
|
off
|
连接经过加密。
|
require
|
on
|
连接经过加密。
|
require
|
off
|
连接经过加密。
|
verify-ca
|
on
|
连接经过加密,且验证了服务器证书。
|
verify-ca
|
off
|
连接经过加密,且验证了服务器证书。
|
verify-full
|
on
|
连接经过加密,且验证了服务器证书和主机名。
|
verify-full
|
off
|
连接经过加密,且验证了服务器证书和主机名。
|
off
|
disable
|
on
|
连接未加密。
|
disable
|
off
|
连接未加密。
|
allow
|
on
|
连接未加密。
|
allow
|
off
|
连接未加密。
|
prefer
|
on
|
连接未加密。
|
prefer
|
off
|
连接未加密。
|
require
|
on
|
由于客户端要求使用SSL,但服务器端禁用了SSL,因此无法建立连接。
|
require
|
off
|
由于客户端要求使用SSL,但服务器端禁用了SSL,因此无法建立连接。
|
verify-ca
|
on
|
由于客户端要求使用SSL,但服务器端禁用了SSL,因此无法建立连接。
|
verify-ca
|
off
|
由于客户端要求使用SSL,但服务器端禁用了SSL,因此无法建立连接。
|
verify-full
|
on
|
由于客户端要求使用SSL,但服务器端禁用了SSL,因此无法建立连接。
|
verify-full
|
off
|
由于客户端要求使用SSL,但服务器端禁用了SSL,因此无法建立连接。
|
SSL传输支持一系列不同强度的加密和认证算法。用户可以通过修改postgresql.conf中的ssl\_ciphers参数指定数据库服务器使用的加密算法。
目前本产品TLS连接支持的加密算法如表4所示。
表 4 加密算法套件-TLS
OpenSSL套件名
|
IANA套件名
|
安全程度
|
ECDHE-RSA-AES128-GCM-SHA256
|
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
|
HIGH
|
ECDHE-RSA-AES256-GCM-SHA384
|
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
|
HIGH
|
ECDHE-ECDSA-AES128-GCM-SHA256
|
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
|
HIGH
|
ECDHE-ECDSA-AES256-GCM-SHA384
|
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
|
HIGH
|
DHE-RSA-AES128-GCM-SHA256
|
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
|
HIGH
|
DHE-RSA-AES256-GCM-SHA384
|
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
|
HIGH
|
目前本产品TLCP连接支持的加密算法如表5所示。
表 5 加密算法套件-TLCP
国密套件名
|
安全程度
|
ECDHE-SM4-SM3
|
HIGH
|
ECDHE-SM4-GCM-SM3
|
HIGH
|
ECC-SM4-SM3
|
HIGH
|
ECC-SM4-GCM-SM3
|
HIGH
|
说明:
-
目前只支持表4和表5中的10种加密算法套件。
-
配置参数ssl_ciphers的默认值为ALL,表示支持表4和表5中的所有加密算法。为保持前向兼容保留了DHE算法套件,即DHE-RSA-AES128-GCM-SHA256和DHE-RSA-AES256-GCM-SHA384,根据CVE-2002-20001漏洞披露DHE算法存在一定安全风险,非兼容场景不建议使用,可将ssl_ciphers参数配置为仅支持ECDHE类型算法套件。
-
如需指定以上加密算法套件,可以设置ssl_ciphers为表4中OpenSSL套件名称或表5中的国密套件名称,加密算法套件之间需要使用分号分割,如在postgresql.conf设置:
ssl_ciphers='ECDHE-RSA-AES128-GCM-SHA256;ECDHE-ECDSA-AES128-GCM-SHA256'
服务端参数 ssl_ciphers、ssl_use_tlcp与实际证书生成算法、客户端参数PGSSLTLCP配置需要组合正确才能正常建立ssl连接:
-
ssl_use_tlcp与ssl_ciphers的值需要互相匹配,否则数据库无法启动。即ssl_use_tlcp开启时,ssl_ciphers需要包含国密算法套件,ssl_use_tlcp关闭时,ssl_ciphers需包含TLS相关套件。
-
ssl_use_tlcp 与 实际证书生成算法、客户端参数PGSSLTLCP配置组合结果如下:
服务端ssl_use_tlcp |
证书生成算法 |
客户端参数PGSSLTLCP |
结果 |
on |
sm2 |
1 |
成功建立使用TLCP协议的连接 |
on |
sm2 |
0 |
ssl连接失败 |
on |
非sm2 |
1 |
ssl连接失败 |
on |
非sm2 |
0 |
ssl连接失败 |
off |
sm2 |
1 |
ssl连接失败 |
off |
sm2 |
0 |
ssl连接失败 |
off |
非sm2 |
1 |
ssl连接失败 |
off |
非sm2 |
0 |
成功建立使用TLS协议的连接 |
上表中,默认以下条件:
- 服务器ssl = on
- 客户端sslmode 为verify-ca 或verify-full
- sm2算法生成证书时,服务器默认配置了ssl_cert_file、ssl_enc_cert_file、ssl_key_file、ssl_enc_key_file参数,客户端默认配置了PGSSLCERT、PGSSLENCCERT、PGSSLKEY、PGSSLENCKEY参数;
- 非sm2算法生成证书时,服务器默认配置了ssl_cert_file、ssl_key_file参数,客户端默认配置了PGSSLCERT、PGSSLKEY参数。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库