近期工作发现很多客户需要配置ssl,因为使用量较大,所以记录一个文档方便复用,也方便其他同事参考
这里我的环境是这样的:
| 内容 | 版本/类型 |
|---|---|
| 操作系统 | Kylin-Server-V10-SP3-2403 |
| CPU | x86_64bit |
| 达梦数据库 | 达梦8 |
通过调整dm.ini中的ENABLE_ENCRYPT参数,可以控制服务端与客户端通信的加密与身份认证行为,修改该参数后需要重启数据库服务才能生效。
dm.ini 中的 ENABLE_ENCRYPT 控制 SSL 加密与认证行为,取值含义如下:
| 取值 | 加密 | 认证 | 说明 |
|---|---|---|---|
| 0 | ✗ | ✗ | 不加密、不认证,默认值 |
| 1 | ✓ | ✓ | 加密+双向认证 |
| 2 | ✗ | ✓ | 仅认证,不加密 |
| 4 | ✓ | ✗ | 仅加密,不认证 |
编辑dm.ini文件,设置以下参数:
ENABLE_ENCRYPT = 1
MIN_SSL_VERSION = 771
其中ENABLE_ENCRYPT取值说明:
修改完成后重启数据库服务:
systemctl restart DmServiceHRSVR
在服务器上创建CA目录并生成根私钥和自签名CA证书:
mkdir -p /opt/ca
cd /opt/ca
openssl genrsa -aes256 -out ca-key.pem -passout pass:Dameng123 2048
openssl req -x509 -new -nodes -key ca-key.pem -sha256 -days 3650 -out ca-cert.pem -subj "/C=cn/ST=hunan/L=changsha/O=dm/OU=dev/CN=dm-ca"
mkdir -p /dm/dmdbms/bin/server_ssl
openssl genrsa -out server-key.pem 2048
openssl req -new -key server-key.pem -out server.csr -subj "/C=cn/ST=hunan/L=changsha/O=dm/OU=dev/CN=server"
openssl x509 -req -in server.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -days 3650 -sha256 -passin pass:Dameng123
客户端证书目录必须以数据库用户名命名,这里以SYSDBA为例:
mkdir -p /dm/dmdbms/bin/client_ssl/SYSDBA
openssl genrsa -out client-key.pem -aes256 -passout pass:Dameng123 2048
openssl req -new -key client-key.pem -out client.csr -subj "/C=cn/ST=hunan/L=changsha/O=dm/OU=dev/CN=SYSDBA"
openssl x509 -req -in client.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem -days 3650 -sha256 -passin pass:Dameng123
将CA根证书拷贝到客户端目录:
cp /opt/ca/ca-cert.pem /dm/dmdbms/bin/client_ssl/SYSDBA/
客户端私钥可以带密码,也可以不带密码:
生成带密码的私钥:
openssl genrsa -aes256 -out client-key.pem -passout pass:Dameng123 2048
生成不带密码的私钥:
openssl genrsa -out client-key.pem 2048
已经生成的私钥可以互相转换。带密码转成不带密码:
openssl rsa -in client-key.pem -passin pass:Dameng123 -out client-key-nopwd.pem
不带密码转成带密码:
openssl rsa -in client-key-nopwd.pem -aes256 -passout pass:Dameng123 -out client-key-enc.pem
私钥的加密与解密只改变文件本身的存储形式,密钥内容不变,因此转换前后的私钥都可以与同一张证书配对使用。
判断私钥是否带密码,可以查看文件开头两行,出现Proc-Type: 4,ENCRYPTED即为带密码:
head -2 client-key.pem
如果私钥与证书不匹配,连接时会报初始化SSL环境失败,具体错误为tls: private key does not match public key。可以通过对比公钥指纹确认。
查看证书的公钥指纹:
openssl x509 -in client-cert.pem -pubkey -noout | openssl md5
查看无密码私钥的公钥指纹:
openssl rsa -in client-key.pem -pubout | openssl md5
查看带密码私钥的公钥指纹:
openssl rsa -in client-key.pem -passin pass:Dameng123 -pubout | openssl md5
两个指纹一致说明私钥与证书配对,不一致则说明私钥用错了,需要更换。
数据库开启SSL后,disql客户端需要加载客户端证书。disql默认从$DM_HOME/bin/client_ssl/用户名/目录下加载证书,因此只要保证DM_HOME环境变量正确,直接连接即可:
export DM_HOME=/dm/dmdbms
export LD_LIBRARY_PATH=/dm/dmdbms/bin:$LD_LIBRARY_PATH
disql SYSDBA/Dameng123@localhost:5237
也可以直接进入安装目录执行,此时不需要设置DM_HOME:
cd /dm/dmdbms/bin
./disql SYSDBA/Dameng123@localhost:5237
如果报错stat private key fail或初始化SSL环境失败,说明disql没有找到证书目录。需要检查:
disql支持通过扩展选项指定证书路径,语法如下:
disql 用户名/密码@主机:端口#"{ssl_path=证书目录,ssl_pwd=私钥密码}"
但是在我的环境下这个命令有一些问题,还在排查为什么
如果客户端证书和数据库不在同一台机器,或者需要临时指定证书路径,可以使用LOGIN交互模式(但是感觉挺繁琐的):
disql /nolog SQL> login
按照提示依次输入:
服务名: localhost:5237
用户名: SYSDBA
密码: Dameng123
SSL路径: /dm/dmdbms/bin/client_ssl/SYSDBA
SSL密码: 123
UKEY名称:
UKEY PIN码:
MPP类型:
是否读写分离(y/n): n
协议类型: TCP
其中SSL密码在私钥没有加密时可以直接回车,或输入任意数字。
SSL是一种网络安全协议,用于在客户端和服务器之间建立安全通信,能够实现数据加密、身份验证,以及保护数据完整性
在数据库领域,普通连接和SSL连接的主要区别是,普通连接在网络上明文传输SQL和账号密码;SSL连接会先建立加密通道,再传业务数据
SSL分为单向认证和双向认证
当数据库切换到SSL/TLS认证模式后,disql和go程序都必须带证书相关参数,否则连不上
单向认证时,客户端主要校验服务端证书是否可信;双向认证时,客户端和服务端会互相校验身份。CA证书的作用就是提供这一层信任关系
文章
阅读量
获赞
