2016-07-20 7 views
1

WSPolicyを含むWSDLがあります。定義されたポリシーは、トークンをサポートし、X509トークンを使用するサポートトークンを使用します。以下は、任意のWebサービス操作を消費し、私は(ApacheのCXFを使用して)私のクライアントを生成するときに、ポリシー今WS-Policy X509トークンとサポートトークン

<wsp:Policy xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:fn="http://www.w3.org/2005/xpath-functions" 
      xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" 
      xmlns:wssutil="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
      wssutil:Id="MyPolicy"> 
    <wsp:ExactlyOne> 
    <wsp:All> 
     <sp:SupportingTokens xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"> 
      <sp:X509Token sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient"> 
       <wsp:Policy> 
       <sp:WssX509V3Token11/> 
       </wsp:Policy> 
      </sp:X509Token> 
     </sp:SupportingTokens> 
    </wsp:All> 
    </wsp:ExactlyOne> 
</wsp:Policy> 

を持つWSDLの抜粋ですが、私はSOAPヘッダに追加取得wssecセキュリティヘッダーが表示されません。その結果、Policy Validation Interceptorが失敗するとSOAPサービスがエラーをスローします。

私は多くの検索を行っており、この種のポリシーを使用しているサンプル/サンプルを見つけられていません。アシメトリック/対称バインディングと共にトークンがサポートされています。

定義されたポリシーが正しいかどうかを知りたい場合は、このサービスにアクセスするクライアントコードは何ですか。

私は、クライアント・コードに迎撃の下に置くときだけ追加して、セキュリティヘッダが(バイナリセキュリティトークンと署名を)追加されます、しかし、サービスはまだ(ポリシー検証インターセプタで)失敗し

Client client = ClientProxy.getClient(port); 
    client.getInInterceptors().add(new LoggingInInterceptor()); 
    client.getOutInterceptors().add(new LoggingOutInterceptor()); 

    Map<String,Object> outProps = new HashMap<String,Object>(); 
    outProps.put(WSHandlerConstants.ACTION, "Signature"); 
    outProps.put(WSHandlerConstants.USER, "myclientkey"); 
    outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, 
     ClientKeystorePasswordCallback.class.getName()); 
    outProps.put(WSHandlerConstants.SIG_PROP_FILE, "clientKeystore.properties"); 
    outProps.put(ConfigurationConstants.SIG_KEY_ID, "DirectReference"); 

    WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps); 
    client.getOutInterceptors().add(wssOut); 

は、以下のエラースタックトレースすべてのヘルプははるかに高く評価されます

Caused by: org.apache.cxf.binding.soap.SoapFault: These policy alternatives can not be satisfied: 
{http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}SupportingTokens 
at  org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:86) 
at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:52) 
at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:41) 
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307) 
at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113) 
at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69) 
at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34) 
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307) 
at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:798) 
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1638) 
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1527) 
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1330) 
at org.apache.cxf.io.CacheAndWriteOutputStream.postClose(CacheAndWriteOutputStream.java:56) 
at org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:215) 
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) 
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:638) 
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62) 
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307) 
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:514) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:423) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:326) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:279) 
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96) 
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:138) 
... 2 more 

です!私は2日以来、この問題に悩まされています。

+0

これまでわかったことから、これはWSDLの問題のようです。上記のWS-PolicyをWSDL(Apache Rampart&Axis2)で作成しようとすると、デプロイメント中にエラーが発生します。詳細をデバッグして結果を投稿します – kaps

+0

どのcxf-versionを使用しますか? – Frank

+0

CXFのバージョンは3.0.3です。 – kaps

答えて

1

セキュリティバインディングを持たないSupportTokenとしてBinarySecurityTokenを使用すると、CXFでは機能しません。要求に署名するためにセキュリティバインディングを指定する必要があります。

+0

ありがとう、返信ありがとうございました。しかし、Axis2で設定されたApache Rampartを使用してこれを行うことはできますか? – kaps