2016-12-08 11 views
0

WSDLWS-Policyを実装しようとしています。Apache CXF 3.0を使用したWSポリシー

WS-PolicyWSDL内:



    <wsp:Policy wsu:Id="Signature"> 
     <wsp:ExactlyOne> 
      <wsp:All> 
       <sp:AsymmetricBinding> 
        <wsp:Policy> 
         <sp:InitiatorToken> 
          <wsp:Policy> 
           <sp:X509Token sp:IncludeToken= 
                 "http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient"> 
            <wsp:Policy> 
             <sp:WssX509V3Token10 /> 
            </wsp:Policy> 
           </sp:X509Token> 
          </wsp:Policy> 
         </sp:InitiatorToken> 
         <sp:RecipientToken> 
          <wsp:Policy> 
           <sp:X509Token sp:IncludeToken= 
                 "http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/Never"> 
            <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:LaxTsFirst /> 
          </wsp:Policy> 
         </sp:Layout> 
         <sp:IncludeTimestamp /> 
         <sp:OnlySignEntireHeadersAndBody /> 
        </wsp:Policy> 
       </sp:AsymmetricBinding> 
       <sp:SignedParts> 
        <sp:Body /> 
       </sp:SignedParts> 
      </wsp:All> 
     </wsp:ExactlyOne> 
    </wsp:Policy> 

CXF設定:



    EndpointImpl endpoint = new EndpointImpl(bus, service); 
    endpoint.setWsdlLocation("classpath:/wsdl/ws.wsdl"); 
    endpoint.setProperties(new HashMap<String, Object>() { 
     { 
      put("ws-security.signature.validator", customSignatureValidator); 
      put("ws-security.signature.properties", new Properties() {{ 
       put("org.apache.ws.security.crypto.provider", "org.apache.ws.security.components.crypto.Merlin"); 
       put("org.apache.ws.security.crypto.merlin.keystore.type", "jks"); 
       put("org.apache.ws.security.crypto.merlin.keystore.password", keystorePassword); 
       put("org.apache.ws.security.crypto.merlin.file", keystorePath); 
      }}); 
      put("ws-security.signature.username", privateKeyName); 
      put("ws-security.callback-handler", (CallbackHandler) callbacks -> { 
       WSPasswordCallback passwordCallback = (WSPasswordCallback) callbacks[0]; 

       passwordCallback.setPassword(privateKeyPassword); 
      }); 
     } 
    }); 
    endpoint.publish("/ws"); 

問題:

あり

は私の構成であります10

タイムスタンプを持つSOAP要求、署名鍵情報などを送信した後、私はSOAP障害メッセージを取得しています:

 
    These policy alternatives can not be satisfied: 
    {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}AsymmetricBinding: Received Timestamp does not match the requirements 
    {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}InitiatorToken 
    {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}RecipientToken 
    {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}IncludeTimestamp 
    {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}OnlySignEntireHeadersAndBody 

エラーは、私は、タイムスタンプを送信していないよ場合でも表示されます。ログ(CXF)によると、その署名が正しいことがわかります。

+0

目標、設定、エラーメッセージ - あなたの質問は何ですか? (ああ、エラーメッセージの場合は_block引用符を使用してください(4つのスペースの代わりに '>'を付けてください;改行を保持するスペースを2つ追加してください)。 – greybeard

答えて

0

いくつかのデバッグと実験の結果、問題がわかりました。WS-PolicyTimestampBodyには同じ署名で署名する必要があります。 Bodyのみに署名した場合、リストされたエラー(これは不正確です)に直面します。

関連する問題