2015-11-16 115 views
0

WS-Security響應中是否必須使用SOAP標頭?如果是這樣,爲什麼?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

這似乎是顯而易見的,但如果你想在客戶端使用此策略應用到的響應不是拋出一個異常,是的,響應必須包含在安全性頭SOAP消息和該頭部必須包含時間戳和簽名。

我假設請求策略應用在服務器上,因爲您在響應中沒有得到MustUnderstand失敗。你確定響應政策也適用嗎?

1

已應用響應策略。這個問題出現在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)

0

正如Barbara已經指出的那樣。原因是客戶端應用的策略與服務器端的策略不匹配。

E.g.在政策標籤

<sp:IncludeTimestamp/> 

導致客戶端與WSSE標籤發出請求的SOAP頭這樣

<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> 

,並且該策略在客戶端預計從接收服務器在響應中的<wsse>標記下標記<wsu:Timestamp>標記,以便它可以檢查客戶端上的時間戳策略。如果服務器未生成與策略匹配的答案(例如,因爲服務器使用不同的策略生成響應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) 
.... 

將客戶端的策略更改爲服務器配置爲返回的內容完成了這項工作。