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>
答案 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)
....
将客户端的策略更改为服务器配置为返回的内容完成了工作。