达梦数据库的SSL通信加密基于安全套接字层(SSL)协议实现,使用公钥加密体系结合对称密钥加密体系,提供身份认证、数据加密、数据完整性校验等服务。本文档详细介绍如何在达梦主备集群环境中配置SSL通信加密。
检查OpenSSL是否安装
openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017
编辑 /etc/pki/tls/openssl.cnf 文件,修改dir路径:
vim /etc/pki/tls/openssl.cnf
dir = /opt/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
# 进入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
# 进入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/
# 进入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
# 进入达梦数据库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/
将 /opt/CA/client_ssl 目录拷贝到需要连接数据库的客户端机器上。
主节点和所有备节点均需执行:
修改 dm.ini 文件:
ENABLE_ENCRYPT = 1
# 每个节点依次重启
DmServiceDAMENG restart
方式一:命令行直接连接
disql SYSDBA/'"Test@xxx123"'@192.168.3.249:5236#"{SSL_PATH=/opt/CA/client_ssl/SYSDBA,SSL_PWD=dameng}"
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) {}
}
}
}
# /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
文章
阅读量
获赞
