达梦数据库-学习-67-SSL加密认证

目录

一、环境信息

二、介绍

三、实验步骤

1、备份openssl.cnf

2、修改openssl.cnf

3、基目录创建

4、服务端和客户端证书存放目录创建

5、用户客户端证书存放目录创建

6、目录树展示

7、CA证书生成

8、服务器私钥生成

9、签发申请生成

10、CA签名证书生成

11、证书格式转换为x509格式

12、拷贝文件

13、客户端用户私钥生成

14、客户端用户证书签发申请

15、客户端用户CA根证书

16、转换为pkcs12格式

[17、JDBC .keystore文件生成](#17、JDBC .keystore文件生成)

(1)导入CA根证书

(2)导入服务器证书

(3)导入客户端私钥和证书

18、自签名CA根证书拷贝

19、部署服务端证书

20、客户端证书修改用户组

21、数据库参数修改

22、不加证书disql登录失败

23、加证书disql登录成功

24、JDBC连接

(1)jdbc_conn.java源码

(2)编译

(3)运行


一、环境信息

|------|------------------------------------------------------------------------------------------------------------------------------|
| 名称 | 值 |
| CPU | Intel(R) Core(TM) i5-1035G1 CPU @ 1.00GHz |
| 操作系统 | CentOS Linux release 7.9.2009 (Core) |
| 内存 | 5G |
| 逻辑核数 | 6 |
| DM版本 | 1 DM Database Server 64 V8 2 DB Version: 0x7000c 3 03134284194-20240703-234060-20108 4 Msg Version: 12 5 Gsu level(5) cnt: 0 |

二、介绍

基于传输层的 SSL 协议加密,选择是否使用 SSL 协议加密以 DM 数据库服务器端的设置为准,即通过设置服务器配置文件 DM.INI 中的 ENABLE_ENCRYPT 参数来指定,客户端以服务器采用的通信方式与其。进行通信。

三、实验步骤

1、备份openssl.cnf

bash 复制代码
[root@localhost ~]# cp /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl.cnf_bak

2、修改openssl.cnf

bash 复制代码
[ 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 ctificates 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
RANDFILE        = $dir/.rand    # private random number file

x509_extensions = usr_cert              # The extentions to add to the cert

只修改 CA_default 标签下的参数dir、certificate、private_key、RANDFILE,其他不动。

3、基目录创建

bash 复制代码
mkdir -p /opt/ca
cd /opt/ca
mkdir {certs,crl,newcerts}
echo "01" > serial
touch index.txt

4、服务端和客户端证书存放目录创建

bash 复制代码
mkdir /opt/ca/server_ssl
mkdir /opt/ca/client_ssl

5、用户客户端证书存放目录创建

数据库中所有用户都需要生成客户端证书,否则无法登录。

这里以SYSDBA为例,其他用户需创建相应名字的目录。

bash 复制代码
mkdir -p /opt/ca/client_ssl/SYSDBA

6、目录树展示

bash 复制代码
[root@localhost ca]# tree
.
├── certs
├── client_ssl
│   └── SYSDBA
├── crl
├── index.txt
├── newcerts
├── serial
└── server_ssl

7、CA证书生成

密码设置简单一些,我这边是123456

bash 复制代码
[root@localhost ca]# openssl req -new -x509 -days 3650 -keyout ca-key.pem -out ca-cert.pem -subj "/C=cn/ST=guangdong/L=guangzhou/O=dameng/OU=dev/CN=lw/emailAddress=abc@dm.com"
Generating a 2048 bit RSA private key
..................................+++
..........+++
writing new private key to 'ca-key.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----

[root@localhost ca]# ll
总用量 12
-rw-r--r--. 1 root root 1375 8月   6 20:47 ca-cert.pem
-rw-r--r--. 1 root root 1834 8月   6 20:47 ca-key.pem
drwxr-xr-x. 2 root root    6 8月   6 20:36 certs
drwxr-xr-x. 3 root root   20 8月   6 20:37 client_ssl
drwxr-xr-x. 2 root root    6 8月   6 20:36 crl
-rw-r--r--. 1 root root    0 8月   6 20:36 index.txt
drwxr-xr-x. 2 root root    6 8月   6 20:36 newcerts
-rw-r--r--. 1 root root    3 8月   6 20:36 serial
drwxr-xr-x. 2 root root    6 8月   6 20:37 server_ssl
[root@localhost ca]# 

可以看到生成了CA私钥和根证书。

8、服务器私钥生成

bash 复制代码
[root@localhost ca]# openssl genrsa -out server_ssl/server-key.pem
Generating RSA private key, 2048 bit long modulus
.......................................................+++
............+++
e is 65537 (0x10001)

9、签发申请生成

bash 复制代码
[root@localhost ca]# openssl req -new -key server_ssl/server-key.pem -out server_ssl/server.csr -subj "/C=cn/ST=guangdong/L=guangzhou/O=dameng/OU=dev/CN=server/emailAddress=server@dm.com"

10、CA签名证书生成

密码还是123456

bash 复制代码
[root@localhost 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:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Aug  6 12:56:29 2026 GMT
            Not After : Aug  3 12:56:29 2036 GMT
        Subject:
            countryName               = cn
            stateOrProvinceName       = guangdong
            organizationName          = dameng
            organizationalUnitName    = dev
            commonName                = server
            emailAddress              = server@dm.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                CC:2A:96:FF:04:0A:8A:32:03:EB:9D:53:DB:8C:1B:54:C6:A4:F0:58
            X509v3 Authority Key Identifier: 
                keyid:ED:9E:B5:5F:B9:33:D1:34:38:17:21:E0:9B:6E:EC:93:5D:C9:F4:FE

Certificate is to be certified until Aug  3 12:56:29 2036 GMT (3650 days)
Sign the certificate? [y/n]:y


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

11、证书格式转换为x509格式

bash 复制代码
[root@localhost ca]# openssl x509 -in server_ssl/server-cert.pem -out server_ssl/server.cer

12、拷贝文件

bash 复制代码
[root@localhost ca]# cp ca-cert.pem server_ssl
[root@localhost ca]# cp ca-key.pem server_ssl

13、客户端用户私钥生成

密码还是123456

bash 复制代码
[root@localhost ca]# openssl genrsa -aes256 -out client_ssl/SYSDBA/client-key.pem
Generating RSA private key, 2048 bit long modulus
.................................................+++
....................................+++
e is 65537 (0x10001)
Enter pass phrase for client_ssl/SYSDBA/client-key.pem:
Verifying - Enter pass phrase for client_ssl/SYSDBA/client-key.pem:

14、客户端用户证书签发申请

bash 复制代码
[root@localhost ca]# openssl req -new -key client_ssl/SYSDBA/client-key.pem -out client_ssl/SYSDBA/client.csr -subj "/C=cn/ST=guangdong/L=guangzhou/O=dameng/OU=dev/CN=SYSDBA/emailAddress=dmclient@dm.com"
Enter pass phrase for client_ssl/SYSDBA/client-key.pem:

15、客户端用户CA根证书

bash 复制代码
[root@localhost 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:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 2 (0x2)
        Validity
            Not Before: Aug  6 13:05:59 2026 GMT
            Not After : Aug  6 13:05:59 2027 GMT
        Subject:
            countryName               = cn
            stateOrProvinceName       = guangdong
            organizationName          = dameng
            organizationalUnitName    = dev
            commonName                = SYSDBA
            emailAddress              = dmclient@dm.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                98:80:33:C5:4F:0A:0E:93:60:59:74:0C:26:DD:CA:9F:46:38:23:61
            X509v3 Authority Key Identifier: 
                keyid:ED:9E:B5:5F:B9:33:D1:34:38:17:21:E0:9B:6E:EC:93:5D:C9:F4:FE

Certificate is to be certified until Aug  6 13:05:59 2027 GMT (365 days)
Sign the certificate? [y/n]:y


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

16、转换为pkcs12格式

bash 复制代码
[root@localhost 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:
Enter Export Password:
Verifying - Enter Export Password:

17、JDBC .keystore文件生成

(1)导入CA根证书

bash 复制代码
[root@localhost ca]# keytool -import -alias ca -trustcacerts -file ca-cert.pem -keystore client_ssl/SYSDBA/.keystore -deststorepass 123456 -noprompt
证书已添加到密钥库中

(2)导入服务器证书

bash 复制代码
[root@localhost ca]# keytool -import -alias server -trustcacerts -file server_ssl/server.cer -keystore client_ssl/SYSDBA/.keystore -deststorepass 123456 -noprompt
证书已添加到密钥库中

(3)导入客户端私钥和证书

bash 复制代码
[root@localhost ca]# keytool -importkeystore -srckeystore client_ssl/SYSDBA/client-pkcs.p12 -srcstorepass 123456  -srcstoretype PKCS12 -keystore client_ssl/SYSDBA/.keystore -storetype PKCS12  -deststorepass 123456
正在将密钥库 client_ssl/SYSDBA/client-pkcs.p12 导入到 client_ssl/SYSDBA/.keystore...
keytool 错误: java.io.IOException: DerInputStream.getLength(): lengthTag=109, too big.

报错,应该是前面配置错了。

bash 复制代码
[root@localhost ca]# openssl pkcs12 -info -in client_ssl/SYSDBA/client-pkcs.p12 -nodes

无输出则损坏。

bash 复制代码
[root@localhost ca]# rm -f client_ssl/SYSDBA/.keystore

删除旧的 keystore 文件。

bash 复制代码
[root@localhost ca]# keytool -importkeystore -srckeystore client_ssl/SYSDBA/client-pkcs.p12 -srcstoretype PKCS12 -srcstorepass 123456 -destkeystore client_ssl/SYSDBA/.keystore -deststoretype PKCS12 -deststorepass 123456
正在将密钥库 client_ssl/SYSDBA/client-pkcs.p12 导入到 client_ssl/SYSDBA/.keystore...
已成功导入别名 1 的条目。
已完成导入命令: 1 个条目成功导入, 0 个条目失败或取消

导入PKCS12文件。

bash 复制代码
[root@localhost ca]# keytool -import -alias ca -trustcacerts -file ca-cert.pem -keystore client_ssl/SYSDBA/.keystore -storepass 123456 -noprompt
证书已添加到密钥库中

导入CA根证书。

bash 复制代码
[root@localhost ca]# keytool -import -alias server -trustcacerts -file server_ssl/server.cer -keystore client_ssl/SYSDBA/.keystore -storepass 123456 -noprompt
证书已添加到密钥库中

导入服务器证书。

bash 复制代码
[root@localhost ca]# keytool -importkeystore -srckeystore client_ssl/SYSDBA/client-pkcs.p12 -srcstorepass 123456  -srcstoretype PKCS12 -keystore client_ssl/SYSDBA/.keystore -storetype PKCS12  -deststorepass 123456
正在将密钥库 client_ssl/SYSDBA/client-pkcs.p12 导入到 client_ssl/SYSDBA/.keystore...
存在现有条目别名 1, 是否覆盖? [否]:  1
错误的答案, 请再试一次
存在现有条目别名 1, 是否覆盖? [否]:  y
已成功导入别名 1 的条目。
已完成导入命令: 1 个条目成功导入, 0 个条目失败或取消

这次正常了。

18、自签名CA根证书拷贝

bash 复制代码
[root@localhost ca]# cp ca-cert.pem client_ssl/SYSDBA/

19、部署服务端证书

bash 复制代码
mv /opt/Dm8/bin/server_ssl /opt/Dm8/bin/server_ssl_bak 
cp -r /opt/ca/server_ssl /opt/Dm8/bin/
chown -R dmdba:dmdba /opt/Dm8/bin/server_ssl

20、客户端证书修改用户组

bash 复制代码
[root@localhost ca]# chown -R dmdba:dmdba /opt/ca/client_ssl

21、数据库参数修改

ENABLE_ENCRYPT改为1,重启数据库。

sql 复制代码
SP_SET_PARA_VALUE (2,'ENABLE_ENCRYPT',1); 

22、不加证书disql登录失败

bash 复制代码
[dmdba@localhost ~]$ disql SYSDBA/qwer1234S
SSL_do_handshake failure
[-70019]:网络通讯失败.
disql V8
用户名:

23、加证书disql登录成功

bash 复制代码
[dmdba@localhost ~]$ disql SYSDBA/'"qwer1234S"'@192.168.217.66:5236#"{SSL_PATH=/opt/ca/client_ssl/SYSDBA,SSL_PWD=123456}"

服务器[192.168.217.66:5236]:处于普通打开状态
登录使用时间 : 16.871(ms)
disql V8
SQL> quit

24、JDBC连接

(1)jdbc_conn.java源码

java 复制代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class jdbc_conn {
    static String cname = "dm.jdbc.driver.DmDriver";
    static String url = "jdbc:dm://writemaster?writemaster=(192.168.217.66:5236)&schema=SYSDBA&socketTimeout=0&connectTimeout=25000&sslFilesPath=/opt/ca/client_ssl/SYSDBA&sslKeystorePass=123456";
    static String userid = "SYSDBA";
    static String pwd = "qwer1234S";

    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++) {
            Connection con = null;   // 每次循环独立
            try {
                Class.forName(cname);
                con = DriverManager.getConnection(url, userid, pwd);
                con.setAutoCommit(true);
                System.out.println("[SUCCESS] conn database - 第" + i + "次");
            } catch (Exception e) {
                System.out.println("[FAIL] conn database - 第" + i + "次:" + e.getMessage());
            } finally {
                try {
                    disConn(con);
                } catch (SQLException e) {
                    System.out.println("[WARN] 关闭连接失败 - 第" + i + "次:" + e.getMessage());
                }
            }
        }
    }

    public static void disConn(Connection con) throws SQLException {
        if (con != null) {
            con.close();
        }
    }
}

(2)编译

java 复制代码
javac -cp ".:/opt/Dm8/drivers/jdbc/DmJdbcDriver8.jar" jdbc_conn.java

(3)运行

bash 复制代码
[dmdba@localhost JDBC]$ java -cp ".:/opt/Dm8/drivers/jdbc/DmJdbcDriver8.jar" jdbc_conn
[SUCCESS] conn database - 第1次
[SUCCESS] conn database - 第2次
[SUCCESS] conn database - 第3次
[SUCCESS] conn database - 第4次
[SUCCESS] conn database - 第5次
相关推荐
掉进电商坑三年没爬出来的东叔1 小时前
2026最新:青龙面板搭建全自动薅羊毛脚本,云服务器24小时挂机教程
运维·服务器·pygame
ha_lydms1 小时前
MaxCompute中JSON函数
大数据·数据库·阿里云·json·dataworks·maxcompute·odps
東隅已逝,桑榆非晚1 小时前
priority_queue的介绍和使用
c++·经验分享·笔记·学习
驭渊的小故事1 小时前
MyBatis 入门:从 JDBC 到优雅操作数据库(一)
笔记·sql·spring
ggaofeng1 小时前
精简版ssh(去掉认证和加密流程,更清晰的展示远程登录的底层实现)
运维·ssh
量子-Alex1 小时前
【大模型强化学习后训练】强化学习后训练算力应投向何处?模型规模、搜索、学习与反馈
人工智能·学习
0+1111 小时前
Linux --应用层自定义协议与序列化
linux·运维·服务器·网络·tcp
dyxal1 小时前
Linux Crontab 防重复执行利器:flock 文件锁实战详解(脱敏版)
linux·运维·服务器
细嗅蔷薇@1 小时前
DML常见操作
数据库·mysql