WS-Security响应上的SOAP标头

时间:2015-11-16 08:57:01

标签: web-services ws-security

WS-Security响应中SOAP标头是强制性的吗?如果是这样,为什么?

我很想知道因为我的客户抱怨服务器响应中没有SOAP Header(实际上缺少了),并且没有办法配置它。

我正在使用一些过时的技术(Axis2 + Rampart 1.4)。

这是安全政策:

    <wsp:Policy wsu:Id="SigOnly" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
    <wsp:ExactlyOne>
        <wsp:All>
            <sp:AsymmetricBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
                <wsp:Policy>
                    <sp:InitiatorToken>
                        <wsp:Policy>
                            <sp:X509Token sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/Once">
                                <wsp:Policy>
                                    <sp:WssX509V3Token10/>
                                </wsp:Policy>
                            </sp:X509Token>
                        </wsp:Policy>
                    </sp:InitiatorToken>
                    <sp:RecipientToken>
                        <wsp:Policy>
                            <sp:X509Token sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/Once">
                                <wsp:Policy>
                                    <sp:WssX509V3Token10/>
                                </wsp:Policy>
                            </sp:X509Token>
                        </wsp:Policy>
                    </sp:RecipientToken>
                    <sp:AlgorithmSuite>
                        <wsp:Policy>
                            <sp:TripleDesRsa15/>
                        </wsp:Policy>
                    </sp:AlgorithmSuite>
                    <sp:Layout>
                        <wsp:Policy>
                            <sp:Strict/>
                        </wsp:Policy>
                    </sp:Layout>
                    <sp:IncludeTimestamp/>
                    <sp:OnlySignEntireHeadersAndBody/>
                </wsp:Policy>
            </sp:AsymmetricBinding>
            <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
                <sp:Body/>
            </sp:SignedParts>
        </wsp:All>
    </wsp:ExactlyOne>
</wsp:Policy>

3 个答案:

答案 0 :(得分:2)

已应用响应政策。问题出现在Rampart的代码中 - 它期望WS-Security 1.1中定义的标头,但服务器使用的是WS-Security 1.0,其中此标头不是强制性的。

需要隐藏org.apache.rampart.util.RampartUtil类 使用本地版本,重新定义isSecHeaderRequired,以便它始终在传入的消息上返回False。

这符合WS-Security 1.0标准,该标准不需要标题。使用签名时,WS-Security 1.1隐式地需要标头(https://docs.oasis-open.org/wss/v1.1/wss-v1.1-spec-os-SOAPMessageSecurity.pdf,章节8.5.1)

答案 1 :(得分:0)

这看起来很明显,但如果您希望应用此策略的客户端不在响应上抛出异常,是的,响应必须在SOAP消息中包含Security头,并且该头必须包含Timestamp和Signature。

我假设请求策略已应用于服务器,因为您在响应中没有遇到MustUnderstand失败。您确定还应用了响应策略吗?

答案 2 :(得分:0)

正如芭芭拉已经指出的那样。原因是客户端应用的策略与服务器端的策略不匹配。

E.g。标签

    <sp:IncludeTimestamp/>
策略中的

导致客户端在SOAP标头中发送带有wsse标记的请求,如下所示

<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" soapenv:mustUnderstand="true">
    ....
    <wsu:Timestamp wsu:Id="TS-F89FADB76552899AC314938177135681">
       <wsu:Created>2017-05-03T13:21:53.566Z</wsu:Created>
       <wsu:Expires>2017-05-03T13:26:53.566Z</wsu:Expires>
    </wsu:Timestamp>
    ...
    </wsse:UsernameToken>
</wsse:Security>

根据政策,客户期望从服务器接收响应中<wsu:Timestamp>标记下的<wsse>标记,以便它可以检查客户端上的时间戳政策侧。如果服务器没有产生与策略匹配的答案(例如,因为服务器使用不同的策略生成响应SOAP消息。)则接受响应失败。

在我的情况下,服务器正在响应一个空的SOAP标头(根本没有<wsse>标签)。这导致以下例外:

org.apache.axis2.AxisFault: Missing wsse:Security header in request
at  org.apache.rampart.handler.RampartReceiver.setFaultCodeAndThrowAxisFault(RampartReceiver.java:186)
at org.apache.rampart.handler.RampartReceiver.invoke(RampartReceiver.java:99)
....

将客户端的策略更改为服务器配置为返回的内容完成了工作。