首页 / 资讯中心 / 文章详情

OpenSSL自建CA:为OceanStor 5500 V3签发10年有效期内网证书

OpenSSL自建CA:为OceanStor 5500 V3签发10年有效期内网证书 ★ FEATURED ARTICLE
手里那台OceanStor 5500 V3存储阵列的管理界面最近开始闹脾气了——每次登录浏览器都会弹出一个大红叉的证书错误审计报告里也多了一条“证书有效期不足”的记录。说起来不是什么大故障但放在生产环境里这种界面告警很容易被巡查组抓个正着。与其凑合着点“继续访问”拖延时间不如花半个小时把证书问题一次性解决用Linux终端配合OpenSSL给存储设备签发一张10年有效期的内网证书然后导进设备让浏览器和管理工具都清清爽爽。这篇内容适合正在维护OceanStor 5500 V3或者其他企业级存储阵列的运维工程师、存储管理员也包括那些准备把手头临时自签名证书换成正规内网CA证书的同行。无论你手上是Ubuntu还是CentOS命令基本通用只要OpenSSL版本在1.1.1以上整个流程可以照抄。1. 先搞清楚存储设备证书过期问题是怎么来的1.1 设备出厂自带的证书为什么不可靠存储阵列出厂时为了能开箱即用厂商一般会在生产线上生成一套默认证书或者用统一的测试CA签发一张证书烧进设备。这种证书有几个共同特征绑定的是设备序列号或临时主机名、有效期短常见的是1到3年、没有规范的证书链信息。对用户来说买回来的设备用了一两年之后管理页面开始频繁弹证书告警几乎成了规律。很多团队习惯了“忽略警告继续访问”但这样做的问题在于一是浏览器地址栏始终有红色警告远程排障时忍不了二是如果业务平台通过HTTPS调用存储的接口做自动化管理证书一过期直接导致调用失败影响面比界面告警大得多三是审计巡检时证书失效记录会出现在报告里挨个去解释“不影响业务”很费口舌。所以与其拖到故障发生不如提前把设备证书纳入正规管理。这是存储设备运维里一个很小但很常见的维护项处理好了能省不少后续成本。1.2 为什么选择OpenSSL自建CA而不是买商业证书可能有人会问买一张商业证书不行吗先说结论在大多数存储设备场景下商业证书既难落地又不划算。存储设备的管理地址基本是内网IP比如192.0.2.x网段很多还在独立管理网里公网无法访问。商业证书签发时要做域名所有权验证DV证书至少要求你能证明控制某个公网域名这对内网设备来说压根行不通。即使通过DNS方式勉强验证商业证书默认一年有效期意味着每年都要走一遍申请、审核、替换流程。存储设备本身是“低变更频率”设备一年动一次证书成本和风险都不低。自建CA的思路完全相反我本地搭一套根证书体系给内网IP和内部域名签发证书有效期我自己控制。根证书一次创建之后签发设备证书就是几分钟的命令操作。给OceanStor 5500 V3签一张10年证书完全可行。唯一要付出的代价是让管理员的电脑和跳板机信任这个内网CA根证书装一次就能长期使用。1.3 整体技术链路整个方案就是一条标准的内网证书生产线准备一个Linux跳板机安装OpenSSL。创建本地CA生成CA私钥和根证书有效期10年。为OceanStor 5500 V3生成设备私钥和CSRCSR里带上IP和域名的SAN扩展。使用CA私钥签发设备证书同样设置10年有效期。把设备证书和CA根证书合并成证书链文件。将私钥和证书链导入存储设备。用浏览器和openssl s_client验证结果。关键点在于导入设备的不是孤零零一张证书而是“服务器证书私钥CA根证书”这三个要素的组合缺一个浏览器都不会认。下面的实操部分会一步步把这条链路走通。2. 动手前的准备环境、信息收集与目录规划2.1 在Ubuntu和CentOS上检查OpenSSL版本OpenSSL是Linux系统的常备组件绝大多数发行版默认已安装。先检查版本openssl version如果输出是OpenSSL 1.1.1或更高那么生成CSR时可以直接用-addext参数带SAN扩展非常方便。比如openssl req -new -key device.key -out device.csr -addext subjectAltNameIP:192.0.2.10如果版本是1.0.2这类老版本-addext参数不可用就得改用-extfile指定扩展配置文件。老版本CentOS用户特别容易踩这个坑。安装命令很简单Ubuntu/Debiansudo apt update sudo apt install opensslCentOS 7及以前sudo yum install opensslCentOS 8/Rocky/Streamsudo dnf install openssl实测下来Ubuntu 20.04/22.04、CentOS 7.9后期的OpenSSL版本都满足条件日常处理证书足够。2.2 收集OceanStor 5500 V3的设备信息签发证书前必须先明确三件事管理IP是什么、管理域名是什么、设备系统时间准不准。这些信息直接决定CSR里的CN和SAN字段怎么写。我这次以一台测试存储设备为例记录如下信息项值说明设备型号OceanStor 5500 V3中端企业级存储阵列软件版本V300R003C00不同版本证书导入界面略有差异管理IP192.0.2.10本示例使用文档保留地址现场替换为真实IP管理域名storage.example.com如果设备管理界面注册了DNS填写实际域名HTTPS管理端口8088具体端口以现场设备配置为准设备当前时间需核对时间偏差过大会导致证书有效期误判SAN字段的填写规则如果管理界面一直通过IP访问SAN里必须包含IP如果有时也用域名访问就同时把IP和域名都写上。只写域名不写IP浏览器用IP访问时照样告警“名称不匹配”。2.3 目录规划与密钥参数选择证书操作涉及的私钥、证书、CSR文件比较多建议建一个清晰的目录结构避免几个月后连自己都不记得文件用途mkdir -p /opt/ca/ca mkdir -p /opt/ca/device mkdir -p /opt/ca/archive密钥长度选择上我的建议是CA私钥用4096位设备证书私钥用2048位。CA私钥是整个体系的信任锚用4096更稳妥设备私钥用2048位兼容性最好部分存储设备加密模块对4096位密钥支持有限盲目上高位数反而会导入失败。如果设备确认支持3072位也可以选3072但2048在2025年的内网场景仍足够安全。有效期规划根证书和设备证书都设置-days 3650也就是10年。设备私钥生成时不加任何密码原因后面会说——存储设备的证书导入向导大多不支持读取加密私钥给私钥加密码会导致导入时提示“私钥格式错误”。3. 核心操作用OpenSSL签发10年有效期的设备证书3.1 创建CA私钥和根证书第一步生成CA私钥。因为CA私钥是信任锚必须加密保护我用AES256参数cd /opt/ca/ca openssl genrsa -aes256 -out ca.key 4096执行后系统会提示输入私钥密码输入两遍确认。这个密码必须妥善保管后面每次签发证书都要用到丢失密码等于CA体系直接报废。然后用这个私钥生成自签名的CA根证书有效期10年openssl req -x509 -new -sha256 -key ca.key -days 3650 -out ca.pem \ -subj /CCN/STBeijing/LBeijing/OInternal Storage CA/CNStorage Internal CA参数含义不复杂-x509表示直接输出自签名证书而不是CSR-days 3650就是10年-subj里一次写清楚国家、省份、城市、组织和通用名。其中CNStorage Internal CA会显示在客户端受信任根证书列表里建议起一个一眼能看懂的名字。检查一下生成的根证书openssl x509 -in ca.pem -noout -subject -dates输出里能看到notBefore和notAfter相隔10年说明根证书有效期为10年。根证书生成后建议立刻把ca.key和ca.pem备份到离线存储并删除工作目录以外的临时副本。内网CA私钥一旦泄露攻击者就能签发冒充内网设备的证书比设备告警严重得多。3.2 生成设备私钥与CSR接下来为OceanStor 5500 V3生成设备私钥2048位不加密cd /opt/ca/device openssl genrsa -out oceanstor-5500v3.key 2048 chmod 600 oceanstor-5500v3.key生成CSR时使用-addext带上SAN扩展openssl req -new -sha256 -key oceanstor-5500v3.key \ -out oceanstor.csr \ -subj /CCN/STBeijing/LBeijing/OStorage Dept/CN192.0.2.10 \ -addext subjectAltNameIP:192.0.2.10,DNS:storage.example.com这里有一个实操经验CN字段直接写管理IP。因为很多设备在校验证书时会把访问地址和CN做比对管理界面用IP访问时CN写IP能避免“名称不匹配”。同时把域名写进SAN照顾那些通过DNS访问的场景。如果OpenSSL版本不支持-addext改用下面这种方式先写一个配置文件csr_ext.cnf内容为[req] distinguished_name req_distinguished_name [req_distinguished_name] [req_ext] subjectAltName IP:192.0.2.10, DNS:storage.example.com然后执行openssl req -new -sha256 -key oceanstor-5500v3.key \ -out oceanstor.csr \ -subj /CCN/STBeijing/LBeijing/OStorage Dept/CN192.0.2.10 \ -reqexts req_ext -config csr_ext.cnf检查CSR内容是否包含SANopenssl req -in oceanstor.csr -noout -text | grep -A1 Subject Alternative Name3.3 用CA签发10年有效期的设备证书签发前先准备扩展属性文件ext.cnf这个文件决定了最终证书的关键属性subjectAltName IP:192.0.2.10, DNS:storage.example.com extendedKeyUsage serverAuth keyUsage digitalSignature, keyEncipherment basicConstraints CA:FALSE这三行分别表示证书包含IP和域名的SAN、用途限于服务器身份认证、密钥用途是数字签名和密钥加密、不是CA证书。这样签出来的证书适用范围清晰不会出现“证书用途异常”的告警。执行签发openssl x509 -req -in oceanstor.csr \ -CA /opt/ca/ca/ca.pem \ -CAkey /opt/ca/ca/ca.key \ -CAcreateserial \ -out oceanstor.pem \ -days 3650 -sha256 \ -extfile ext.cnf此时会提示输入CA私钥密码。-CAcreateserial会在CA目录生成ca.srl序列号文件之后每次签发证书序列号自动递增。验证设备证书的有效期、SAN和签发者openssl x509 -in oceanstor.pem -noout -text | grep -E Not Before|Not After|Subject Alternative Name|Issuer再用openssl verify验证证书链完整性openssl verify -CAfile /opt/ca/ca/ca.pem oceanstor.pem输出OK说明设备证书与CA根证书匹配。3.4 组装证书链与备选格式转换存储设备导入证书时通常需要把“设备证书CA根证书”合并成一个证书链文件让客户端在SSL握手时能看到完整信任路径cat oceanstor.pem /opt/ca/ca/ca.pem oceanstor-chain.pem合并后可以用openssl crl2pkcs7之类的方式做进一步检查但更直观的方法是用openssl s_client看握手过程后面验证环节会做。如果设备的导入向导只允许上传单张证书那么先传oceanstor.pem设备证书再单独上传ca.pemCA根证书。如果向导接受证书链直接传oceanstor-chain.pem。部分设备还需要PKCS#12格式把私钥和证书链打包成一个文件openssl pkcs12 -export \ -out oceanstor.pfx \ -inkey oceanstor-5500v3.key \ -in oceanstor-chain.pem \ -password pass:ChangeMe123这个PFX文件导入设备时需要输入密码ChangeMe123只是示例现场务必改成自己的强密码。还有一个DER格式虽然用得少但如果设备明确要求可以用一条命令转换openssl x509 -in oceanstor.pem -outform DER -out oceanstor.der到这里证书签发和转换环节全部完成目录下应该有oceanstor-5500v3.key、oceanstor.pem、oceanstor-chain.pem、oceanstor.pfx这几个关键文件。4. 把证书导入OceanStor 5500 V3的实操过程4.1 导入前先确认设备要求不同软件版本的OceanStor 5500 V3证书导入界面和命令会有差异但核心流程一致进入证书管理模块选择导入填私钥和证书内容确认生效。导入前务必做三件事备份当前设备证书。在证书管理页面找到“导出”或“备份”把现有证书和私钥保存到本地。万一导入失败可以用备份恢复原状。确认设备时间准确。在设备CLI执行时间查看命令或者登录管理界面看系统时间。时间偏差太大会导致新证书被误判为“尚未生效”或“已过期”。阅读设备的证书格式说明。大多数版本支持PEM和PFX少部分版本只支持其中一种。拿不准就先用测试设备演练。4.2 通过DeviceManager图形界面导入登录存储设备的管理IP例如https://192.0.2.10:8088使用管理员账户进入DeviceManager主界面。导航路径在不同版本里略有不同常见位置是“设置” → “安全” → “证书” → “导入”。也有版本放在“系统管理” → “安全证书”里。找到“证书管理”或“证书”入口后选择导入证书。导入界面一般包含几个输入项私钥文件选择oceanstor-5500v3.key服务器证书选择oceanstor.pemCA根证书选择/opt/ca/ca/ca.pem证书链选择oceanstor-chain.pem如果界面只给一个“证书内容”文本框可以用下面命令把文件内容复制出来粘贴进去cat oceanstor.pem私钥文件内容同样可以用cat oceanstor-5500v3.key查看并粘贴。粘贴时注意不要混入多余换行或空格否则设备解析会失败。导入完成后系统通常提示证书已更新部分版本要求重新加载管理服务或注销重新登录才能生效。4.3 通过CLI方式导入如果图形界面打不开或者你习惯用命令行操作可以通过SSH登录存储设备的管理IP使用管理员账户进入CLI。不同版本的CLI命令命名有差异我的操作思路是进入命令行后先执行help查找证书相关关键字比如certificate、cert、import certificate。以我见过的常见命令为例import certificate执行后按提示选择证书文件、私钥文件、指定证书类型确认导入。实际命令用你设备上的帮助信息为准字段名不同没关系关键在于理解“导入证书导入私钥证书链”这个本质。CLI方式适合批量处理和维护脚本化但操作时建议打开日志记录方便导入失败时回溯原因。4.4 验证导入结果导入完成后不急着收工先验证设备是否真的使用了新证书。浏览器访问管理页面看地址栏锁形图标是否恢复为正常状态。命令行验证更可靠echo | openssl s_client -connect 192.0.2.10:8088 -servername storage.example.com 2/dev/null | openssl x509 -noout -subject -dates -issuer重点看输出内容subject是否显示CN192.0.2.10issuer是否显示CNStorage Internal CAnotAfter是否在10年之后如果输出符合预期说明证书已生效。如果端口不是443openssl s_client直接指定端口即可无需额外参数。5. 实战中踩过的坑与排查技巧5.1 证书链不完整的坑有一类问题很典型OpenSSL verify验证通过设备导入也提示成功但浏览器访问时仍然报“证书链错误”。原因多半是服务器在SSL握手时只下发了叶子证书没带CA根证书客户端找不到信任锚。排查方法echo | openssl s_client -connect 192.0.2.10:8088 -showcerts 2/dev/null | grep s:正常情况应看到两个证书第一个是设备证书第二个是CA根证书。如果只看到一个说明设备端配置的证书链文件不完整。解决办法将oceanstor-chain.pem重新导入设备或者在导入界面单独补传CA根证书。部分设备对“合并后的链文件”解析不友好需要分别导入“服务器证书”和“CA证书”这个只能看设备界面提供的字段灵活调整。5.2 浏览器不信任的问题证书链完整但浏览器仍然显示“无法验证此服务器身份”几乎可以断定是客户端没有安装内网CA根证书。自己签发的证书不可能被系统默认信任必须在访问设备的电脑上安装CA根证书。安装方法分三种场景Windows双击ca.pem→ 选择“安装证书” → “本地计算机” → “将所有证书放入下列存储” → 浏览选择“受信任的根证书颁发机构” → 完成。Linuxsudo cp ca.pem /usr/local/share/ca-certificates/然后sudo update-ca-certificates。macOS打开钥匙串访问将ca.pem拖入“系统”钥匙串双击证书把“信任”改为“始终信任”。我在实际维护中会把ca.pem分发到所有需要访问存储设备的跳板机和运维电脑一次性解决多台设备的信任问题。5.3 设备时间不同步导致证书异常证书刚签发导入设备后却提示“尚未生效”或“已过期”这个坑非常隐蔽。根本原因不在证书本身而是设备本地时间和签发时间不一致。存储设备如果没配置NTP运行一段时间后系统时间可能偏掉几个小时甚至几天。证书有效期判断完全参照设备时钟设备时间错误再正常的证书也会被判异常。解决办法先在设备CLI执行日期查看命令确定偏差再到管理界面配置NTP服务器地址等时间同步完成后再导入证书。这个步骤应该在导入前做而不是等出问题后再查。5.4 私钥密码导致导入失败生成设备私钥时如果习惯性加了-aes256参数导入时大概率会碰到“私钥格式错误”或“密码不正确”的提示。原因是存储设备的证书导入向导绝大多数不支持读取加密私钥它要求私钥文件是明文PEM格式。解决办法有两个重新生成一个无密码的设备私钥然后用CA重新签发证书走一遍完整流程。如果设备支持输入私钥密码可以在导入界面填写密码但存储设备通常会忽略这个输入框不推荐依赖它。明文私钥的安全风险要靠权限控制来弥补。私钥文件生成后立刻chmod 600传递时走加密通道不要用明文邮件或共享目录传。5.5 密钥长度兼容性设备证书用了4096位导入时设备提示“密钥长度不支持”或SSL握手失败这种情况在部分老存储设备上出现过。原因在于设备自带的加密模块对RSA 4096处理能力有限甚至某些固件版本在实现RFC规范时只支持到2048位。我的建议是如果设备没明确说明支持更强的密钥设备证书私钥统一定为2048位。CA根证书保持4096位没有问题因为根证书只参与验签不参与每秒多次的握手协商。换用2048位私钥后要重新生成CSR并签发证书openssl genrsa -out oceanstor-5500v3.key 2048 openssl req -new -sha256 -key oceanstor-5500v3.key -out oceanstor.csr -subj /CCN/STBeijing/LBeijing/OStorage Dept/CN192.0.2.10 -addext subjectAltNameIP:192.0.2.10,DNS:storage.example.com openssl x509 -req -in oceanstor.csr -CA /opt/ca/ca/ca.pem -CAkey /opt/ca/ca/ca.key -CAcreateserial -out oceanstor.pem -days 3650 -sha256 -extfile ext.cnf整个过程不复杂几分钟就能重新生成完。5.6 常见问题速查表现象可能原因处理方法导入后浏览器仍告警证书链错误设备未配置CA根证书导入证书链文件或单独上传CA根证书浏览器提示不受信任客户端未安装CA根证书将ca.pem安装到系统受信任根证书存储证书提示尚未生效或已过期设备时间偏差过大配置NTP同步后重新导入证书导入时提示私钥格式错误设备私钥加密受保护重新生成无密码2048位私钥并重新签发设备提示密钥长度不支持RSA 4096兼容性问题设备证书改签2048位管理页面显示旧证书管理服务未重载注销重新登录或重启设备管理服务6. 证书签发完成后的维护习惯6.1 10年期证书不代表可以一劳永逸10年有效期听起来很长但恰恰因为长到期时很容易被遗忘。建议在设备管理日历里创建一个“证书有效期检查”事件设置在证书到期前6个月提醒。别等到浏览器报警才想起来。还有一点要留意设备证书的有效期不能超过CA根证书的有效期。如果根证书只签了10年那么设备证书即使设置了-days 3650实际可用期也会被根证书到期时间截断。工程上把根证书做到10年、设备证书做到不超过根证书期限逻辑上才闭环。6.2 密钥和证书的备份归档整个签发流程产出的关键文件包括CA私钥、CA根证书、设备私钥、设备证书、证书链。建议把这些文件打包加密归档到一个离线位置同时记录一份纸质说明写明密码存放地点。两个副本分开存避免硬盘故障或人员变动导致全部丢失。我自己的习惯是在/opt/ca/archive目录里按日期建子目录比如/opt/ca/archive/2025-04-13/把当次的CA文件、签发后文件、命令记录一起放进去。半年后再回来看任何一次签发纪录都还能复现。6.3 最后说点实操体会这次给OceanStor 5500 V3签发10年证书的过程整个链路走下来就是半小时左右的事情但几个容易翻车的点都在细节里设备时间同步、证书链合并、私钥加密状态、SAN字段完整性。任何一个环节疏忽都会在导入时冒出奇怪报错。我特别想强调的一点是存储设备属于低变更频率设备越简单的方案越稳定。在OpenSSL里能签出来的证书不代表设备一定认在不确定设备兼容性的时候优先选择RSA 2048、PEM格式、不带私钥密码、带完整SAN的证书组合。这套配置在绝大多数存储设备上都能顺利导入等确认设备全家桶都支持更强的算法后再去考虑升级密钥长度。另一个建议是哪怕设备证书已经换成10年有效期每年也抽空用openssl s_client看一眼设备当前证书状态确认私钥没有异常、证书链没有被误操作替换。内网CA体系一旦建立好它就是存储设备安全管理的底座维护好它后续再接入其他设备都只是重复几条命令而已。
阅读完成 · 觉得有帮助?
咨询建站