通信加密一般在等保或者分保中提出要求,设置通信加密。企业、标准、安全版本都支持通讯加密,DM 提供两种通信加密方式:一基于传输层的 SSL 协议加密;二基于应用层的消息包加密
使用基于应用层的消息包加密,通过设置服务器配置文件 DM.INI 中的 COMM_ENCRYPT_NAME 参数来指定
sf_set_system_para_value('COMM_ENCRYPT_NAME','RC4',1,2);
SELECT * from V$parameter where name='COMM_ENCRYPT_NAME';
在等保和分保需求中会要求做通讯加密,这时候就不需要设置ssl认证
如果服务器SSL环境没有配置,则无法启动,客户端SSL没有配置则无法连接服务器,新增的用户也无法正常连接服务,通常在测试环境配置好并截图
SELECT * FROM V$PARAMETER WHERE NAME='ENABLE_ENCRYPT';
也可以通过使用客户端工具 Console 或调用系统过程 SP_SET_PARA_VALUE 重新设置 ENABLE_ENCRYPT 的值。不过由于这个参数都为静态 INI 参数,修改后需要重启 DM 数据库服务器才能生效。
查看openssl版本,如升级可以从官方网站下载最新版本
openssl version -a
https://openssl-library.org/source/old/index.html
SP_SET_PARA_VALUE (2,'ENABLE_ENCRYPT',1);
配置SSL认证过程
(1) KylinV10 SP1或者Centos 7默认配置文件为/etc/pki/tls/openssl.cnf。也可以单独创建一个配置文件,在操作时指定该配置文件。
#需要修改的地方标注有【修改前:xxx】
[ CA_default ]
dir = /opt/ca # 【修改前:somepath】
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 # 【修改前:$dir/cacert.pem】
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 # 【修改前:$dir/private/cakey.pem】
x509_extensions = usr_cert # The extensions to add to the cert
(2)创建配置文件中的对应目录和文件
[root@localhost etc]# cd /opt
[root@localhost opt]# mkdir ca
[root@localhost opt]# cd /opt/ca
[root@localhost opt]# mkdir {certs,crl,newcerts}
[root@localhost opt]# echo "01" > serial
[root@localhost opt]# touch index.txt
[root@localhost opt]# mkdir server_ssl
[root@localhost opt]# mkdir client_ssl
[root@localhost opt]# mkdir -p client_ssl/SYSDBA
(3)生成CA私钥和根证书
#生成 CA 根证书、秘钥
#密码设置为 123456,后面会用到
openssl req -new -x509 -days 3650 -keyout ca-key.pem -out ca-cert.pem -subj "/C=cn/ST=hunan/L=changsha/O=dameng/OU=dev/CN=lw/emailAddress=abc@dm.com"
文件后缀简要说明:
ca-key.pem 为私钥文件,ca-cert.pem为根证书
.key : 私钥文件, 也可以使用“.pem”后缀。.pem”后缀时,通常文件包含证书和私钥中的一种或者多种
.csr : 证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写
.crl : 证书吊销列表,Certificate Revocation List的缩写
(4)生成服务端秘钥
#这里方便起见不设置密码,如果服务端的私钥是带存储密码的,那么启动服务器的时候一定要使用命令行方式来启动,即dmserver c:\dmdbms\data\DAMENG\dm.ini,否则不能开启通信加密认证,因为只有这种方式才会让输入服务端私钥的密码。
openssl genrsa -out server_ssl/server-key.pem
#根据服务端私钥文件生成服务端签发申请文件,需要输入服务端私钥密码(由于上面服务端私钥没有设置密码,这里不需要输入)
openssl req -new -key server_ssl/server-key.pem -out server_ssl/server.csr -subj "/C=cn/ST=hunan/L=changsha/O=dameng/OU=dev/CN=server/emailAddress=server@dm.com"
#根据CA根证书和上一步签发申请文件生成服务端签名证书
#需要输入CA私钥密码,本例中上面设置的是123456
openssl ca -days 3650 -in server_ssl/server.csr -out server_ssl/server-cert.pem
#转换证书格式
openssl x509 -in server_ssl/server-cert.pem -out server_ssl/server.cer
#复制CA根证书、秘钥到服务端证书目录中
cp ca-cert.pem server_ssl/ && \
cp ca-key.pem server_ssl/
(5)生成客户端相关的证书
#生成客户端私钥,本例中设置为dameng
openssl genrsa -aes256 -out client_ssl/SYSDBA/client-key.pem
#根据客户端私钥文件生成客户端签发申请文件,需要输入客户端私钥密码(本例中上面设置客户端私钥密码为dameng)
openssl req -new -key client_ssl/SYSDBA/client-key.pem -out client_ssl/SYSDBA/client.csr -subj "/C=cn/ST=hunan/L=changsha/O=dameng/OU=dev/CN=SYSDBA/emailAddress=dmclient@dm.com"
#根据CA根证书和上一步签发申请文件生成服务端签名证书
#需要输入CA私钥密码,本例中上面设置的是123456
openssl ca -days 365 -in client_ssl/SYSDBA/client.csr -out client_ssl/SYSDBA/client-cert.pem
#将私钥和证书合并转化为pkcs12格式文件
#需要输入客户端私钥密码,本例设置为dameng
#需要设定Export密码,本例设置为abc123
openssl pkcs12 -export -inkey client_ssl/SYSDBA/client-key.pem -in client_ssl/SYSDBA/client-cert.pem -out client_ssl/SYSDBA/client-pkcs.p12
(6)jdbc连接证书生成
导入所有证书到keystore文件,并设置keystore文件密码为abc123(-deststorepass)
keytool -import -alias ca -trustcacerts -file ca-cert.pem -keystore client_ssl/SYSDBA/.keystore -deststorepass abc123 -noprompt
keytool -import -alias server -trustcacerts -file server_ssl/server.cer -keystore client_ssl/SYSDBA/.keystore -deststorepass abc123 -noprompt
keytool -importkeystore -srckeystore client_ssl/SYSDBA/client-pkcs.p12 -srcstorepass abc123 -srcstoretype PKCS12 -keystore client_ssl/SYSDBA/.keystore -deststorepass abc123
JDBC连接达梦是通过client_ssl/SYSDBA/.keystore文件,而ODBA和其他方式是通过client_SYSDBA目录下ca-cert.pem、client-cert.pem和client-key.pem文件。
(7)拷贝CA自签名证书到client/SYSDBA中
cp ca-cert.pem client_ssl/SYSDBA/
(8)部署SSL证书到服务端
[root@localhost bin]# mv server_ssl server_ssl_bak2
[root@localhost bin]# cp /opt/ca/server_ssl ./ -r
[root@localhost bin]# chmod -R 777 server_ssl
(9)部署client端证书
将/opt/ca/client_ssl整个目录拷贝到客户端机器上。如果是Linux机器,需要注意目录权限,可以将整个目录设置为777权限。
chmod 777 -R client_ssl
(10)设置加密参数
SQL> SF_SET_SYSTEM_PARA_VALUE('ENABLE_ENCRYPT',2,1,2); --启用SSL/TLS认证
SQL> SF_SET_SYSTEM_PARA_VALUE('COMM_ENCRYPT_NAME','RC4',1,2); --启用SSL/TLS通信加密,并指定加密算法为'RC4'
SQL> select * from v$parameter where name like '%ENABLE_ENCRYPT%' or name like '%COMM_ENCRYPT_NAME%'; --验证相关配置是否生效
[dmdba@localhost bin]#./DmServiceDMSERVER restart
复制
2、登录测试
disql SYSDBA/'"Dameng@123"'@localhost:5236#"{SSL_PATH=/opt/ca/client_ssl/SYSDBA,SSL_PWD=dameng}"
disql SYSDBA/'"Dameng@123"'@localhost:5236#"{SSL_PATH=/home/dmdba/dmdbms/bin/client_ssl/SYSDBA,SSL_PWD=Dameng@123}"
manager工具使用keystore生成设定的密码abc123
static final String DB_URL = "jdbc:dm://xx.26.19.77:5336?sslFilesPath=client_ssl/SYSDBA&sslKeystorePass=dameng";
遇到的问题总结
问题一:其他用户不能使用SYSDBA目录下的证书文件登录 [dmdba@dm4:~]$ disql feng1/'"Dameng@123"'@localhost:5236#"{SSL_PATH=/opt/ca/client_ssl/SYSDBA,SSL_PWD=dameng}" case sense user compare fail. [-70070]:初始化SSL环境失败. 各用户只能使用自己的证书,例如 SYSDBA 账户只能使用\bin\CLIENT_SSL\SYSDBA 下的证书和密码,手动生成客户端feng1相关的证书,连接成功 使用数据库默认的/home/dmdba/dmdbms/bin/client_ssl证书,新增用户无法生成原因少ca-key.pem私钥文件
文章
阅读量
获赞