VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

身份认证与通信加密

功能描述

国密即国家密码局认定的国产密码算法,Vastbase支持SM2,SM3,SM4。密钥长度和分组长度均为128位。

国密算法支持的模块:

  • 证书模块:生成国密证书并支持国密证书验证。

  • 配置项:ssl_ciphers支持配置ssl_ciphers='ECDHE-ECDSA-SM4-CBC-SM3'。说明如下:

    • ECDHE:临时密钥协商协议。
    • ECDSA:用于进行身份认证和数据签名。
    • SM4:中国商用密码算法标准之一,是一种对称密钥分组密码算法,通常用于数据加密。
    • CBC:SM4的工作模式,CBC 模式通过将每个明文块与前一块的密文异或后,再进行加密,以增强抵抗块相关攻击的能力。
    • SM3:中国国家标准的哈希函数,类似于国际上广泛使用的 SHA-256 算法,用于提供消息完整性和校验。

ssl结构体中加解密具体实现函数需要根据ssl_ciphers配置内容将其设置为SM4对称加密,SM3摘要加密。

以上设置完成之后,可以实现通过国密证书相互验证,传输加密使用SM4算法加解密。

前提条件

1、在服务器安装openssl 1.1.1 。

2、配置用户认证方式。

认证方式	              参数
md5               password_encryption_type=0
sha256+md5        password_encryption_type=1
sha256            password_encryption_type=2
sm3               password_encryption_type=3

3、在postgresql.conf文件中配置password_encryption_type,设置参数值为3,并重启数据库使该参数生效。

4、在pg_hba.conf文件中配置认证方式。

#TYPE DATABASE         USER       ADDRESS         METHOD
host     all           all       127.0.0.1/32    sha256 

注意事项

支持openssl 1.1.1版本,1.1.1以下版本不支持。

操作步骤

1、使用初始化数据库用户,搭建CA环境。

(1)创建CA目录cadir并进入。

mkdir cadir
cd cadir

(2)copy配置文件openssl.cnf到当前目录。

cp /etc/pki/tls/openssl.cnf .

(3)开始搭建CA环境。

mkdir demoCA demoCA/newcerts demoCA/private
chmod 777 demoCA/private

(4)创建serial文件,写入01。

echo  01 > demoCA/serial

(5)创建文件index.txt 。

touch demoCA/index.txt

(6)修改openssl.cnf配置文件中配置项CA_default下的dir参数。

dir = ./demoCA
Default_md = sha256

​ 至此CA环境搭建完成。

2、使用root用户生成根私钥(CA私钥)。

(1)执行以下命令:

openssl genrsa -aes256 -out demoCA/private/cakey.pem 2048 

(2)命令执行后根据提示输入两次密码。

3、生成根证书请求文件。

(1)执行以下命令:

openssl req -config openssl.cnf -new -key demoCA/private/cakey.pem -out demoCA/careq.pem 

(2)输入根私钥密码。

(3)以下名称请牢记,生成服务端证书和客户端证书时填写的信息需要与此处的一致。

Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:shanxi
Locality Name (eg, city) []:xian
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Abc
Organizational Unit Name (eg, section) []:hello
--Common Name可以随意命名
Common Name (eg, YOUR name) []:world
--Email可以选择性填写
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

4、生成自签发根证书。

(1)修改openssl.cnf文件,设置basicConstraints=CA:TRUE

vi openssl.cnf

(2)生成CA自签发根证书。

openssl ca -config openssl.cnf -out demoCA/cacert.pem -keyfile demoCA/private/cakey.pem -selfsign -infiles demoCA/careq.pem

(3)执行命令后输入根私钥密码,两处确认输入y。

至此CA根证书自签发完成,根证书demoCA/cacert.pem。

5、生成服务端证书私钥。

(1)生成服务器私钥文件server.key

openssl genrsa -aes256 -out server.key 2048 

(2)自定义输入服务端私钥保护密码。

6、生成服务端证书请求文件server.req。

(1)执行如下命令:

openssl req -config openssl.cnf -new -key server.key -out server.req

(2)填写信息与创建CA时一致。

Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:shanxi
Locality Name (eg, city) []:xian
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Abc
Organizational Unit Name (eg, section) []:hello
--Common Name
Common Name (eg, YOUR name) []:world
Email Address []:
--以下信息可以选择性填写
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

7、生成服务端证书。

(1)修改openssl.cnf文件,设置basicConstraints=CA:FALSE

vi openssl.cnf

(2)修改 demoCA/index.txt.attr中unique_subject为no。

vi demoCA/index.txt.attr 

(3)对生成的服务器证书请求文件进行签发,签发后将生成正式的服务器证书server.crt

openssl ca  -config openssl.cnf -in server.req -out server.crt -days 3650 -md sha256 

(4)输入服务端证书私钥密码,两处确认输入y。

(5)切换至数据库用户使用vb_guc工具对存储密码进行加密保护vb_guc encrypt -M server -K sys_Oracle_1 -D ./。根据提示输入服务端私钥的密码,加密后会生成server.key.cipher,server.key.rand两个私钥密码保护文件。

去掉私钥密码保护方法如下:

  • 去掉服务端私钥的密码保护 openssl rsa -in server.key -out server.key

8、生成客户端证书及私钥。

(1)生成客户端私钥

openssl genrsa -aes256 -out client.key 2048 

输入两次客户端私钥密码。

(2)生成客户端证书请求文件。

openssl req -config openssl.cnf -new -key client.key -out client.req  

(3)根据提示输入信息,Common Name与数据库用户一致,其他内容与步骤3一致。

(4)对生成的客户端证书请求文件进行签发,签发后将生成正式的客户端证书client.crt

openssl ca -config openssl.cnf -in client.req -out client.crt -days 3650 -md sha256

(5)使用vb_guc工具对存储密码进行加密保护vb_guc encrypt -M client -K sys_Oracle_1 -D ./,根据提示输入客户端私钥的密码,加密后会生成client.key.cipher,client.key.rand两个私钥密码保护文件。

  • 将客户端密钥转化为DER格式,方法如下:

openssl pkcs8 -topk8 -outform DER -in client.key -out client.key.pk8 -nocrypt - 去掉客户端私钥密码保护方法如下:

openssl rsa -in client.key -out client.key

9、使用初始化数据库用户进行服务端数据库配置。

(1)拷贝 server.crt、server.key、server.key.cipher、server.key.rand、server.req、cacert.pem、sslcrl-file.crl(如有)拷贝至实例目录下,并修改权限。数据目录以/home/vastbase/data/vastbase为例:

cp cadir/server.* /home/vastbase/data/vastbase/
cp demoCA/cacert.pem  /home/vastbase/data/vastbase/
chown -R vastbase.vastbase /home/vastbase/
 
su - vastbase
cd $PGDATA
chmod 600 server.*
chmod 600 cacert.pem

(2)修改postgresql.conf参数。

ssl = on
require_ssl = on
ssl_cert_file='server.crt'
ssl_key_file='server.key'
ssl_ca_file='cacert.pem'
ssl_ciphers='ECDHE-ECDSA-SM4-CBC-SM3'
  • ssl:表示是否启动SSL功能。

  • require_ssl:设置服务器端是否强制要求SSL连接。该参数只有当参数ssl为on时才有效。

  • ssl_cert_file:指定服务器证书文件,包含服务器端的公钥。服务器证书用以表明服务器身份的合法性,公钥将发送给对端用来对数据进行加密。

  • ssl_key_file:指定服务器私钥文件,用以对公钥加密的数据进行解密。

  • ssl_ca_file:CA服务器的根证书。此参数可选择配置,需要验证客户端证书的合法性时才需要配置。

  • ssl_ciphers:SSL通讯使用的加密算法。

10、配置客户端PGSSLCERT、PGSSLKEY、PGSSLMODE、PGSSLROOTCERT参数。

(1)使用数据库用户创建密钥文件目录$HOME/caclient,并将client.crt、client.key、client.key.cipher、client.key.rand、cacert.pem放入该目录。

(2)配置环境变量

vi ~/.Vastbase

参数配置如下:

export PGSSLCERT="$HOME/caclient/client.crt"
export PGSSLKEY="$HOME/caclient/client.key"
export PGSSLMODE="verify-ca"
export PGSSLROOTCERT="$HOME/caclient/demoCA/cacert.pem"

环境变量说明:

  • PGSSLCERT:指定客户端证书文件,包含客户端的公钥。客户端证书用以表明客户端身份的合法性,公钥将发送给对端用来对数据进行加密。

  • PGSSLKEY:指定客户端私钥文件,用以对公钥加密的数据进行解密。

  • PGSSLMODE:设置是否和服务器进行SSL连接协商,以及指定SSL连接的优先级。

  • PGSSLROOTCERT:指定为客户端颁发证书的根证书文件,根证书用于验证服务器证书的有效性。

  • PGSSLCRL:指定证书吊销列表文件,用于验证服务器证书是否在废弃证书列表中,如果在,则服务器证书将会被视为无效证书。

(3)修改客户端秘钥的权限:

cd $HOME/caclient
chmod 600 client.key
chmod 600 client.crt
chmod 600 client.key.cipher
chmod 600 client.key.rand
chmod 600 demoCA/cacert.pem

(4)使配置生效。

  • 服务端重启数据库实例。

    vb_ctl restart
    
  • 客户端加载环境变量:

    source ~/.Vastbase
    

吊销证书列表

1、创建crlnumber文件

echo '00'>./demoCA/crlnumber

2、吊销服务端证书

openssl ca -config openssl.cnf -revoke server.crt

3、生成证书吊销列表sslcrl-file.crl

openssl ca -config openssl.cnf -gencrl -out sslcrl-file.crl