ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OpenSSL verify报certificate signature failure:error 7与证书签名排查

OpenSSL verify报certificate signature failure:error 7与证书签名排查 证书能被OpenSSL读出来域名和有效期也像是对的执行verify却报certificate signature failure。这时别急着补SAN也别把证书塞进信任库碰运气。error 7关注的是证书签名验证不是“文件长得像证书”就能过关。本文按错误深度、签发者材料、文件一致性和复验四步排查。一、error 7和“找不到签发者”不是一回事X.509证书包含待签名内容、签名算法和签名值。验证者使用所选签发者的公钥检查签名以确认这些内容与签名是否对应。OpenSSL把certificate signature failure列为证书签名验证失败命令行常见数字为7不要把这个错误号当成进程退出码。error 20通常是构链缺签发者error 62是主机名不匹配。RSA或ASN.1错误栈也要完整保存。解析、构链、验签、用途校验是不同关卡。二、先确认到底是哪张证书失败把收到的叶子证书单独保存为leaf.pem签发链中间证书保存为intermediate.pem事先可信的根证书保存为root.pem。示例使用保留测试域名api.example.test生产排查时替换成实际业务名称不能照抄测试名得出业务结论。openssl version openssl x509 -in leaf.pem -noout -subject -issuer -serial -dates openssl x509 -in leaf.pem -noout -textdepth0指叶子证书depth1通常是它上一级的中间CA继续向上递增。先看错误对应的subject再结合链文件定位。若中间证书签名坏了重签叶子不一定解决问题。注意x509通常只处理输入中的首张证书。对fullchain执行一次x509成功不能证明后续每张证书都正确更不能证明签名有效。这里查看的是字段和编码不是签名验收报告。三、用受控信任材料重跑完整验证openssl verify -no-CApath -CAfile root.pem \ -untrusted intermediate.pem -purpose sslserver \ -verify_hostname api.example.test -show_chain leaf.pem-CAfile提供本次明确选定的信任材料-no-CApath避免默认目录悄悄补链-untrusted提供构链候选不会因为放进去就变成信任锚。示例仍明确验证服务端用途和业务名称避免只修好一处后把其他失败藏起来。不能拿网上随手下载的根证书来“修复”信任。应从CA官方分发渠道或受控交付记录取得材料核对来源与指纹。issuer和候选CA的subject相同只是线索不代表两者公钥一定对应AKI/SKI也属于查找签发者的线索不替代密码学验签。同名不同密钥的CA可能被AKI/SKI排除也可能走到验签失败“同名CA一定报7”不是规律。若报20先修构链问题。四、比较原始交付件而不是凭肉眼看PEM从可信交付记录重新取得同一张证书命名为original.pem。下面只转换和比较公开证书不涉及私钥输出写在专用排查目录避免覆盖已有文件。每条转换命令都应先确认成功再执行比较。openssl x509 -in leaf.pem -outform DER -out received.der openssl x509 -in original.pem -outform DER -out original.der sha256sum received.der original.der cmp received.der original.derPEM换行不同文件哈希可能不同DER却可以相同先分清是“装箱纸”还是证书本体不同。cmp退出0表示文件一致1表示不同其他非零值应按读取错误等情况处理。哈希相同只证明两份材料一致不证明它本来可信。如果DER不同先核对是否确为同一次签发、同一序列号和同一条链不要立刻宣布遭到篡改。重新签发、交叉签名、拿错版本都可能产生不同证书。若确认传输或复制损坏从可信来源重新部署若源材料本身有问题交由签发方核查不要手改Base64或签名字段。五、隔离实验字段可读不等于签名可验本次在临时目录使用OpenSSL 1.1.1k FIPS生成测试根、中间CA和叶子证书未连接生产服务。基线链验证成功只改变叶子证书签名值中的一个字节、保持DER结构可解析后x509仍能显示subject和有效期但verify在depth0报certificate signature failure。另一个负例只改变中间CA的签名值叶子内容不变失败转到depth1。恢复正确中间证书后重新通过。这些结果说明应定位失败对象不能据此推断所有error 7都来自传输损坏。实验还单独覆盖了缺中间证书与错误主机名分别得到20与62没有混为一个原因。受信任自签根还有一个边界OpenSSL默认不检查其自签名-check_ss_sig可要求检查。信任锚可信来自外部信任决策不是“能验证自己的签名”该选项也不是给陌生根证书建立信任的按钮。六、按现象选择下一步观察优先检查不要这样做7depth0叶子原件、所选签发者公钥只补SAN或改有效期7depth1中间CA原件及其上级材料只替换叶子证书20无法取得签发者缺失链、候选与信任锚直接断言签名损坏62hostname mismatch业务名称与证书标识当成error 7修复PEM解析失败格式、边界与输入文件跳过解析直接谈验签七、把退出状态带回自动化流程if openssl verify -no-CApath -CAfile root.pem \ -untrusted intermediate.pem -purpose sslserver \ -verify_hostname api.example.test leaf.pem verify.log 21; then printf offline verification passed\n else rc$? printf verification failed: rc%s; see verify.log\n $rc 2 exit $rc fi这段Bash把输出写入独立日志并把失败退出码传给调用者。重定向本身失败也应阻止流程继续此时应查日志目录权限和磁盘而不是把它当成证书验签错误。不要用关闭验证来把红灯涂绿。本文实验验证的是本机OpenSSL离线链不代表浏览器、Java或Nginx加载已经验收。实际库版本、算法策略和信任库可能不同。若错误来自TLS握手还要分别检查证书链签名与握手签名算法不能把no suitable signature algorithm直接归为error 7。八、修复后的验收清单留存完整错误、版本、depth与材料来源不公开私钥、密码或内部业务信息。对照可信原件确认叶子和中间链身份完整验证退出0且用途与名称匹配。按变更流程重新部署在真实终点、真实SNI及目标客户端信任库下验证TLS离线通过只是其中一步。保留修复前后证书指纹与日志确认没有靠扩大信任范围或关闭验证绕过问题。参考OpenSSL verify文档、OpenSSL x509文档、RFC 5280证书结构与路径验证。新环境按对应版本文档复核。
返回列表