【问题标题】:I am signing WS-Security Soap request with SignedXML, but having trouble matching SOAPUI signature value我正在使用 SignedXML 签署 WS-Security Soap 请求,但在匹配 SOAPUI 签名值时遇到问题
【发布时间】:2019-10-21 22:28:09
【问题描述】:

我正在升级以前实现 WS-Security 的 WCF 客户端。该服务以前只需要一个有效的证书和一个 UsernameToken。提供者改变了他们的要求,现在,除了以前的 WS-Security 元素之外,现在还需要一个 Timestamp 元素,并且仅对该元素进行数字签名。

我实际上相信我的增强功能实施得相当好。请求“看起来不错”,包括签名。但该服务不接受该请求。它没有说明原因。但我已经确定这是签名。

我可以使用 SOAP-UI 成功发送请求。我的信念是,因为我只对时间戳元素进行签名,所以我应该能够提供(用于测试目的)与 SOAP-UI 中使用的 wsu:Id、wsu:Created 和 wsu:Expires 相同的值请求(知道这些值是陈旧的)并且能够生成与 SOAP-UI 生成的相同的签名值和参考摘要值。

这是一个有效的假设吗?

对这个假设的一个挑战是,如果我将整个 SOAP 信封导入到 SignedXML 对象中,我得到的两个散列值与我只导入 wsse:Security 元素时得到的值不同。这让我感到惊讶,因为每种情况下的签名过程都正确识别了 wsu:Timestamp 元素。

通过正确识别 wsu:Timestamp,我的意思是 GetElementId() 方法的重载是在调用时找到 wsu:Timestamp。

如果这些基本问题表明我走在正确的轨道上,我将包含我已实现的实际代码:

我已覆盖 GetIdElement 以确保 wsu:Id 被识别。

我正在使用 Framework 4.7.1 和 GetRSAPrivateKey()(来自允许导出私钥的证书的导入)来获取签名密钥。

我创建了对 wsu:Timestamp 元素的引用:

<Reference URI="#TS-62B6909D4542C911A415716590862947">
    <Transforms>
      <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
         <InclusiveNamespaces PrefixList="wsse wsu cmaw s soapenv xsd"
                xmlns="http://www.w3.org/2001/10/xml-exc-c14n#" />
      </Transform>
    </Transforms>
    <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
            <DigestValue>TtV9lso1WsMvwhiiKPADpYshmJcb95NZOj6BkuV5UmI=</DigestValue>
</Reference>

我用过:

CryptoConfig.AddAlgorithm(typeof   (RSAPKCS1SHA256SignatureDescription), "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256");

signedXML.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl;

我在引用 URL 的开头有“#”(实际引用中没有“#”。

无论如何,我的第一个问题是,我是否应该期望能够在受控测试(陈旧值)中匹配有效的 SOAP-UP 签名,以及导入整个肥皂信封应该产生与导入不同的签名是否合理只是 wsse:Security 元素(我正在使用 Message Inspector 来生成 wsse:Security 元素,并且没有找到其他方法,我无法访问整个信封以提供给 SignedXML。

注意:我在这里和其他地方查看了许多解释如何签署消息的好文章。但我目前的挑战是获得一个有效的签名——我希望这只是意味着匹配 SOAP-UI。

对此有什么想法?

【问题讨论】:

    标签: c# wcf ws-security


    【解决方案1】:

    我最终确定,当 SignedXml 使用整个 SOAP 信封时计算的签名值与 SignedXml 仅使用子集时计算的签名值不同。我不明白为什么会这样,因为我只签署了 Timestamp 元素,这两种情况都存在并且被 SignedXml 正确定位。但我没有必要知道这个特定的“为什么”。

    客户端现在可以在重构后基于整个肥皂信封进行签名..

    【讨论】:

      猜你喜欢
      • 2011-11-27
      • 1970-01-01
      • 2022-12-04
      • 2020-12-16
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 2019-02-02
      相关资源
      最近更新 更多