【问题标题】:How to specify that the Timestamp that's part of WS-Security needs to be signed + fix error that client did not sign timestamp with id xxx?如何指定作为 WS-Security 一部分的时间戳需要签名 + 修复客户端未使用 id xxx 签名时间戳的错误?
【发布时间】:2018-11-25 08:24:17
【问题描述】:

我已经实现了一个外部服务的 WSDL。他们有这个实现的端点,我们需要配置我们的 WCF 配置,以便我们的 WSDL 最终与他们的一样,以便该公司能够调用我们的服务并且我们的 WCF 服务知道该做什么。

他们的 WSDL 包含这些签名元素:

<wsp:Policy wsu:Id="SecureMessagePolicy">
    <wsp:ExactlyOne>
        <wsp:All>
            <sp:SignedParts>
                <sp:Body/>
                <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing"/>
                <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing"/>
                <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing"/>
                <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing"/>
                <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing"/>
                <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing"/>
                <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing"/>
            </sp:SignedParts>
            <sp:SignedElements>
                <sp:XPath>/*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/' and local-name()='Envelope']/*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/' and local-name()='Header']/*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' and local-name()='Security']/*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd' and local-name()='Timestamp']</sp:XPath>
                <sp:XPath>/*[namespace-uri()='http://www.w3.org/2003/05/soap-envelope' and local-name()='Envelope']/*[namespace-uri()='http://www.w3.org/2003/05/soap-envelope' and local-name()='Header']/*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' and local-name()='Security']/*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd' and local-name()='Timestamp']</sp:XPath>
            </sp:SignedElements>
        </wsp:All>
    </wsp:ExactlyOne>
</wsp:Policy>

我的 WSDL 的签名部分如下所示:

<wsp:Policy wsu:Id="{{POLICE_NAME_REQUEST}}">
    <wsp:ExactlyOne>
        <wsp:All>
            <sp:SignedParts xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
                <sp:Body/>
                <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing"/>
                <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing"/>
                <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing"/>
                <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing"/>
                <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing"/>
                <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing"/>
                <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing"/>
            </sp:SignedParts>
        </wsp:All>
    </wsp:ExactlyOne>
</wsp:Policy>
<wsp:Policy wsu:Id="{{POLICE_NAME_RESPONSE}}">
    <wsp:ExactlyOne>
        <wsp:All>
            <sp:SignedParts xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
                <sp:Body/>
                <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing"/>
                <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing"/>
                <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing"/>
                <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing"/>
                <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing"/>
                <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing"/>
                <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing"/>
            </sp:SignedParts>
        </wsp:All>
    </wsp:ExactlyOne>
</wsp:Policy>
<wsp:Policy wsu:Id="{{POLICE_NAME_FAULT}}">
    <wsp:ExactlyOne>
        <wsp:All>
            <sp:SignedParts xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
                <sp:Body/>
                <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing"/>
                <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing"/>
                <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing"/>
                <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing"/>
                <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing"/>
                <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing"/>
                <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing"/>
            </sp:SignedParts>
        </wsp:All>
    </wsp:ExactlyOne>
</wsp:Policy>

WCF 为请求、响应和故障生成这些内容。他们的 WSDL 只为这 3 件事完成了一次。我认为这并不重要。

如您所见,我们的 WSDL 规定应该签署相同的内容。 (Body、To、From、FaultTo、ReplyTO、MessageID、RelatesTo、Action)。 EXCEPT SignedElements 部分指定TimeStamp 也应该被签名。

时间戳是 http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd 命名空间的一部分(在他们的 WSDL 中称为 wsu):

<wsu:Timestamp ... >
    <wsu:Created>2011-11-30T11:12:12.459Z</wsu:Created>
    <wsu:Expires>2011-12-01T11:12:12.459Z</wsu:Expires>
</wsu:Timestamp>

我的绑定现在看起来像这样:

<binding>
      <MissingWSAddressingHeadersTextEncoding />
      <security
        authenticationMode="MutualCertificate"
        messageSecurityVersion="WSSecurity10WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10"
        enableUnsecuredResponse="false"
        messageProtectionOrder="EncryptBeforeSign"
        includeTimestamp="true"
        defaultAlgorithmSuite="TripleDesRsa15"
        allowSerializedSigningTokenOnReply="false"/>
      <httpsTransport requireClientCertificate="true"/>
</binding>

MissingWSAddressingHeadersTextEncoding 是在水下使用TextMessageEncoder 的自定义编码器。

问题

如何指定我的 WSDL 也应签署时间戳?我猜如果我返回一个带有未签名响应的响应,可能会发生错误。

【问题讨论】:

    标签: asp.net web-services wcf soap wsdl


    【解决方案1】:

    我找到了答案。

    显然,a timestamp is ALWAYS signed when signing is used (docs.microsoft),所以我不必担心签署时间戳。

    当我检查 SOAP UI 的响应时,我刚刚收到 FailedAuthentication 错误。我实现了 [推荐的 WCF 日志记录],它告诉我时间戳是 not 由 SOAP UI 签名的,这很奇怪,因为我确实在 WS 传出配置中指定了这一点。

    我的解决方法是使用MutualCertificateDuplex。这确实签署了时间戳。我还将allowSerializedSigningTokenOnReply 放在true 上,虽然我认为这并不重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      • 2012-03-11
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      相关资源
      最近更新 更多