SOAP 主体的 XML 签名

我正在为一个需要soap:body 签名的WS 实现一个客户端。该应用程序是用 Go 编写的,所以我宁愿避免链接到 C。

最大的问题是:如何计算SHA256?摘要算法的输入应该是什么?我假设 "/CJj9686ARgbV/YmDrr+1yhcaJuXu022cADK/M8efQs=" 是后来签名的 SHA256 结果。我尝试了许多规范化 XML 的变体,但没有一个会产生这个哈希值。


慕村9548890
浏览 205回答 3
3回答

守着一只汪

最后,我找到了如何获取所有值。规范化 <SignedInfo><Reference> 中定义的 XML 元素。在这种情况下,它是 <soap:Body> 元素。规范化只添加了肥皂命名空间并添加了结束标签。我在 Go 中生成这些,而 Go 从不生成自闭合标签。从规范化 <soap:Body> 的字符串表示中计算哈希,因为它将在请求中发送。将计算的摘要添加到相应 <Reference> 的 <DigestValue> 中。规范化 <SignedInfo> 并计算它的哈希值。签署此哈希并将值添加到 <SignedValue>。我知道这不是通用方法,但它应该对我有用。C14N 不是必需的,因为如果您注意属性顺序并手动添加命名空间,Go 可以产生相同的结果。

喵喵时光机

参考 XML 示例 CZ00000019.valid.v3.xml(捷克财政当局 EET 的),规范化的 SignedInfo 是:var signedinfoCanon&nbsp;= '<ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'+ '<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">'+ '<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="soap"></ec:InclusiveNamespaces>'+ '</ds:CanonicalizationMethod>'+ '<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"></ds:SignatureMethod>'+ '<ds:Reference URI="#id-A72D6FD4C41B1F545F14700558808234">'+ '<ds:Transforms>'+ '<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">'+ '<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList=""></ec:InclusiveNamespaces>'+ '</ds:Transform>'+ '</ds:Transforms>'+ '<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"></ds:DigestMethod>'+ '<ds:DigestValue>4hn06sSS2yurIiUmWaV36JQJZrwbWf36sG9bOHH/ycM=</ds:DigestValue>'+ '</ds:Reference>'+ '</ds:SignedInfo>'

沧海一幻觉

像这样计算sha256import ("crypto/sha256")var slice = []byte("test")return sha256.Sum256(slice)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go