注册
达梦数据库 ENABLE_ENCRYPT行为验证
技术分享/ 文章详情 /

达梦数据库 ENABLE_ENCRYPT行为验证

NULL 2026/05/29 224 0 0

1 参数概述

ENABLE_ENCRYPT 是达梦数据库 dm.ini 中的静态参数,用于控制服务端与客户端之间通信链路的 SSL/TLS 加密与身份认证行为。修改该参数后必须重启数据库服务才能生效。
dm.ini 中的 ENABLE_ENCRYPT 控制 SSL 加密与认证行为,取值含义如下:

取值 加密 认证 说明
0 不加密、不认证(默认)
1 加密+双向认证(标准安全模式)
2 仅认证,不加密
4 仅加密,不认证)

2 验证脚本

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

public class DamengEncryptCompleteTest {
    static String host = "192.168.3.251";
    static String port = "5236";
    static String user = "SYSDBA";
    static String pwd = "Test@xxx123";
    static String sslPath = "/opt/CA/client_ssl/SYSDBA";
    static String sslPwd = "dameng";

    public static void main(String[] args) {
        if (args.length == 0) {
            System.out.println("用法: java DamengEncryptCompleteTest true   (携带证书)");
            System.out.println("      java DamengEncryptCompleteTest false  (不携带证书)");
            return;
        }
        boolean useCert = Boolean.parseBoolean(args[0]);
        test(useCert);
    }

    static void test(boolean useCert) {
        String url = "jdbc:dm://" + host + ":" + port;
        if (useCert) {
                url += "?sslFilesPath=" + sslPath + "&sslKeystorePass=" + sslPwd;
        }
        try (Connection conn = DriverManager.getConnection(url, user, pwd);
             Statement stmt = conn.createStatement()) {
            try (ResultSet rs = stmt.executeQuery("SELECT 1 FROM V$VERSION;")) {
                System.out.println("连接成功");

            }
        } catch (Exception e) {
            System.out.println("连接失败:" + e.getMessage());
        }
    }
}

3. 验证过程


一、ENABLE_ENCRYPT = 0(不加密、不认证)

1.1测试步骤与结果

1.不携带客户端证书

java -Djavax.net.debug=ssl:handshake:verbose -cp .:$DM_JDBC DamengEncryptCompleteTest false 

image.png

2.携带客户端证书

java -Djavax.net.debug=ssl:handshake:verbose -cp .:$DM_JDBC DamengEncryptCompleteTest true

image.png

3.抓包验证

tcpdump -i ens33 port 5236 -A

image.png

1.2 结论
取值为 0 时,无论客户端是否提供 SSL 参数,所有通信均为明文,不进行任何加密或身份认证。


二、ENABLE_ENCRYPT = 1(加密 + 双向认证)

2.1 测试步骤与结果
1.不携带客户端证书

java -Djavax.net.debug=ssl:handshake:verbose -cp .:$DM_JDBC DamengEncryptCompleteTest false

image.png

2.携带客户端证书

java -Djavax.net.debug=ssl:handshake:verbose -cp .:$DM_JDBC DamengEncryptCompleteTest true

image.png

3.抓包验证

tcpdump -i ens33 port 5236 -A

image.png
2.2 结论
取值为 1 时,强制要求 SSL 加密和双向证书认证。客户端必须提供有效证书,服务端证书也必须完整部署,否则连接被拒绝。


三、ENABLE_ENCRYPT = 2(仅认证、不加密)

3.1 测试步骤与结果
1.不携带客户端证书

java -Djavax.net.debug=ssl:handshake:verbose -cp .:$DM_JDBC DamengEncryptCompleteTest false

image.png

2.携带客户端证书

java -Djavax.net.debug=ssl:handshake:verbose -cp .:$DM_JDBC DamengEncryptCompleteTest true

image.png

3.抓包验证

tcpdump -i ens33 port 5236 -A

image.png

3.3 结论
取值为 2 时,仅进行双向证书认证,不加密传输数据。客户端必须提供证书,但通信内容在抓包中可见。


四、ENABLE_ENCRYPT = 4(仅加密、不认证)

4.1 测试步骤与结果
1.不携带客户端证书

java -Djavax.net.debug=ssl:handshake:verbose -cp .:$DM_JDBC DamengEncryptCompleteTest false

image.png
image.png

2.携带客户端证书

java -Djavax.net.debug=ssl:handshake:verbose -cp .:$DM_JDBC DamengEncryptCompleteTest  true

image.png
image.png

3.抓包验证

tcpdump -i ens33 port 5236 -A

image.png

4.2 结论
取值为 4 时,仅对通信数据加密,客户端可以不带证书,不进行身份认证。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服