达梦数据库配置SSL认证加密

原文地址:
https://eco.dameng.com/community/article/af22b724ddb048f400003a7312122f28
https://eco.dameng.com/community/article/c068d29ff069a34dc029fe9247c48796

一、环境介绍

OS Version:CentOS Linux 8.2

DB Version:DM V8 1-3-26-2023.06.14-193125-20046-ENT

OpenSSL:OpenSSL 1.1.1k

JAVA:openjdk version “1.8.0_332”

参考手册:《DM8_DISQL使用手册》《DM8安全管理》《DM8程序员手册》

DM8 产品手册 | 达梦技术社区

二、配置过程

2.1 配置openssl配置文件

KylinV10 SP1或者Centos 7默认配置文件为/etc/pki/tls/openssl.cnf。也可以单独创建一个配置文件,在操作时指定该配置文件。

备份openssl.cnf文件,并修改[ CA_default ]这一段内容部分配置项,其余默认。

[ CA_default ]

dir		= /opt/ca		# Where everything is kept
certs		= $dir/certs		# Where the issued certs are kept
crl_dir		= $dir/crl		# Where the issued crl are kept
database	= $dir/index.txt	# database index file.
#unique_subject	= no			# Set to 'no' to allow creation of
					# several certs with same subject.
new_certs_dir	= $dir/newcerts		# default place for new certs.

certificate	= $dir/ca-cert.pem 	# The CA certificate
serial		= $dir/serial 		# The current serial number
crlnumber	= $dir/crlnumber	# the current crl number
					# must be commented out to leave a V1 CRL
crl		= $dir/crl.pem 		# The current CRL
private_key	= $dir/ca-key.pem       # The private key

x509_extensions	= usr_cert		# The extensions to add to the cert

2.2 创建配置文件中对应的主要目录和文件

[root@shine ~]# mkdir -p /opt/ca
[root@shine ~]# cd /opt/ca
[root@shine ca]# mkdir {certs,crl,newcerts}
[root@shine ca]# echo "01" > serial
[root@shine ca]# touch index.txt
##创建达梦数据库服务器和客户端证书文件存放目录
[root@shine ca]# mkdir server_ssl
[root@shine ca]# mkdir client_ssl
##创建SYSDBA用户客户端证书存放目录,其他用户请创建与用户名相同的目录
[root@shine ca]# mkdir -p client_ssl/SYSDBA  

2.3 生成CA私钥和根证书

[root@shine ca]# openssl req -new -x509 -days 3650 -keyout ca-key.pem -out ca-cert.pem -subj "/C=cn/ST=Beijing/L=Beijing/O=dameng/OU=server/CN=shine/emailAddress=shine@dm.com"
Generating a RSA private key
.....................................................................................+++++
......................................+++++
writing new private key to 'ca-key.pem'
Enter PEM pass phrase:                        #设置CA私钥的存储密码,本次测试设置为123456
Verifying - Enter PEM pass phrase:
-----
[root@shine ca]# ls
ca-cert.pem  ca-key.pem  certs  client_ssl  crl  index.txt  newcerts  serial  server_ssl

ca-key.pem 为私钥文件,ca-cert.pem为根证书

文件后缀简要说明:

  • .key : 私钥文件, 也可以使用“.pem”后缀。“.pem”后缀时,通常文件包含证书和私钥中的一种或者多种
  • .csr : 证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写
  • .crl : 证书吊销列表,Certificate Revocation List的缩写

subj选项说明:

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

2.4 生成服务器私钥和被CA签名的证书

2.4.1 生成私钥文件

[root@shine ca]# openssl genrsa -out server_ssl/server-key.pem
Generating RSA private key, 2048 bit long modulus (2 primes)
.................................................................................................................+++++
..............................................................+++++
e is 65537 (0x010001)

##注意服务器端的私钥,为了方便不设置加密

注意:
如果服务端的私钥是带存储密码的,那么启动服务器的时候一定要使用命令行方式来启动,即dmserver c:\dmdbms\data\DAMENG\dm.ini,否则不能开启通信加密认证,因为只有这种方式才会让输入服务端私钥的密码。

2.4.2 生成证书签发申请

[root@shine ca]# openssl req -new -key server_ssl/server-key.pem -out server_ssl/server.csr -subj "/C=cn/ST=Beijing/L=Beijing/O=dameng/OU=server/CN=shine/emailAddress=shine@dm.com"

2.4.3 使用根证书和签发申请生成证书

[root@shine ca]# openssl ca -days 3650 -in server_ssl/server.csr -out server_ssl/server-cert.pem
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /opt/ca/ca-key.pem:                #输入生成CA私钥时设置的存储密码,上面设置的是123456
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Aug 11 09:23:40 2021 GMT
            Not After : Aug  9 09:23:40 2031 GMT
        Subject:
            countryName               = cn
            stateOrProvinceName       = Beijing
            organizationName          = dameng
            organizationalUnitName    = server
            commonName                = shine
            emailAddress              = shine@dm.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                46:E9:80:E8:CC:1D:7E:DB:E3:05:FF:8C:3B:77:43:51:9B:16:05:43
            X509v3 Authority Key Identifier: 
                keyid:61:05:BE:3F:A9:DE:2D:9A:7F:2A:BA:0E:45:97:47:5B:E8:0C:D7:7E

Certificate is to be certified until Aug  9 09:23:40 2031 GMT (3650 days)
Sign the certificate? [y/n]:y                       #输入y


1 out of 1 certificate requests certified, commit? [y/n]y      #输入y
Write out database with 1 new entries
Data Base Updated

2.4.4 将证书格式转换为x509格式

[root@shine ca]# openssl x509 -in server_ssl/server-cert.pem -out server_ssl/server.cer
[root@shine ca]# ll server_ssl/
total 28
-rwxrwxrwx 1 root root 1407 Jun 10 13:56 ca-cert.pem
-rwxrwxrwx 1 root root 1854 Jun 10 13:56 ca-key.pem
-rwxrwxrwx 1 root root 1411 Jun 10 13:54 server.cer
-rwxrwxrwx 1 root root 4572 Jun 10 13:54 server-cert.pem
-rwxrwxrwx 1 root root 1037 Jun 10 13:54 server.csr
-rwxrwxrwx 1 root root 1675 Jun 10 13:54 server-key.pem

2.4.5 将CA自签名的证书拷贝到server_ssl目录中

[root@shine ca]# cp ca-cert.pem server_ssl/
[root@shine ca]# cp ca-key.pem server_ssl/

2.5 生成客户端用户私钥和被CA签名的证书

2.5.1 生成私钥文件

[root@shine ca]# openssl genrsa -aes256 -out client_ssl/SYSDBA/client-key.pem
Generating RSA private key, 2048 bit long modulus (2 primes)
............................+++++
..+++++
e is 65537 (0x010001)
Enter pass phrase for client_ssl/SYSDBA/client-key.pem:               #设置私钥密码,本次测试设置为dameng
Verifying - Enter pass phrase for client_ssl/SYSDBA/client-key.pem:  #再输入一次

#-aes256表示使用AES算法对产生的私钥加密

2.5.2 生成证书签发申请

[root@shine ca]# openssl req -new -key client_ssl/SYSDBA/client-key.pem -out client_ssl/SYSDBA/client.csr -subj "/C=cn/ST=Beijing/L=Beijing/O=dameng/OU=server/CN=SYSDBA/emailAddress=dmclient@dm.com"
Enter pass phrase for client_ssl/SYSDBA/client-key.pem:  #输入上一步生成私钥文件时设置的密码

2.5.3 使用根证书和签发申请生成证书

[root@shine ca]# openssl ca -days 365 -in client_ssl/SYSDBA/client.csr -out client_ssl/SYSDBA/client-cert.pem
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /opt/ca/ca-key.pem:         #输入设置的CA私钥存储密码
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 2 (0x2)
        Validity
            Not Before: Aug 11 09:39:23 2021 GMT
            Not After : Aug 11 09:39:23 2022 GMT
        Subject:
            countryName               = cn
            stateOrProvinceName       = Beijing
            organizationName          = dameng
            organizationalUnitName    = server
            commonName                = SYSDBA
            emailAddress              = dmclient@dm.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                E1:BB:5E:A0:E6:7C:38:40:FD:BB:6B:B8:2E:6E:2C:46:1C:E3:AF:1C
            X509v3 Authority Key Identifier: 
                keyid:61:05:BE:3F:A9:DE:2D:9A:7F:2A:BA:0E:45:97:47:5B:E8:0C:D7:7E

Certificate is to be certified until Aug 11 09:39:23 2022 GMT (365 days)
Sign the certificate? [y/n]:y                #输入y


1 out of 1 certificate requests certified, commit? [y/n]y        #输入y
Write out database with 1 new entries
Data Base Updated

2.5.4 转换client-pkcs.p12

将生成的X509格式的client-key.pem和client-cert.pem合并转换为pkcs12格式的文件client-pkcs.p12

[root@shine ca]# openssl pkcs12 -export -inkey client_ssl/SYSDBA/client-key.pem -in client_ssl/SYSDBA/client-cert.pem -out client_ssl/SYSDBA/client-pkcs.p12
Enter pass phrase for client_ssl/SYSDBA/client-key.pem:    #输入之前设置的客户端私钥存储密码(dameng)
Enter Export Password:            #设置export password,本次测试设置为abc123
Verifying - Enter Export Password: #再输入一次

2.5.5 生成JDBC访问需要的.keystore文件

导入所有证书到keystore文件,并设置keystore文件密码为abc123(-deststorepass)

[root@shine ca]# keytool -import -alias ca -trustcacerts -file ca-cert.pem -keystore client_ssl/SYSDBA/.keystore -deststorepass abc123 -noprompt
证书已添加到密钥库中
[root@shine ca]# keytool -import -alias server -trustcacerts -file server_ssl/server.cer -keystore client_ssl/SYSDBA/.keystore -deststorepass abc123 -noprompt
证书已添加到密钥库中
[root@shine ca]# keytool -importkeystore -srckeystore client_ssl/SYSDBA/client-pkcs.p12 -srcstorepass abc123  -srcstoretype PKCS12 -keystore client_ssl/SYSDBA/.keystore  -deststorepass abc123
正在将密钥库 client_ssl/SYSDBA/client-pkcs.p12 导入到 client_ssl/SYSDBA/.keystore...
已成功导入别名 1 的条目。
已完成导入命令: 1 个条目成功导入, 0 个条目失败或取消

Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore client_ssl/SYSDBA/.keystore -destkeystore client_ssl/SYSDBA/.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

执行上面警告的内容:(可选)

[root@shine ca]# keytool -importkeystore -srckeystore client_ssl/SYSDBA/.keystore -destkeystore client_ssl/SYSDBA/.keystore -deststoretype pkcs12
输入源密钥库口令:           #输入之前的export password,abc123
已成功导入别名 ca 的条目。
已成功导入别名 1 的条目。
已成功导入别名 server 的条目。
已完成导入命令: 3 个条目成功导入, 0 个条目失败或取消

Warning:
已将 "client_ssl/SYSDBA/.keystore" 迁移到 Non JKS/JCEKS。将 JKS 密钥库作为 "client_ssl/SYSDBA/.keystore.old" 进行了备份。

2.5.6 将CA自签名的证书拷贝到client_ssl/SYSDBA目录中

[root@shine ca]# cp ca-cert.pem client_ssl/SYSDBA/
[root@shine ca]# ls -la client_ssl/SYSDBA/
total 48
drwxrwxrwx 2 root root 4096 Jun 10 14:13 .
drwxrwxrwx 3 root root 4096 Jun 10 13:41 ..
-rwxrwxrwx 1 root root 1407 Jun 10 14:13 ca-cert.pem
-rwxrwxrwx 1 root root 4580 Jun 10 14:01 client-cert.pem
-rwxrwxrwx 1 root root 1045 Jun 10 14:00 client.csr
-rwxrwxrwx 1 root root 1766 Jun 10 13:58 client-key.pem
-rwxrwxrwx 1 root root 2605 Jun 10 14:01 client-pkcs.p12
-rwxrwxrwx 1 root root 4869 Jun 10 14:12 .keystore
-rwxrwxrwx 1 root root 4411 Jun 10 14:12 .keystore.old

2.6 部署SERVER端证书

将/opt/ca/server_ssl整个目录拷贝到达梦数据库安装目录下的bin目录下,默认在bin目录下存在server_ssl目录。可以先将默认的server_ssl目录重命名,然后拷贝。

[root@shine ca]# cd /home/dmdba/dmdbms/bin
[root@shine bin]# mv server_ssl server_ssl_bak2
[root@shine bin]# cp /opt/ca/server_ssl ./ -r
[root@shine bin]# chmod -R 777 server_ssl
[root@shine bin]# ll server_ssl
total 28
-rwxrwxrwx 1 root root 1407 Jun 10 14:13 ca-cert.pem
-rwxrwxrwx 1 root root 1854 Jun 10 14:13 ca-key.pem
-rwxrwxrwx 1 root root 1411 Jun 10 14:13 server.cer
-rwxrwxrwx 1 root root 4572 Jun 10 14:13 server-cert.pem
-rwxrwxrwx 1 root root 1037 Jun 10 14:13 server.csr
-rwxrwxrwx 1 root root 1675 Jun 10 14:13 server-key.pem

2.7 部署client端证书

将/opt/ca/client_ssl整个目录拷贝到客户端机器上。如果是Linux机器,需要注意目录权限,可以将整个目录设置为777权限。

chmod 777 -R client_ssl

如果是通过jdbc接口来加密访问数据库,是使用的.keystore文件;

如果是通过ODBC或者其他方式加密访问数据库,那么是使用ca-cert.pem、client-cert.pem和client-key.pem三个文件。

2.8 数据库启用SSL认证和通信加密

是否使用通信加密以DM数据库服务器端的设置为准,即通过设置服务器配置文件dm.ini中的ENABLE_ENCRYPT或者COMM_ENCRYPT_NAME参数来指定,ENABLE_ENCRYPT可以开启传输层通讯加密,COMM_ENCRYPT_NAME可以开启应用层消息通讯加密,两个层次上的加密是互不干扰,互不影响,可以同时开启这两个层次上的加密,也可以开启其中一个,如果开启传输层消息加密需要配置SSL证书。客户端以服务器采用的通信方式与其进行通信。

ENABLE_ENCRYPT:取值0、1和2,含义义分别为:

0表示在传输层不开启SSL认证和SSL通信加密;
1表示在传输层开启SSL认证和SSL通信加密;
2表示在传输层仅开启SSL认证,但不开启SSL加密。

COMM_ENCRYPT_NAME参数用来指定应用层消息通信的加密算法名,指定加密算法后,即可开启应用层通信加密(无需配置ENABLE_ENCRYPT)。如果为空则不进行通信加密;如果给的加密算法名错误,则使用加密算法DES_CFB。应用层的这种加密非常适合两端缺少数字证书的情况。
DM支持的加密算法名可以通过查询动态视图V$CIPHERS获取。

修改数据库参数:

---开启应用层通讯加密(测试通讯加密)
SQL> SF_SET_SYSTEM_PARA_VALUE('COMM_ENCRYPT_NAME','RC4',1,2);
DMSQL 过程已成功完成
已用时间: 7.093(毫秒). 执行号:500.

---开启SSL认证(测试SSL认证登录)
SQL> SF_SET_SYSTEM_PARA_VALUE('ENABLE_ENCRYPT',2,1,2);
DMSQL 过程已成功完成
已用时间: 5.268(毫秒). 执行号:501.
SQL> SELECT * FROM V$PARAMETER WHERE NAME='ENABLE_ENCRYPT' OR NAME='COMM_ENCRYPT_NAME';

行号     ID          NAME              TYPE    VALUE SYS_VALUE FILE_VALUE
---------- ----------- ----------------- ------- ----- --------- ----------
           DESCRIPTION                                                                                 
           --------------------------------------------------------------------------------------------
1          454         ENABLE_ENCRYPT    IN FILE 0     0         2
           Encrypt Mode For Communication, 0: Without Encryption; 1: SSL Encryption; 2: SSL Authentication

2          476         COMM_ENCRYPT_NAME IN FILE                 RC4
           Communication encrypt name, if it is null then the communication is not encrypted

重启数据库生效。

三、SSL认证登录测试

如果是通过jdbc接口来加密访问数据库,是使用的.keystore文件,所以SSL认证密码是keystore文件的密码;

如果是通过ODBC或者其他方式加密访问数据库,那么是使用ca-cert.pem、client-cert.pem和client-key.pem三个文件,所以SSL密码为客户端私钥密码。

3.1 disql工具登录

[dmdba@shine ~]$ disql SYSDBA/'"Dameng@!23"'@localhost:5236#"{SSL_PATH=/opt/ca/client_ssl/SYSDBA,SSL_PWD=dameng}"

Server[localhost:5236]:mode is normal, state is open
login used time : 9.523(ms)
disql V8
SQL> exit
## 或者
[dmdba@shine ~]$ disql /nolog
disql V8
SQL> login
server:localhost
username:SYSDBA
password:
SSL path:/opt/ca/client_ssl/SYSDBA
SSL PWD:
UKEY NAME:
UKEY PIN:
MPP TYPE:
read/write separate(y/n):
protocol type:

Server[localhost:5236]:mode is normal, state is open
login used time : 9.058(ms)
SQL> 

3.2 管理工具登录

管理工具连接数据库的方式是通过JDBC,所以SSL密码为keystore文件密码,而非客户端私钥密码。

这里的密码使用的是keystore文件的密码(abc123)

3.3 JDBC程序连接配置

JDBC通过SSL认证方式登录数据库需要添加连接串属性sslFilesPath和sslKeystorePass,简要配置如下:

String name="dm.jdbc.driver.DmDriver";
String url="jdbc:dm://ip:5236?sslFilesPath=C:\\dmdbms\\bin\\client_ssl\\SYSDBA&sslKeystorePass=abc123";
String user="SYSDBA";
String password="SYSDBA";

3.4 逻辑导出导入

[dmdba@shine ~]$ dexp USERID=SYSDBA/SYSDBA@localhost:5236#"{SSL_PATH=/opt/ca/client_ssl/SYSDBA,SSL_PWD=dameng}" FILE=FULL.DMP LOG=EXP.LOG DIRECTORY=./ FULL=Y ROWS=Y
暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇