注册
达梦数据库GMSSL配置方法
培训园地/ 文章详情 /

达梦数据库GMSSL配置方法

李稼祥 2025/12/11 444 0 0

达梦数据库GMSSL配置方法

一. 国密算法和GMSSL介绍

国密算法是国家商用密码算法的简称。自2012年以来,国家密码管理局以《中华人民共和国密码行业标准》的方式,陆续公布了SM2/SM3/SM4等密码算法标准及其应用规范。其中“SM”代表“商密”,即用于商用的、不涉及国家秘密的密码技术。其中SM2为基于椭圆曲线密码的公钥密码算法标准,包含数字签名、密钥交换和公钥加密,用于替换RSA/Diffie-Hellman/ECDSA/ECDH等国际算法;SM3为密码哈希算法,用于替代MD5/SHA-1/SHA-256等国际算法;SM4为分组密码,用于替代DES/AES等国际算法;SM9为基于身份的密码算法,可以替代基于数字证书的PKI/CA体系。通过部署国密算法,可以降低由弱密码和错误实现带来的安全风险和部署PKI/CA带来的开销。
GmSSL是一个开源的密码工具箱,支持SM2/SM3/SM4/SM9/ZUC等国密(国家商用密码)算法,这些算法使得数据传输更为安全和私密。GMSSL是基于OpenSSL库进行扩展和改造的,因此保留了OpenSSL的大部分API接口,使用相对简单。GMSSL作为一款强化安全性的国产密码库,为各种应用场景提供了高效、安全、可靠的通信加密认证解决方案。

二. 测试环境说明

image.png

三. GMSSL环境准备

3.1. 下载源代码

GmSSL 3.0 采用了cmake构建系统。如果操作系统中未安装 cmake,则需要自行下载安装(需注意系统版本的兼容性问题)。
cmake下载地址:https://cmake.org/download/
gmssl下载地址:https://github.com/guanzhi/GmSSL/releases

注意:
#RH6下载了cmake-3.16.0-Linux-x86_64可用;
#RH7下载了cmake-3.28.4-Linux-x86_64可用;

3.2. 解压源代码

解压:unzip /opt/GmSSL-3.1.1.zip
进入源码目录,修改源码/include/gmssl/tls.h加上 #include <sys/select.h>

cd GmSSL-3.1.1
修改CMakeLists.txt文件,加入行:set(CMAKE_C_FLAGS "-std=c99")
修改源码/include/gmssl/tls.h加上 #include <sys/select.h>

image.png

image.png

image.png

3.3. 编译与安装

Linux平台执行命令:

mkdir build
cd build
cmake ..
make
make test
sudo make install

执行成功后,将在 build/bin 目录下生成动态库文件。
image.png
配置环境变量:

vi ~/.bashrc
export LD_LIBRARY_PATH=/opt/GmSSL-3.1.1/build/bin:$LD_LIBRARY_PATH
source  ~/.bashrc

3.4. 验证安装结果

安装之后可以执行gmssl命令行工具,使用gmssl version可以查看版本。
image.png

四. 证书生成

4.1. 生成服务器证书

/opt/GmSSL-3.1.1/build/bin下创建server_gmssl文件夹,在server_gmssl下创建gen_server.sh脚本生成相关服务器证书。

cd /opt/GmSSL-3.1.1/build/bin
mkdir server_gmssl 
cd server_gmssl
vi gen_server.sh

sh gen_server.sh
gen_server.sh

#!/bin/bash -x
gmssl sm2keygen -pass dm1234 -out rootcakey.pem
gmssl certgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN ROOTCA -days 3650 -key rootcakey.pem -pass dm1234 -out rootcacert.pem -key_usage keyCertSign -key_usage cRLSign -ca
gmssl certparse -in rootcacert.pem

gmssl sm2keygen -pass dm1234 -out cakey.pem
gmssl reqgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN "Sub CA" -key cakey.pem -pass dm1234 -out careq.pem
gmssl reqsign -in careq.pem -days 365 -key_usage keyCertSign -ca -path_len_constraint 0 -cacert rootcacert.pem -key rootcakey.pem -pass dm1234 -out cacert.pem
gmssl certparse -in cacert.pem

gmssl sm2keygen -pass dm1234 -out signkey.pem
gmssl reqgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN localhost -key signkey.pem -pass dm1234 -out signreq.pem
gmssl reqsign -in signreq.pem -days 365 -key_usage digitalSignature -cacert cacert.pem -key cakey.pem -pass dm1234 -out signcert.pem
gmssl certparse -in signcert.pem

gmssl sm2keygen -pass dm1234 -out enckey.pem
gmssl reqgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN localhost -key enckey.pem -pass dm1234 -out encreq.pem
gmssl reqsign -in encreq.pem -days 365 -key_usage keyEncipherment -cacert cacert.pem -key cakey.pem -pass dm1234 -out enccert.pem
gmssl certparse -in enccert.pem

cat signcert.pem > double_certs.pem
cat enccert.pem >> double_certs.pem
cat cacert.pem >> double_certs.pem

image.png

image.png
生成服务器端相关证书成功
image.png

4.2. 生成客户端证书

创建client_gmssl文件夹,复制前面生成的cacert.pem、cakey.pem和rootcacert.pem证书到client_gmssl/SYSDBA目录下, 使用如下脚本gen_client.sh生成客户端相关证书。

mkdir /opt/GmSSL-3.1.1/build/bin/client_gmssl/SYSDBA
cd /opt/GmSSL-3.1.1/build/bin/server_gmssl/
cp cacert.pem cakey.pem rootcacert.pem /opt/GmSSL-3.1.1/build/bin/client_gmssl/SYSDBA
cd ../client_gmssl/SYSDBA/
vi gen_client.sh
sh gen_client.sh 

image.png

client_gmssl/SYSDBA/gen_client.sh

#!/bin/bash -x
gmssl sm2keygen -pass dm1234 -out clientkey.pem
gmssl reqgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN Client -key clientkey.pem -pass dm1234 -out clientreq.pem
gmssl reqsign -in clientreq.pem -days 365 -key_usage digitalSignature -cacert cacert.pem -key cakey.pem -pass dm1234 -out clientcert.pem
gmssl certparse -in clientcert.pem

生成客户端相关证书成功:
image.png

至此动态库和证书全部生成成功。

注意:上面示例中证书的使用的密码是dm1234,证书有效期为365天,想自定义的话修改脚本即可。

subj选项说明:

  • Country Name : 缩写为“C” 证书持有者所在国家 要求填写国家代码
  • State or Province Name : 缩写为“ST“ 证书持有者所在州或省份
  • Locality Name : 缩写为“L” 证书持有者所在城市
  • Organization Name : 缩写为“O“ 证书持有者所属组织或公司
  • Organizational Unit Name : 缩写为“OU” 证书持有者所属部门
  • Common Name : 缩写为“CN“ 证书持有者的通用名
  • Email Address : 证书持有者的通信邮箱

重要:

  1. 可以将生成的动态库和证书复制到相同的环境中直接使用,不需要每次都重新生成。
  2. 客户端证书不区分用户,所有用户可使用相同的证书即可,也可给每个用户单独生成证书。

4.3. 部署证书

  • 服务器端:将server_gmssl文件夹放置到数据库服务/dmdbms/bin/下;
  • 客户端/应用端:放置 client_gmssl/ 文件夹到客户机的规划目录,此步是为了在数据库服务器端通过ssl认证登陆数据库(目录要简洁,没有中文、空格、特殊符号等)

注意:将新证书放到服务端后或服务器端证书重新制作,需要重启数据库服务,新增客户端的证书不用重启。

五. 数据库验证

注意:需要使用安全版产品安装包、带安全版的授权(key)文件。

5.1. 数据库软件安装

数据库软件安装步骤省略。

5.2. 初始化数据库实例

如:./dminit PATH=/dbdata/dmdata extent_size=16 page_size=32 SYSDBA_PWD=Sysdba%_025 SYSAUDITOR_PWD=Sysauditor%_025 SYSSSO_PWD=Syssso%_025

5.3. 修改参数

将dm.ini文件中的ENABLE_ENCRYPT参数修改为3,并保存dm.ini。
image.png

ENABLE_ENCRYPT取值0、1、2、3、4
0:不开启SSL加密和SSL认证
1:开启SSL加密和SSL认证
2:开启SSL认证但不开启SSL加密
3:使用GMSSL进行通信加密和认证(注意:V8.1.3.62版本开始支持)
4:开启 SSL 加密不开启 SSL 认证

5.4. 复制动态库和证书

将前面生成的动态库和证书复制到数据库bin目录下,授予dmdba用户组权限。

cd /opt/GmSSL-3.1.1/build/bin/
cp -r client_gmssl server_gmssl libgmssl.so* /home/dmdba/dm/dmdbms/bin
chown -R dmdba:dinstall /home/dmdba/dm/dmdbms/

5.5. 启动数据库服务

1、dmdba用户添加GMSSL环境变量:

修改dmdba用户下的.bash_profile文件,添加如下内容,并使环境变量生效

export LD_LIBRARY_PATH=/opt/gmssl/GmSSL-3.1.1/build/bin:$LD_LIBRARY_PATH
source .bash_profile

image.png

2、前台启动数据库:

./dmserver /dbdata/dmdata/DAMENG/dm.ini signkey_pass=dm1234 enckey_pass=dm1234

image.png

注意:数据库启动需加载GMSSL,因此必须正确设置其环境变量。可通过执行 gmssl version 命令来验证GMSSL是否能被正常调用。

3、脚本启动方式

使用脚本的方式,在脚本中如下图的地方添加环境变量以及输入秘钥参数。

export LD_LIBRARY_PATH=/opt/gmssl/GmSSL-3.1.1/build/bin:$LD_LIBRARY_PATH
SIGNKEY_PASS=dm1234
ENCKEY_PASS=dm1234

image.png

5.6. DISQL登录验证

disql登录方式:指定客户端证书路径并验证参数

./disql SYSDBA/Sysdba%_025#"{ssl_path=/home/dmdba/dm/dmdbms/bin/client_gmssl/SYSDBA,ssl_pwd=dm1234}"
SQL> select para_value,description from v$dm_ini where para_name like 'ENABLE_ENCRYPT';

image.png

注意:若登录失败,可重点检查GMSSL环境变量。通过在终端执行 gmssl version 命令,若能正常显示版本信息,则表明环境变量配置正确、检查证书路径是否正确、证书密码是否与启动数据库时使用的signkey_pass/enckey_pass一致、证书文件权限是否为dmdba用户可读。

5.7. 客户端登录

客户端配置登录配置方法(win客户端目前不支持,需使用linux客户端):
/home/dmdba/dm/dmdbms/tool/manager
image.png

5.8. GMTEST用户测试不同密钥

1. 数据库创建GMTEST用户

./disql SYSDBA/Sysdba%_025#"{ssl_path=/home/dmdba/dm/dmdbms/bin/client_gmssl/SYSDBA,ssl_pwd=dm1234}"
create user GMTEST identified by "Gm.12345";

image.png

2. 复制server_gmssl生成的cacert.pem、cakey.pem和rootcacert.pem证书到client_gmssl/GMTEST

mkdir client_gmssl/GMTEST
cd server_gmssl/
cp cacert.pem cakey.pem rootcacert.pem /opt/GmSSL-3.1.1/build/bin/client_gmssl/GMTEST/
cp cacert.pem cakey.pem rootcacert.pem /opt/GmSSL-3.1.1/build/bin/client_gmssl/GMTEST/
cd ../client_gmssl/GMTEST/

image.png

3. 通过以下脚本将客户端密钥修改为gmtest1234。

vi /opt/GmSSL-3.1.1/build/bin/client_gmssl/GMTEST/gen_client.sh

#!/bin/bash -x
gmssl sm2keygen -pass gmtest1234 -out clientkey.pem
gmssl reqgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN Client -key clientkey.pem -pass gmtest1234 -out clientreq.pem
gmssl reqsign -in clientreq.pem -days 365 -key_usage digitalSignature -cacert cacert.pem -key cakey.pem -pass dm1234 -out clientcert.pem
gmssl certparse -in clientcert.pem

image.png

4. 将GMTEST拷贝到数据库bin目录,登录GMTEST用户验证成功

cd /home/dmdba/dm/dmdbms/bin/
./disql GMTEST/Gm.12345#"{ssl_path=/home/dmdba/dm/dmdbms/bin/client_gmssl/GMTEST,ssl_pwd=gmtest1234}"

image.png

六. WIRESHARK抓包验证

6.1. 未配置GMSSL加密认证

image.png
上图结果显示,在未配置GMSSL加密认证时,DM8数据库默认使用TLSv1.2进行数据加密传输。
TLSv1.2(Transport Layer Security version 1.2)是一种网络安全协议,用于在两个通信应用之间提供加密支持,以保障数据安全。在客户端和服务器之间建立安全通道,确保传输的数据是机密的、经认证的和未被修改的。使用安全hash函数进行消息认证码计算,确保数据的完整性和真实性。

6.2. 配置GMSSL加密认证

image.png
上图结果显示,在配置了GMSSL加密认证后,DM8数据库使用国密TLCP进行数据加密传输。
国密TLCP(Transport Layer Cryptography Protocol)是一种基于TLS/SSL协议的加密传输协议,它采用国密算法对传输数据进行加密,使数据传输更加安全可靠。TLCP协议采用SM系列密码算法和数字证书等密码技术保障传输层的机密性、完整性、身份认证和抗攻击。

七. 通过配置dm_svc.conf登录验证

7.1. dm_svc.conf配置

通过配置 SSL_CONFIG 参数,可以为不同的登录用户指定其对应的SSL证书。
image.png

vi /etc/dm_svc.conf

TIME_ZONE=(480)
LANGUAGE=(cn)
SSL_CONFIG=((USER=(SYSDBA) SSL_PATH=(/home/dmdba/dm/dmdbms/bin/client_gmssl/SYSDBA) SSL_PWD=(dm1234)) (USER=(GMTEST) SSL_PATH=(/home/dmdba/dm/dmdbms/bin/client_gmssl/GMTEST) SSL_PWD=(gmtest1234)))
GM=(192.168.6.46:5236)

7.2. 验证登录

./disql GMTEST/Gm.12345@GM
./disql SYSDBA/Sysdba%_025@GM

image.png

八. DM主备集群配置方法

如果为主备集群环境,需要将signkey_pass和enckey_pass参数添加到dmwatcher.ini文件中的INST_STARTUP_CMD参数后面,如下图所示:

image.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服