国密TLCP传输
TLCP传输
UDB-TX支持国密传输层密码协议(TLCP),采用 SM 系列密码算法和数字证书等密码技术保障传输层的机密性、完整性、身份认证和抗攻击。
协议采用的主要是 SM2/SM3/SM4
算法,不同于 TLS 采用的国际密码算法;
采用的是 SM2 双证书体系(签名证书和加密证书)。
SSL/TLS 单证书逻辑如下
签名时:用户A(简称A)使用自己的私钥加密信息的摘要,即签名操作;用户 B(简称 B)使用 A 的公钥进行解密,对比该摘要是否正确,若正确,则 B 就确定了 A 的身份,即验签成功。
加密时:A 用 B 的公钥将信息加密传递给 B,B 使用自己的私钥解密,进而获得信息。
TLCP 双证书:
签名时:签名证书仅仅用来验证身份使用,其公钥和私钥均由 A 自己产生,并且由自己保管,CA 不负责其保管任务。
加密时:加密证书在传递加密数据时使用,其私钥和公钥由 CA 产生,并由CA 保管(存根)。
UDB-TX支持的国密加密套件:ECDHE-SM4-SM3
、ECDHE-SM4-GCM-SM3
、ECC-SM4-SM3
和ECC-SM4-GCM-SM3
四种。
国密证书的生成
国密SSL使用客户端和服务器双向认证、各自使用签名和加密双证书,传输协议为TLCP。需要按照如下步骤手动生成数字证书文件:
mkdir -p ./out
生成自签名CA证书
生成根私钥
./openssl ecparam -genkey -name SM2 -out ./out/CA.key
生成根证书请求文件
./openssl req -config ./openssl.cnf -new -subj /C=CN/ST=GD/L=SZ/O=UNVDB/OU=OG/CN=CA -key ./out/CA.key -out ./out/CA.csr
# 其中-subj参数中的各个字段含义如下,可根据实际情况填写
# C: Country Name,本例取值为CN
# ST: State or Province Name,本例取值为GD
# L: Locality Nam,上面的例子中为SZ
# O: Organization Name (eg, company),本例取值为UNVDB
# OU: Organizational Unit Name(eg, section),本例取值为OG
# CN: Common Name (eg, YOUR name) ,可随意取值,本例取值为FooCA
生成自签名证书
./openssl x509 -sm3 -req -days 1500 -in ./out/CA.csr -extfile ./openssl.cnf -extensions v3_ca -signkey ./out/CA.key -out ./out/cacert.pem
# 其中-days参数指定证书的有效天数,本例取值1500
生成服务器签名证书-私钥对
生成服务器签名私钥
./openssl ecparam -genkey -name SM2 -out ./out/server.key
生成服务器签名证书请求文件
./openssl req -config ./openssl.cnf -new --subj /C=CN/ST=GD/L=SZ/O=UNVDB/OU=OG/CN=server -key ./out/server.key -out ./out/server.csr
#其中-subj参数除CN(Common Name)外需要与CA请求中保持一致
生成由根证书签名的服务器证书
./openssl x509 -sm3 -req -days 1500 -in ./out/server.csr -CA ./out/cacert.pem -CAkey ./out/CA.key -extfile ./openssl.cnf -extensions v3_req -out ./out/server.crt -CAcreateserial
#其中-days参数指定证书的有效天数,本例取值1500
生成服务器加密证书-私钥对
生成服务器加密私钥
./openssl ecparam -genkey -name SM2 -out ./out/server_enc.key
生成服务器加密证书请求文件
./openssl req -config ./openssl.cnf -new -subj /C=CN/ST=GD/L=SZ/O=UNVDB/OU=OG/CN=server -key ./out/server_enc.key -out ./out/server_enc.csr
#其中-subj参数除CN(Common Name)外需要与CA请求中保持一致
生成由根证书签名的服务器证书
./openssl x509 -sm3 -req -days 1500 -in ./out/server_enc.csr -CA ./out/cacert.pem -CAkey ./out/CA.key -extfile ./openssl.cnf -extensions v3enc_req -out ./out/server_enc.crt -CAcreateserial
生成客户端签名证书-私钥对
生成客户端签名私钥
./openssl ecparam -genkey -name SM2 -out ./out/client.key
生成客户端签名证书请求文件
./openssl req -config ./openssl.cnf -new --subj /C=CN/ST=GD/L=SZ/O=UNVDB/OU=OG/CN=client -key ./out/client.key -out ./out/client.csr
# 其中-subj参数除CN(Common Name)外需要与CA请求中保持一致
生成由根证书签名的客户端证书
./openssl x509 -sm3 -req -days 1500 -in ./out/client.csr -CA ./out/cacert.pem -CAkey ./out/CA.key -extfile ./openssl.cnf -extensions v3_req -out ./out/client.crt -CAcreateserial
# 其中-days参数指定证书的有效天数,本例取值1500
生成客户端加密证书-私钥对
生成客户端加密私钥
./openssl ecparam -genkey -name SM2 -out ./out/client_enc.key
生成客户端加密证书请求文件
./openssl req -config ./openssl.cnf -new -subj /C=CN/ST=GD/L=SZ/O=UNVDB/OU=OG/CN=client -key ./out/client_enc.key -out ./out/client_enc.csr
# 其中-subj参数除CN(Common Name)外需要与CA请求中保持一致
生成由根证书加密的客户端证书
./openssl x509 -sm3 -req -days 1500 -in ./out/client_enc.csr -CA ./out/cacert.pem -CAkey ./out/CA.key -extfile ./openssl.cnf -extensions v3enc_req -out ./out/client_enc.crt -CAcreateserial
或者使用UDB-TX提供的gen.sh脚本一键生成证书文件,并自动安装到指定的目录。
服务器端参数配置
#在unvdbsvr.conf 配置文件中,修改下面这些参数来支持国密SSL。
ssl = on
ssl_use_tlcp = on
ssl_ca_file = 'cacert.pem'
#ssl_crl_file = ''
#ssl_crl_dir = ''
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_enc_cert_file = 'server_enc.crt'
ssl_enc_key_file = 'server_enc.key'
ssl_ciphers = 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-SM4-SM3:ECDHE-SM4-GCM-SM3:' # allowed SSL ciphers, support GMSSL
ssl_ecdh_curve = 'SM2' #support GMSSL
ud_sql参数配置
ud_sql客户端使用如下命令启用国密SSL连接数据库:
ud_sql "host=127.0.0.1 port=5678 dbname=unvdb user=unvdb ssltlcp=1 sslrootcert=./cacert.pem sslcert=./client.crt sslkey=./client.key sslenccert=./client_enc.crt sslenckey=./client_enc.key"
如果证书文件存放在默认的~/.unvdb目录,则可省略证书文件的路径,例如:
ud_sql "host=127.0.0.1 port=5678 dbname=unvdb user=unvdb ssltlcp=1"
或者
ud_sql " ssltlcp=1"
libpq编程连接串
在基于libpq库的数据库的驱动连接时,连接串需要包含ssltlcp、sslrootcert、sslcert、sslkey、sslenccert和sslenckey参数。