身份认证与通信加密
功能描述
国密即国家密码局认定的国产密码算法,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