国密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-SM3ECDHE-SM4-GCM-SM3ECC-SM4-SM3ECC-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参数。