ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

达梦数据库SSL通信加密配置指南:从证书签发到客户端连接全流程

达梦数据库SSL通信加密配置指南:从证书签发到客户端连接全流程 达梦数据库配置SSL通信加密干了这么多年数据库运维我一直觉得有个事挺魔幻的不少单位把达梦数据库当成核心资产供着防火墙、入侵检测、堡垒机层层设防结果打开数据库连接一看账号密码和业务数据在网络上全是明文传输。换句话说内网里但凡有个能抓包的主机你的核心数据就跟没穿衣服在大街上溜达一样这可不是危言耸听。这也是我今天想跟你好好聊聊达梦数据库SSL通信加密配置的原因。这篇文章要解决的问题很明确让你从零开始把达梦数据库的客户端与服务端之间的通信从明文升级成SSL加密。我会把证书体系怎么建、服务端怎么配、客户端怎么连、报错了怎么查一条线全部拉通。适合DBA、运维工程师、安全合规人员以及那些正被等保测评折腾得焦头烂额的朋友参考。1. 为什么必须给达梦配SSL先算清楚这笔安全账1.1 明文通信的隐患远比你想的严重大家平时对数据库的关注点基本都在SQL性能调优、备份恢复、高可用切换这些事上很少有人会去抓一把数据库链路上的流量看看。我以前也没在意直到有次做安全演练用Wireshark在交换机的镜像端口上抓了五分钟包结果惊呆了客户端连达梦数据库之后执行的所有SQL语句、传的参数、甚至登录时的账号口令全都明晃晃地躺在数据包里。你不需要任何高端技巧只要会看TCP流的Follow功能就能读出来。这里面的风险有多大不用我多说。等保三级测评里通信加密和完整性校验是明确要求项。如果你负责的系统要过等保数据库链路明文传输这一条迟早会被拎出来整改。而且现在很多单位的内网也并不是绝对安全横向渗透的成本远比很多人想象的低。一旦攻击者拿下一台跳板机他不需要直接打你的数据库只需要在链路上等着你的业务系统跟数据库交互数据就自动送上门了。1.2 SSL到底保护了什么三个核心能力SSL/TLS用在数据库链路上核心解决三件事。第一是机密性。所有SQL语句和结果集在网络上传输前都会加密抓包抓到的全是密文没有私钥根本解不开。第二是完整性。TLS协议里有MAC校验机制数据在传输过程中一旦被篡改接收方立刻能发现防止中间人往SQL语句里注入恶意内容。第三是身份认证。通过数字证书客户端可以确认自己连的确实是目标服务器而不是某个伪装的假数据库服务器也能校验客户端的身份这就叫双向认证。1.3 达梦SSL方案整体设计思路达梦数据库对SSL的支持不是某个单独的组件而是内建在数据库通信层里的能力。整体配置思路不复杂我先给你画个宏观路径先搭一套证书体系用OpenSSL生成CA根证书再用CA去签发服务端证书和客户端证书然后把这些证书部署到达梦服务器上修改dm.ini里的SSL配置参数重启数据库最后在客户端连接时指定证书和密钥完成SSL握手。这个方案选型有几个好处。一是证书体系自建不依赖商业CA机构完全可控可以设置很长的有效期不需要每年续费二是达梦原生支持不需要额外装插件或者改源码三是采用双向认证安全性比单向认证高一个等级客户端和服务器彼此都验明正身这在等保场景里是非常加分的设计。后面所有步骤都是围绕这条主线展开的。2. 证书体系搭建用OpenSSL从零签发可信证书2.1 工作目录规划与准备搭证书体系之前先把目录规划好。我习惯在Linux服务器上建一个专门的目录来放所有证书材料比如/opt/dm_ssl下面分几个子目录ca放CA私钥和根证书server放服务端证书相关文件client放客户端证书相关文件。这样做的目的是把不同角色的证书隔离管理避免后面混淆。mkdir -p /opt/dm_ssl/{ca,server,client} cd /opt/dm_ssl准备工作就一样东西OpenSSL。几乎所有的Linux发行版都自带Windows下也可以装Git自带的OpenSSL或者去官网下载。可以用openssl version检查一下版本1.1.1以上基本都没问题。2.2 生成CA根证书私钥和自签名证书证书体系的信任源头是CA根证书整个体系里最先诞生的就是它。第一步生成CA的私钥这里我使用2048位的RSA密钥实际生产环境有些等保要求用2048位以上那就用4096位性能开销差别不大openssl genrsa -out /opt/dm_ssl/ca/ca.key 4096私钥生成之后一定要设置文件权限只允许root或者专用账号读取这一步很多人会忽略chmod 600 /opt/dm_ssl/ca/ca.key然后用这个私钥生成CA的自签名证书。所谓自签名就是自己给自己签发证书CA是整个信任链的源头没有上级机构给它签字只能自己签自己openssl req -new -x509 -days 3650 -key /opt/dm_ssl/ca/ca.key -out /opt/dm_ssl/ca/ca.crt -subj /CCN/STBeijing/LBeijing/OExampleOrg/OUITSecurity/CNDM-SSL-CA这里的-subj参数是证书的主题信息。CN字段我填的是DM-SSL-CA表示这是达梦SSL体系的根证书。有效期设了十年因为CA是信任锚没必要频繁更换换CA意味着所有下级证书全都要重签。这个证书生成之后服务端和客户端都要把它配置为信任的根证书。2.3 签发服务端证书服务端证书是装到达梦数据库服务器上的用来证明服务器的身份并且承载服务器端的公钥。签发过程分两步走先生成服务端私钥和证书请求再用刚刚建好的CA去给这个请求签名生成正式的证书。# 生成服务端私钥 openssl genrsa -out /opt/dm_ssl/server/server.key 2048 # 生成证书签名请求 openssl req -new -key /opt/dm_ssl/server/server.key -out /opt/dm_ssl/server/server.csr -subj /CCN/STBeijing/LBeijing/OExampleOrg/OUDatabase/CNdm-server # 用CA签署服务端证书 openssl x509 -req -days 3650 -in /opt/dm_ssl/server/server.csr -CA /opt/dm_ssl/ca/ca.crt -CAkey /opt/dm_ssl/ca/ca.key -CAcreateserial -out /opt/dm_ssl/server/server.crt服务端证书的CN字段需要注意一下在双向认证场景下有的达梦版本或者客户端会校验证书CN与服务器主机名的映射关系。如果客户端用IP访问CN里写IP是最稳的如果用主机名访问CN里就写主机名。这个细节往小了说是个规范问题往大了说会影响握手是否成功。建议在规划阶段就把服务器的主机名、IP、访问方式定好证书里的CN跟访问方式保持一致。2.4 签发客户端证书客户端证书是装在各种连接终端上的包括disql、JDBC应用、Navicat等。生成过程和服务器证书完全对称# 生成客户端私钥 openssl genrsa -out /opt/dm_ssl/client/client.key 2048 # 生成客户端证书请求 openssl req -new -key /opt/dm_ssl/client/client.key -out /opt/dm_ssl/client/client.csr -subj /CCN/STBeijing/LBeijing/OExampleOrg/OUClient/CNdm-client # 用CA签署客户端证书 openssl x509 -req -days 3650 -in /opt/dm_ssl/client/client.csr -CA /opt/dm_ssl/ca/ca.crt -CAkey /opt/dm_ssl/ca/ca.key -CAcreateserial -out /opt/dm_ssl/client/client.crt这里我给客户端的CN起的名字是dm-client。在达梦的双向SSL认证里有些版本会校验客户端证书的CN是否对应一个数据库用户也就是说CN最好跟数据库登录用户名保持一致比如你要用SYSDBA登录客户端证书的CN就设成SYSDBA。这一点不同版本行为不太一样稳妥的做法是先按CN对应数据库用户名来发证书避免踩到隐藏校验的坑。2.5 校验证书文件证书都生成完之后强烈建议先做一步本地校验避免把损坏的证书文件配到生产环境里。用下面几条命令可以快速检查证书的完整性和内容# 查看服务端证书内容 openssl x509 -in /opt/dm_ssl/server/server.crt -text -noout # 验证证书是否由CA签发 openssl verify -CAfile /opt/dm_ssl/ca/ca.crt /opt/dm_ssl/server/server.crtopenssl verify如果输出OK说明证书链是通的。这个动作只需要几秒钟但能在配置阶段帮你挡掉大量排查时间。我见过太多人证书文件路径写错了或者证书明明是自签名的却拿去当CA验证折腾半天原来是这步没做。3. 服务端开启SSLdm.ini参数配置与数据库重启3.1 部署证书文件到达梦服务器证书签好之后先把服务端证书和私钥拷贝到数据库服务器上。Darwin数据库服务端需要的核心文件是服务端证书server.crt和服务端私钥server.key同时一般也建议把CA根证书ca.crt一起放过去方便服务端校验客户端证书时使用。我建议在达梦数据目录下建一个专用的ssl子目录比如# 假设达梦数据目录是 /dm/data/DAMENG mkdir -p /dm/data/DAMENG/ssl cp /opt/dm_ssl/server/server.crt /dm/data/DAMENG/ssl/ cp /opt/dm_ssl/server/server.key /dm/data/DAMENG/ssl/ cp /opt/dm_ssl/ca/ca.crt /dm/data/DAMENG/ssl/ chmod 600 /dm/data/DAMENG/ssl/server.key文件权限一定要收好。私钥文件要是被其他操作系统账号读取了SSL体系就形同虚设攻击者拿到私钥就能解密所有密文流量。这一步不只是规范问题是安全底线。3.2 修改dm.ini中的SSL参数达梦服务端的SSL开关在dm.ini里配置。先用ps -ef | grep dmserver找到数据库进程然后在/proc/进程PID/cwd/下或者通过show parameter找到dm.ini的实际路径。下面是配置SSL相关的几个关键参数SSL_PATH /dm/data/DAMENG/ssl SSL_PWD 你的私钥密码 COMMIT_SSL 1这组参数的含义是SSL_PATH指定存放证书文件的目录达梦会从该目录下按固定文件名规则读取证书和私钥SSL_PWD是私钥密码记住这里是用来解开私钥的密码不是数据库用户的登录密码COMMIT_SSL是总开关设为1表示启用SSL通信加密。注意不同版本的达梦数据库dm.ini里SSL参数名可能存在细微差别有的版本还支持SSL_CIPHER来指定加密套件。配置之前一定以你当前版本的《达梦数据库管理员手册》或dm.ini里的注释说明为准。手册里会明确列出该版本支持哪些SSL相关参数照着填最保险。另外还要检查一下证书文件名是否匹配达梦的预期。据我接触过的版本达梦对证书文件名有约定通常是固定读取server.crt、server.key、ca.crt这类名字。如果你的证书名字不一样要么改成约定文件名要么在配置里指定准确的路径和文件名。3.3 重启数据库服务并确认SSL生效修改dm.ini之后需要重启达梦数据库服务才能让配置生效。重启之前先确认一下有没有正在跑的业务选个变更窗口执行# 使用达梦自带的服务脚本重启 systemctl restart DmServiceDMSERVER # 或者直接用内置工具 /dm/dmdbms/bin/DmServiceDMSERVER restart重启完先确认数据库起来了ps -ef | grep dmserver /dm/dmdbms/bin/disql SYSDBA/密码localhost:5236登录成功后用达梦的系统视图确认是否已进入SSL模式。这个查询语句在不同版本可能略有差异常见的是查V$PARAMETER或者专门的SSL视图看COMMIT_SSL参数的值是否为1SELECT * FROM V$PARAMETER WHERE NAME LIKE %SSL%;如果输出显示SSL相关参数已开启说明服务端已经成功加载了证书并准备接受SSL连接。这里我再提醒一句开启SSL之后只要客户端支持SSL协议且服务端证书被信任正常的连接流程不会受影响反过来那些不支持SSL的旧客户端或者证书不受信任的客户端连接就会开始报错。这在切换期是个常见现象尤其是业务系统多、客户端类型杂的环境里建议分批灰度切换。4. 客户端连接适配从disql到JDBC全场景实操4.1 disql命令行工具连接服务端开启SSL之后客户端如果还按老方式直接连通常是连不上的会提示类似no required ssl certificate was sent之类的错误。disql作为达梦的原生命令行工具需要在连接时显式指定SSL相关参数。我常用的连接格式是这样的disql SYSDBA/密码localhost:5236?ssltruessl_ca/opt/dm_ssl/ca/ca.crtssl_cert/opt/dm_ssl/client/client.crtssl_key/opt/dm_ssl/client/client.key参数含义是按顺序来的ssltrue开启SSL连接ssl_ca指定信任的CA根证书路径ssl_cert指定客户端证书ssl_key指定客户端私钥。这些参数跟在连接串后面的方式跟很多数据库客户端指定SSL参数的习惯一致。如果报证书验证失败优先检查CA路径和客户端证书是否配对。ssl_cert和ssl_key必须是一对用错了文件就会直接握手失败。4.2 JDBC应用连接配置Java应用通过JDBC连达梦配置SSL有两种路线一种是在JDBC连接URL里直接带SSL参数另一种是通过Java的SSLContext编程式加载证书。日常运维中改URL是最快的。达梦JDBC驱动的连接串写法大致如下jdbc:dm://192.168.1.100:5236?ssltruesslTrustStore/opt/dm_ssl/client/truststore.jkssslTrustStorePasswordchangeitsslKeyStore/opt/dm_ssl/client/keystore.jkssslKeyStorePasswordchangeit这里有一步关键的转换Java生态里SSL证书一般不用PEM格式而是要用JKS或者PKCS12格式的密钥库。需要把前面生成的PEM证书导入到密钥库文件中。用Java自带的keytool命令可以完成这个转换# 创建服务端信任库把CA证书导入 keytool -import -alias dmca -file /opt/dm_ssl/ca/ca.crt -keystore /opt/dm_ssl/client/truststore.jks -storepass changeit # 创建客户端密钥库把客户端证书和私钥导入 openssl pkcs12 -export -in /opt/dm_ssl/client/client.crt -inkey /opt/dm_ssl/client/client.key -out /opt/dm_ssl/client/client.p12 -name dmclient keytool -importkeystore -srckeystore /opt/dm_ssl/client/client.p12 -srcstoretype PKCS12 -destkeystore /opt/dm_ssl/client/keystore.jks -deststoretype JKS -deststorepass changeit重点说一下truststore.jks用来存放你信任的CA根证书作用是验证服务端身份keystore.jks用来存放客户端自己的证书和私钥作用是向服务端证明客户端身份。这两个文件一个都不能少少了就会在SSL握手阶段报错。接入新业务系统时把这套文件和连接串模板交给开发让他们配到应用配置中心里就行。4.3 图形化工具连接很多DBA日常用图形化工具管理达梦比如达梦自带的数据库管理工具或者Navicat这类第三方工具。这些工具一般都在连接属性的高级选项里提供SSL开关你只要在界面上找到类似使用SSL的勾选框然后把CA证书、客户端证书、客户端私钥三个文件的路径填进去就行。实操中的经验是图形化工具的SSL配置项位置比较隐蔽每个版本还不一样需要耐心翻一翻。比如达梦自带的工具我记得SSL相关的选项在连接配置的高级或者安全分页里。第三方工具对SSL协议的支持程度参差不齐有的只支持单向认证这时候要么给数据库关掉双向认证要么换用达梦官方工具连接。建议重要的生产变更操作还是用disql或者JDBC这样可控的方式去执行图形化工具更多用于日常查询和开发调试。4.4 密码信封与密钥文件的安全保管SSL配置里涉及大量的私钥文件和密码参数这里再插一个安全提醒。像JDBC连接串里的sslTrustStorePassword、sslKeyStorePassworddisql命令行里的ssl_key路径这些敏感信息不要直接硬编码在代码里或者写在公共文档里。生产环境建议用配置中心、密钥管理系统或者环境变量来管理这些机密信息。密钥库文件本身也不要提交到Git仓库要像管理数据库密码一样管理它们。我见过不止一次应用代码仓库里躺着一个带密码的keystore文件等于把自己家的钥匙挂在门口。5. 踩坑实录SSL配置常见问题与排查技巧5.1 典型报错信号与处理对照达梦SSL配置过程中会踩到很多坑我把这几个月帮客户排查时遇到的典型问题整理成了一张速查表遇到同类报错直接按表操作报错信息含义优先排查方向no required ssl certificate was sent服务端要求客户端提供证书但客户端没发客户端是否配置了证书和私钥证书CN是否正确ssl recv: 服务器不支持ssl请检查服务器配置客户端要求SSL但服务端没开启检查dm.ini里COMMIT_SSL是否设为1服务是否重启unable to get local issuer certificate无法找到证书签发者客户端有没有把CA根证书加入信任库certificate verify failed证书校验失败证书链是否完整客户端时间是否准确connection refused连接被拒绝端口是否正常监听防火墙是否放行SSL connection required, but not provided by server服务端要求SSL但客户端未提供客户端连接串里是否加了ssltrue5.2 案例一证书文件权限导致的启动失败有次我给客户配达梦SSL证书生成没问题dm.ini参数也改好了结果重启数据库服务直接失败查看日志发现报的是加载私钥失败。当时排查了很久最后发现是server.key文件的属主是root而达梦服务是用dmdba用户跑的dmdba根本读不了这个私钥文件。解决方法很简单把证书文件属主改过来chown dmdba:dinstall /dm/data/DAMENG/ssl/* chmod 600 /dm/data/DAMENG/ssl/server.key这类问题非常隐蔽因为它不直接报Permission denied而是报成load private key failed。排查SSL配置问题第一件事先检查文件权限再看路径最后才看参数顺序不能乱。5.3 案例二Java客户端报证书链不完整另一个常见场景是Java应用接入时报unable to find valid certification path to requested target。这个报错看起来像证书坏了实际原因是JDK的信任库cacerts里没有达梦服务器的CA证书。Java不会像浏览器那样默认信任所有证书它只看JRE/lib/security目录下的cacerts文件。解决思路有两条要么把我们的CA证书导入到JVM的全局信任库要么在应用启动参数里指定一个自定义信任库java -Djavax.net.ssl.trustStore/opt/dm_ssl/client/truststore.jks \ -Djavax.net.ssl.trustStorePasswordchangeit \ -jar your-dm-app.jar用自定义信任库的方式更干净不会影响JVM上其他应用的安全配置。我当时帮客户处理时就是在应用启动脚本里加了两行JVM参数然后把truststore文件放到指定路径问题就解决了。5.4 案例三openssl verify能过但连接仍失败还有一种很折磨人的问题本地用openssl verify验证证书链是OK的但真实连接时就是握手失败。这种情况我排查过几次主要原因出在版本兼容性上。比如达梦老版本对TLS版本的支持范围比较窄而OpenSSL新版默认启用TLS 1.3两边的加密套件和协议版本对不上握手就僵住了。这种问题的排查思路是先把TLS协议版本和加密套件拉齐。可以在客户端配置里显式指定使用TLS 1.2让两边有个共同的基准。同时检查CA证书的密钥用法扩展确保CA:TRUE服务端证书要带Digital Signature和Key Encipherment这些关键用法。证书生成时如果没有加扩展项某些严格的TLS实现会直接拒绝握手。经验之谈SSL配置的问题排查本质上是一个链路排查过程。从服务端证书文件到客户端信任库到协议版本匹配再到应用参数传递任何一环断了都会在握手阶段以各种奇奇怪怪的报错形式暴露出来。不要急着看报错字面意思先画一条CA - 服务端证书 - 客户端信任 - 协议匹配的链路按顺序排查效率最高。5.5 关于证书有效期管理证书体系建好之后有效期管理是个长期话题。自建CA签发的证书一般都设置了几年甚至十年的有效期很容易被遗忘在后面。建议在证书到期前至少一个月做个提醒机制最简单的办法是用监控系统定期扫描证书文件的有效期或者用OpenSSL写脚本检查openssl x509 -in /dm/data/DAMENG/ssl/server.crt -noout -enddate把这条命令的结果接到告警平台里到期前自动发通知。真到过期那天再发现数据库链路就会因为SSL握手失败直接断掉影响范围很大。别问我怎么知道的说多了都是泪。6. 从合规到日常SSL加密之后的运维习惯调整开启SSL之后日常运维习惯也要跟着调整。首先所有原来通过纯命令行直连数据库的脚本都要把SSL参数加上否则变更窗口一执行就报错。建议把所有业务系统的连接串模板统一收口做一个标准化的配置文档分发给各个应用团队新系统上线直接套模板避免遗漏。其次网络层的排查工具也要升级。以前排查数据库慢查询可以在数据库服务器上用tcpdump抓包看执行时间启用SSL之后抓到的全是密文再用老方法看SQL内容就不行了。遇到此类排查需求要么在数据库端开审计日志要么在应用端打印SQL执行耗时用链路之外的手段去定位问题不能依赖抓包了。另外加密是有代价的。SSL加解密会消耗一定的CPU资源特别是频繁短连接的场景下握手开销会更明显。配置完SSL之后建议观察几天的数据库CPU使用率如果上升比例过大可以考虑调整应用侧的连接池配置比如加大连接复用时间减少频繁建连。多数情况下达梦对SSL的支撑效率还是不错的常规业务负载的CPU增量可以接受。数据库安全不是配完一个SSL就万事大吉了通信加密只是整个安全体系中的一环。口令强度、账号权限最小化、审计日志、备份加密每一块都需要跟上。SSL配置完成后我通常会顺手检查一遍达梦的默认密码策略、远程访问权限和登录失败锁定策略把基础安全配置一起补齐。安全建设是个持续过程但通信加密这一步是所有环节里最不能省的一层。一次配置长期受益。
返回列表