2016-07-20 4 views
1

Ich habe eine WSDL, die WSPolicy enthält, die definierte Richtlinie verwendet unterstützende Tokens und bei der Unterstützung von Token verwendet sie X509-Token. Im Folgenden wirdWS-Policy X509Token mit unterstützenden Token

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

nun ein Ausschnitt aus der WSDL die Politik hat, wenn ich meinen Client generiere (mit Apache CXF), jeden Web-Service-Betrieb verbrauchen, ich sehe den wssec Sicherheitsheader nicht an den SOAP-Header hinzugefügt zu werden . Daher gibt der SOAP-Dienst einen Fehler aus, wenn der Richtlinienüberprüfungs-Interceptor fehlschlägt.

Ich habe eine Menge Suche durchgeführt und habe kein Muster/Beispiel gefunden, das diese Art von Richtlinien verwendet, Unterstützungs-Token wurden zusammen mit Assymetric/Symmetric Bindings verwendet.

Möchten Sie wissen, ob die definierte Richtlinie korrekt ist, wenn ja, wie lautet der Clientcode für den Zugriff auf diesen Dienst.

nur hinzufügen, wenn ich unter Abfangjäger in den Client-Code zu setzen, wird der Sicherheits Header hinzugefügt (mit einer Binary-Sicherheits-Token und Unterschrift), aber der Dienst immer noch nicht (mit Politik Verification Interceptor)

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

Unten ist der Fehler-Stack-Trace

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 

Jede Hilfe wird sehr geschätzt !! Ich stecke seit 2 Tagen mit diesem Problem fest.

+0

Von was ich bisher herausgefunden habe, scheint dies ein WSDL-Problem zu sein. Wenn ich versuche, einen Dienst zu erstellen, der die obige WS-Richtlinie in meiner WSDL (mit Apache Rampart & Axis2) verwendet, erhalte ich während der Bereitstellung einen Fehler. Will mehr debuggen und die Ergebnisse posten – kaps

+0

Welche CXF-Version benutzt du? – Frank

+0

CXF-Version ist 3.0.3 – kaps

Antwort

1

Verwenden eines BinarySecurityToken als SupportToken ohne Sicherheitsbindung funktioniert nicht mit CXF. Sie müssen eine Sicherheitsbindung angeben, um die Anforderung ebenfalls zu signieren.

+0

Ok, Danke für die Antwort Colm. Selbst wenn ich das dachte, kann dies mit Apache Rampart geschehen, das mit Axis2 konfiguriert wurde? – kaps