如何正确生成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
相关产品推荐
相关产品推荐

