You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确生成SOAP信封签名的DigestValue与SignatureValue

XMLDSIG中DigestValue与SignatureValue的正确生成步骤

一、DigestValue的生成(以soap:Body为例)

你自己计算的哈希和工具生成的DigestValue不符,核心原因是没做XML规范化处理,XMLDSIG要求必须先对目标节点做规范化再哈希,步骤如下:

  • 对目标节点(soap:Body)执行**Canonical XML(规范化XML)**处理,默认用的是不带注释的C14N标准。这一步会统一XML格式:清除冗余空白、统一属性排序、处理命名空间前缀、移除不必要的声明,确保语义相同的XML生成完全一致的字节流。
  • 用指定的哈希算法(你这里是SHA-1)对规范化后的节点字节流计算哈希值,得到二进制结果。
  • 将二进制哈希值做Base64编码,最终得到的就是<DigestValue>标签里的内容。

如果要验证,可以用xmlsec1先导出规范化后的Body内容:

xmlsec1 --canonicalize --output body_c14n.xml test.xml --xpath "//soap:Body"

然后对body_c14n.xml的内容做SHA-1哈希再Base64,结果就会和工具生成的DigestValue一致。

二、SignatureValue的生成步骤

SignatureValue是对整个<SignedInfo>节点签名后的结果,步骤如下:

  • 构造<SignedInfo>节点,里面包含:签名算法(如SHA1withRSA)、规范化算法(和DigestValue用的一致)、所有要签名的节点引用(<Reference>,包含DigestMethod、DigestValue等)。
  • 对整个<SignedInfo>节点执行相同的规范化处理(C14N),得到标准字节流。
  • 使用你的私钥(private_key.pem),通过指定的签名算法(默认SHA1withRSA)对规范化后的<SignedInfo>字节流进行签名,得到二进制签名数据。
  • 将二进制签名数据做Base64编码,最终就是<SignatureValue>标签里的内容。

内容的提问来源于stack exchange,提问作者Nuvindu Nirmana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 17:04:59