2014-11-07 4 views
1

Я пытаюсь создать клиент Java с Apache-CXF-2.7.11, который общается с .NET WCF-сервисами.Нет подпись token Java CXF Client

Клиентский код My Java следующий, клиент был автогенерирующим с помощью IDE, только учетные данные, которые я скопировал из документов CXF.

public static void main(String args[]) throws java.lang.Exception { 
    URL wsdlURL = Reportes.WSDL_LOCATION; 
    if (args.length > 0 && args[0] != null && !"".equals(args[0])) { 
     File wsdlFile = new File(args[0]); 
     try { 
      if (wsdlFile.exists()) { 
       wsdlURL = wsdlFile.toURI().toURL(); 
      } else { 
       wsdlURL = new URL(args[0]); 
      } 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } 
    } 

    Reportes ss = new Reportes(wsdlURL, SERVICE_NAME); 
    IReportes port = ss.getWSHttpBindingIReportes(); 

    Client client = ClientProxy.getClient(port); 
    Endpoint cxfEndpoint = client.getEndpoint(); 

    Map ctx = ((BindingProvider)port).getRequestContext(); 
    ctx.put("ws-security.username", "username"); 
    ctx.put("ws-security.password", "password"); 

    WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(ctx); 
    cxfEndpoint.getOutInterceptors().add(wssOut); 

    { 
    System.out.println("Invoking programaProveedores..."); 
    java.lang.String _programaProveedores_idBeneficiario = ""; 
    com.wsclient.ArrayOfProgramaProveedor _programaProveedores__return = port.programaProveedores(_programaProveedores_idBeneficiario); 
    System.out.println("programaProveedores.result=" + _programaProveedores__return); 


    } 
System.exit(0); 
} 

Исключением является результат:

Advertencia: Interceptor for {http://schemas.xmlsoap.org/ws/2005/02/trust/wsdl}SecurityTokenService#{http://schemas.xmlsoap.org/ws/2005/02/trust/wsdl}RequestSecurityToken has thrown exception, unwinding now 
org.apache.cxf.interceptor.Fault: No signature token 
at org.apache.cxf.ws.security.wss4j.policyhandlers.SymmetricBindingHandler.doSignBeforeEncrypt(SymmetricBindingHandler.java:398) 
at org.apache.cxf.ws.security.wss4j.policyhandlers.SymmetricBindingHandler.handleBinding(SymmetricBindingHandler.java:124) 
at org.apache.cxf.ws.security.wss4j.PolicyBasedWSS4JOutInterceptor$PolicyBasedWSS4JOutInterceptorInternal.handleMessage(PolicyBasedWSS4JOutInterceptor.java:173) 
at org.apache.cxf.ws.security.wss4j.PolicyBasedWSS4JOutInterceptor$PolicyBasedWSS4JOutInterceptorInternal.handleMessage(PolicyBasedWSS4JOutInterceptor.java:90) 
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272) 
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:570) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:479) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:382) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:335) 
at org.apache.cxf.ws.security.trust.AbstractSTSClient.issue(AbstractSTSClient.java:782) 
at org.apache.cxf.ws.security.trust.STSClient.requestSecurityToken(STSClient.java:62) 
at org.apache.cxf.ws.security.trust.STSClient.requestSecurityToken(STSClient.java:56) 
at org.apache.cxf.ws.security.trust.STSClient.requestSecurityToken(STSClient.java:52) 
at org.apache.cxf.ws.security.policy.interceptors.SecureConversationOutInterceptor.issueToken(SecureConversationOutInterceptor.java:167) 
at org.apache.cxf.ws.security.policy.interceptors.SecureConversationOutInterceptor.handleMessage(SecureConversationOutInterceptor.java:69) 
at org.apache.cxf.ws.security.policy.interceptors.SecureConversationOutInterceptor.handleMessage(SecureConversationOutInterceptor.java:44) 
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272) 
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:570) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:479) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:382) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:335) 
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96) 
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:135) 
at com.sun.proxy.$Proxy38.programaProveedores(Unknown Source) 
at com.wsclient.IReportes_WSHttpBindingIReportes_Client.main(IReportes_WSHttpBindingIReportes_Client.java:76) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) 
Caused by: org.apache.cxf.ws.policy.PolicyException: No signature token 

Там в другой способ установить имя пользователя фишку?

PD Извините за мой английский ...

ответ

1

Я нашел проблему, то, что я пытаюсь сделать, это импортировать WCF созданный WSDL от клиента Java, первоначально я использую wsimport, после чего я использую Metro 2.3.0 и я получаю следующее сообщение об ошибке:

Advertencia: SP0100: Policy assertion Assertion[com.sun.xml.ws.policy.sourcemodel.DefaultPolicyAssertionCreator$DefaultPolicyAssertion] { 
assertion data { 
    namespace = 'http://schemas.microsoft.com/ws/2005/07/securitypolicy' 
    prefix = 'mssp' 
    local name = 'SslContextToken' 
    value = 'null' 
    optional = 'false' 
    ignorable = 'false' 
    attributes { 
     name = 'http://schemas.xmlsoap.org/ws/2005/07/securitypolicy:IncludeToken', value = 'http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient' 
    } 
} 
no parameters 
nested policy { 
    namespace version = 'v1_5' 
    id = 'null' 
    name = 'null' 
    vocabulary { 
     1. entry = 'http://schemas.xmlsoap.org/ws/2005/07/securitypolicy:RequireDerivedKeys' 
    } 
    assertion set { 
     Assertion[com.sun.xml.ws.policy.sourcemodel.DefaultPolicyAssertionCreator$DefaultPolicyAssertion] { 
      assertion data { 
       namespace = 'http://schemas.xmlsoap.org/ws/2005/07/securitypolicy' 
       prefix = 'sp' 
       local name = 'RequireDerivedKeys' 
       value = 'null' 
       optional = 'false' 
       ignorable = 'false' 
       no attributes 
      } 
      no parameters 
      no nested policy 
     } 
    } 
} 
} is not supported under Token assertion. 

причина заключается в том, что WCF WS-Policy был флуд этого раздела:

<mssp:SslContextToken 
sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient" xmlns:mssp="http://schemas.microsoft.com/ws/2005/07/securitypolicy"> 
    <wsp:Policy> 
    <sp:RequireDerivedKeys/> 
    </wsp:Policy> 
</mssp:SslContextToken> 

Это означает, что WCF себе rvice использует согласование сертификатов X.509. В таком случае клиенты используют сертификат сервера X.509 для шифрования. Уникальность здесь заключается в том, что клиентам не требуется иметь этот сертификат вне диапазона (как в большинстве случаев), скорее они получают этот сертификат, используя переговоры на уровне SOAP. Это реализовано как расширение по WS-Trust. Хотя это не является проприетарным решением Microsoft, Microsoft была единственной, кто ее реализовал до сих пор. Короче говоря - X.509 переговоров (SslContextToken) не совместим .Чтобы отключить его либо обновить конфигурацию WsHttpBinding:

<bindings> 
    <wsHttpBinding> 
     <binding> 
      <security mode="Message"> 
       <message clientCredentialType="None" negotiateServiceCredential="false" /> 
      </security> 
     </binding> 
    </wsHttpBinding> 
</bindings> 

Или выбрать правильный сценарий в вашем CustomBinding:

<security authenticationMode="AnonymousForCertificate"> 
    <secureConversationBootstrap /> 
</security> 

Вы также могут использовать эквивалентные случаи для аутентификации имени пользователя. Обратите внимание, что для любых клиентов (включая WCF) теперь должны быть установлены сертификаты обслуживания вне диапазона.

Ссылка на эту проблему: http://webservices20.blogspot.mx/2008/10/interoperability-gotcha-sslcontexttoken.html

Смежные вопросы