达梦数据库ssl证书连接


最终目标

  • 为 IP 地址为 172.20.20.32 的达梦数据库服务器配置双向 SSL 加密连接。
  • 证书有效期为 5 年。
  • 私钥文件将设置密码以增强安全性。

第一步:生成所有必需的证书和私钥

在一台装有 openssl 的机器上执行以下命令。

1. 创建 CA 根证书 (有效期 10 年)

# 创建工作目录
mkdir dm_ssl_prod
cd dm_ssl_prod

# 1. 生成 CA 私钥
openssl genrsa -out ca.key 2048

# 2. 生成 CA 根证书 (有效期 10 年)
# 在交互式提示中,可以简单填写信息,Common Name 可以是 "My DM CA" 之类的标识
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt

2. 创建服务器证书 (有效期 5 年,CN 为 IP 地址)

# 1. 生成带密码的服务器私钥
# !!! 执行后会提示你输入并确认密码,请务必记住这个密码 (例如: server_password)
openssl genrsa -aes256 -out server.key 2048

# 2. 生成服务器证书签名请求 (CSR)
# !!! 最关键的一步:当提示输入 "Common Name" 时,必须准确输入 "172.20.20.32"
openssl req -new -key server.key -out server.csr

# 3. 使用 CA 签发 5 年有效期的服务器证书
# !!! 执行此命令时,会提示你输入 CA 私钥 (ca.key) 的密码(如果设置了的话,我们这里没设)
openssl x509 -req -days 1825 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt

检查点: 在 openssl req 这一步,看到 Common Name 提示时,你的输入应该是:
Common Name (e.g. server FQDN or YOUR name) []:172.20.20.32

3. 创建客户端证书 (有效期 5 年)

# 1. 生成带密码的客户端私钥
# !!! 执行后会提示你输入并确认密码,请务必记住这个密码 (例如: client_password)
openssl genrsa -aes256 -out client.key 2048

# 2. 生成客户端证书签名请求 (CSR)
# Common Name 可以是 "dm_client" 或其他任何标识,这里不影响验证
openssl req -new -key client.key -out client.csr

# 3. 使用 CA 签发 5 年有效期的客户端证书
openssl x509 -req -days 1825 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt

完成后,你的 dm_ssl_prod 目录下应该有以下关键文件:

  • 给服务器用: ca.crt, server.crt, server.key (加密的)
  • 给客户端用: ca.crt, client.crt, client.key (加密的)

第二步:配置达梦数据库服务器 (IP: 172.20.20.32)

  1. 创建目录并上传文件

    • 在服务器上创建目录:mkdir -p /opt/dmdbms/data/DAMENG/ssl (假设这是你的达梦安装目录,请根据实际情况修改)
    • ca.crt, server.crt, server.key 这三个文件上传到该目录。
    • 确保达梦运行用户 (如 dmdba) 对该目录和文件有读取权限:chown -R dmdba:dinstall /opt/dmdbms/data/DAMENG/sslchmod -R 600 /opt/dmdbms/data/DAMENG/ssl
  2. 修改 dm.ini 文件

    • 找到并打开 /opt/dmdbms/data/DAMENG/dm.ini 文件。
    • 在文件末尾添加以下配置块:
    # --- SSL CONFIGURATION FOR 172.20.20.32 ---
    SSL_PORT_NUM      = 5237                  # SSL 监听端口,确保未被占用
    SSL_VERIFY_CLIENT = 1                     # 1 表示强制双向认证
    
    # 证书和私钥的绝对路径
    SSL_CERT_PATH     = /opt/dmdbms/data/DAMENG/ssl/server.crt
    SSL_KEY_PATH      = /opt/dmdbms/data/DAMENG/ssl/server.key
    
    # 服务器私钥的解密密码 (替换成你之前设置的真实密码)
    SSL_KEY_PASSWD    = server_password 
    
    # CA 根证书路径,用于验证客户端证书
    SSL_CA_PATH       = /opt/dmdbms/data/DAMENG/ssl/ca.crt
    

    注意: SSL_KEY_PASSWD 必须是你在生成 server.key 时设置的那个密码。

  3. 重启达梦数据库服务

    • 保存 dm.ini 文件。
    • 使用 root 用户或 dmdba 用户重启服务:/opt/dmdbms/bin/DmServiceDMSERVER restart
    • 检查服务状态,并查看日志文件(位于 /opt/dmdbms/log 目录)确保没有 SSL 相关的报错。
  4. 检查防火墙

    • 确保服务器的防火墙(如 firewalldiptables)已经开放了 TCP 端口 5237
    • firewall-cmd --zone=public --add-port=5237/tcp --permanent
    • firewall-cmd --reload

第三步:配置客户端进行连接

  1. 准备客户端文件

    • ca.crt, client.crt, client.key 这三个文件拷贝到客户端机器的一个安全位置,例如 C:\dm_certs (Windows) 或 /home/user/dm_certs (Linux)。
  2. 使用 disql 工具连接

    打开命令行终端,执行以下命令(请将路径和密码替换为你的实际值):

    disql SYSDBA/your_password@172.20.20.32:5237?ssl_ca_path=/path/to/certs/ca.crt&ssl_cert_path=/path/to/certs/client.crt&ssl_key_path=/path/to/certs/client.key&ssl_key_passwd=client_password
    

    参数分解:

    • @172.20.20.32:5237: 连接到服务器的真实 IP 和 SSL 端口。
    • ssl_ca_path: CA 证书路径。
    • ssl_cert_path: 客户端证书路径。
    • ssl_key_path: 加密的客户端私钥路径。
    • ssl_key_passwd: 解密客户端私钥的密码 (client_password)。
  3. 使用 JDBC 连接 (Java 示例)

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.util.Properties;
    
    public class DMSSLConnectionTest {
        public static void main(String[] args) {
            // 服务器 IP 和 SSL 端口
            String url = "jdbc:dm://172.20.20.32:5237";
            
            Properties props = new Properties();
            props.setProperty("user", "SYSDBA");
            props.setProperty("password", "your_password");
            
            // 启用 SSL
            props.setProperty("ssl", "true");
            
            // 客户端证书和私钥的绝对路径 (请替换成你的真实路径)
            props.setProperty("ssl_ca_path", "/home/user/dm_certs/ca.crt");
            props.setProperty("ssl_cert_path", "/home/user/dm_certs/client.crt");
            props.setProperty("ssl_key_path", "/home/user/dm_certs/client.key");
            
            // 客户端私钥的解密密码 (请替换成你的真实密码)
            props.setProperty("ssl_key_passwd", "client_password");
    
            try (Connection conn = DriverManager.getConnection(url, props)) {
                if (conn != null) {
                    System.out.println("成功通过 SSL 连接到达梦数据库 172.20.20.32!");
                }
            } catch (Exception e) {
                System.err.println("SSL 连接失败! 请检查配置。");
                e.printStackTrace();
            }
        }
    }
    

故障排查清单

如果连接失败,请按以下顺序检查:

  1. 网络: ping 172.20.20.32 是否通?telnet 172.20.20.32 5237 是否能连上(如果能连上但立刻断开,说明端口是通的)?
  2. 防火墙: 服务器的 5237 端口是否真的开放了?
  3. 达梦服务: 服务是否在运行?ps -ef | grep dmserver。达梦日志里有没有 SSL 错误,比如 "password incorrect" 或 "can't read certificate file"?
  4. 证书 Common Name: 再次确认生成 server.crt 时,Common Name 输入的是 172.20.20.32
  5. 文件路径: 服务器 dm.ini 和客户端连接字符串里的所有证书/私钥路径是否都是绝对路径且完全正确?
  6. 文件权限: 服务器上的 dmdba 用户是否有权限读取 SSL 目录及其中所有文件?
  7. 密码: dm.ini 里的 SSL_KEY_PASSWD 和客户端连接参数 ssl_key_passwd 是否与你设置的密码完全一致?有没有多余的空格?
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容