最终目标
- 为 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)
-
创建目录并上传文件
- 在服务器上创建目录:
mkdir -p /opt/dmdbms/data/DAMENG/ssl(假设这是你的达梦安装目录,请根据实际情况修改) - 将
ca.crt,server.crt,server.key这三个文件上传到该目录。 - 确保达梦运行用户 (如
dmdba) 对该目录和文件有读取权限:chown -R dmdba:dinstall /opt/dmdbms/data/DAMENG/ssl和chmod -R 600 /opt/dmdbms/data/DAMENG/ssl。
- 在服务器上创建目录:
-
修改
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时设置的那个密码。 - 找到并打开
-
重启达梦数据库服务
- 保存
dm.ini文件。 - 使用 root 用户或 dmdba 用户重启服务:
/opt/dmdbms/bin/DmServiceDMSERVER restart。 - 检查服务状态,并查看日志文件(位于
/opt/dmdbms/log目录)确保没有 SSL 相关的报错。
- 保存
-
检查防火墙
- 确保服务器的防火墙(如
firewalld或iptables)已经开放了 TCP 端口5237。 firewall-cmd --zone=public --add-port=5237/tcp --permanentfirewall-cmd --reload
- 确保服务器的防火墙(如
第三步:配置客户端进行连接
-
准备客户端文件
- 将
ca.crt,client.crt,client.key这三个文件拷贝到客户端机器的一个安全位置,例如C:\dm_certs(Windows) 或/home/user/dm_certs(Linux)。
- 将
-
使用
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)。
-
-
使用 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(); } } }
故障排查清单
如果连接失败,请按以下顺序检查:
-
网络:
ping 172.20.20.32是否通?telnet 172.20.20.32 5237是否能连上(如果能连上但立刻断开,说明端口是通的)? -
防火墙: 服务器的
5237端口是否真的开放了? -
达梦服务: 服务是否在运行?
ps -ef | grep dmserver。达梦日志里有没有 SSL 错误,比如 "password incorrect" 或 "can't read certificate file"? -
证书 Common Name: 再次确认生成
server.crt时,Common Name 输入的是172.20.20.32。 -
文件路径: 服务器
dm.ini和客户端连接字符串里的所有证书/私钥路径是否都是绝对路径且完全正确? -
文件权限: 服务器上的
dmdba用户是否有权限读取 SSL 目录及其中所有文件? -
密码:
dm.ini里的SSL_KEY_PASSWD和客户端连接参数ssl_key_passwd是否与你设置的密码完全一致?有没有多余的空格?