注册
达梦数据库主备集群配置SSL通信加密
技术分享/ 文章详情 /

达梦数据库主备集群配置SSL通信加密

NULL 2026/05/28 196 0 0

一、概述

达梦数据库的SSL通信加密基于安全套接字层(SSL)协议实现,使用公钥加密体系结合对称密钥加密体系,提供身份认证、数据加密、数据完整性校验等服务。本文档详细介绍如何在达梦主备集群环境中配置SSL通信加密。

二、准备工作

2.1 检查OpenSSL环境

检查OpenSSL是否安装

openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017

2.2 修改OpenSSL配置文件

编辑 /etc/pki/tls/openssl.cnf 文件,修改dir路径:

vim /etc/pki/tls/openssl.cnf
dir = /opt/CA

2.3 创建CA目录结构

创建目录

mkdir -p /opt/CA
cd /opt/CA
mkdir -p certs crl newcerts private server_ssl client_ssl
mkdir -p client_ssl/SYSDBA
echo "01" > serial
touch index.txt index.txt.attr

创建必要文件

echo "01" > serial
touch index.txt index.txt.attr

三、生成SSL证书

3.1 生成CA私钥和根证书

# 进入CA工作目录
cd /opt/CA

# 生成CA私钥(-aes256:使用AES256加密算法,-passout:输出密码,2048:密钥长度)
openssl genrsa -aes256 -passout pass:dameng -out private/cakey.pem 2048

# 生成CA根证书(-new -x509:生成自签名证书,-days:有效期3650天,-key:指定私钥文件)
# -passin:输入私钥密码,-out:输出证书文件,-subj:证书主题信息
openssl req -new -x509 -days 3650 -key private/cakey.pem -passin pass:dameng -out ca-cert.pem -subj "/C=cn/ST=hunan/L=changsha/O=dameng/OU=dev/CN=ca/emailAddress=ca@dm.com"

# 创建软链接(openssl ca命令需要此链接)
ln -sf ../ca-cert.pem private/cacert.pem

3.2 生成服务器端证书

# 进入CA工作目录
cd /opt/CA

# 生成服务器私钥(2048位RSA,无密码,避免数据库启动时交互)
openssl genrsa -out server_ssl/server-key.pem 2048

# 生成证书签名请求文件(-new:新建请求,-key:指定私钥,-out:输出请求文件)
# -subj:指定证书主题(CN为server表示服务器证书)
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签发服务器证书(-batch:非交互模式,-days:有效期3650天)
# -in:输入请求文件,-out:输出证书文件,-cert:指定CA证书
# -keyfile:指定CA私钥,-passin:CA私钥密码,-config:指定配置文件
openssl ca -batch -days 3650 -in server_ssl/server.csr -out server_ssl/server-cert.pem -cert ca-cert.pem -keyfile private/cakey.pem -passin pass:dameng -config /etc/pki/tls/openssl.cnf

# 转换为x509格式证书(某些客户端需要此格式)
openssl x509 -in server_ssl/server-cert.pem -out server_ssl/server.cer

# 拷贝CA根证书到服务器证书目录(客户端验证时需要)
cp ca-cert.pem server_ssl/

3.3 生成客户端证书

# 进入CA工作目录
cd /opt/CA

# 生成客户端私钥(-aes256:AES256加密,-passout:密码dameng,2048位)
openssl genrsa -aes256 -passout pass:dameng -out client_ssl/SYSDBA/client-key.pem 2048

# 生成客户端证书签名请求(CN=SYSDBA,需与数据库用户名一致)
openssl req -new -key client_ssl/SYSDBA/client-key.pem -passin pass:dameng -out client_ssl/SYSDBA/client.csr -subj "/C=cn/ST=hunan/L=changsha/O=dameng/OU=dev/CN=SYSDBA/emailAddress=client@dm.com"

# 使用CA签发客户端证书(有效期365天)
openssl ca -batch -days 365 -in client_ssl/SYSDBA/client.csr -out client_ssl/SYSDBA/client-cert.pem -cert ca-cert.pem -keyfile private/cakey.pem -passin pass:dameng -config /etc/pki/tls/openssl.cnf
 

# 拷贝CA根证书到客户端证书目录
cp ca-cert.pem client_ssl/SYSDBA/

# 将客户端证书和私钥合并为PKCS12格式(Java客户端需要)
# -export:导出PKCS12,-inkey:指定私钥,-passin:私钥密码
# -in:指定证书,-out:输出文件,-passout:PKCS12文件密码
openssl pkcs12 -export -inkey client_ssl/SYSDBA/client-key.pem -passin pass:dameng -in client_ssl/SYSDBA/client-cert.pem -out client_ssl/SYSDBA/client-pkcs.p12 -passout pass:dameng

# 生成JKS格式密钥库(可选,需要Java环境)
# 导入CA证书
keytool -import -alias ca -trustcacerts -file ca-cert.pem -keystore client_ssl/SYSDBA/.keystore -storepass dameng -noprompt

# 导入服务器证书
keytool -import -alias server -trustcacerts -file server_ssl/server.cer -keystore client_ssl/SYSDBA/.keystore -storepass dameng -noprompt

# 导入客户端PKCS12证书
keytool -importkeystore -srckeystore client_ssl/SYSDBA/client-pkcs.p12 -srcstorepass dameng -srcstoretype PKCS12 -keystore client_ssl/SYSDBA/.keystore -storepass dameng

四、部署证书到主备集群节点

4.1 部署服务器证书(每个节点执行)

# 进入达梦数据库bin目录
cd /home/dmdba/dmdbms/bin
# 备份原有server_ssl目录
mv server_ssl server_ssl_bak
# 拷贝新的server_ssl目录
scp -r  /opt/CA/server_ssl/ dm2:/home/dmdba/dmdbms/bin/

4.2 部署客户端证书

将 /opt/CA/client_ssl 目录拷贝到需要连接数据库的客户端机器上。

五、配置主备集群各节点

5.1 修改dm.ini参数

主节点和所有备节点均需执行:
修改 dm.ini 文件:

ENABLE_ENCRYPT = 1

5.2 重启数据库服务

# 每个节点依次重启
DmServiceDAMENG restart

六、客户端连接配置

6.1 使用disql工具连接

方式一:命令行直接连接

disql SYSDBA/'"Test@xxx123"'@192.168.3.249:5236#"{SSL_PATH=/opt/CA/client_ssl/SYSDBA,SSL_PWD=dameng}"

image.png

6.2 JDBC程序连接配置

import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class DmSSLTest {
    public static void main(String[] args) {
        String host = "192.168.3.249";
        String port = "5236";
        String user = "SYSDBA";
        String password = "Test@xxx123";
        String sslPath = "/opt/CA/client_ssl/SYSDBA";

        String url = "jdbc:dm://" + host + ":" + port +
                     "?sslFilesPath=" + sslPath +
                     "&sslKeystorePass=dameng";

        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        try {
            Class.forName("dm.jdbc.driver.DmDriver");
            conn = DriverManager.getConnection(url, user, password);
            System.out.println("SSL连接成功");

            stmt = conn.createStatement();
            rs = stmt.executeQuery("SELECT INSTANCE_NAME  FROM V$INSTANCE;");

            while (rs.next()) {
                System.out.println("实例名: " + rs.getString("INSTANCE_NAME"));
            }

        } catch (Exception e) {
            System.err.println("连接失败: " + e.getMessage());
            e.printStackTrace();
        } finally {
            try { if (rs != null) rs.close(); } catch (Exception e) {}
            try { if (stmt != null) stmt.close(); } catch (Exception e) {}
            try { if (conn != null) conn.close(); } catch (Exception e) {}
        }
    }
}

image.png

6.3 主备集群服务名配置(dm_svc.conf)

# /etc/dm_svc.conf
DM_CLUSTER=(192.168.3.247:5236,192.3.249:5236)
[DM_CLUSTER]
LOGIN_MODE=1
TIME_ZONE=480
LANGUAGE=cn
SSL_FILES_PATH=/opt/CA/client_ssl/SYSDBA
SSL_KEYSTORE_PASS=dameng

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服