2014-07-01 2 views
0

Я пытаюсь создать клиент Java, который взаимодействует с .NET WCF-сервисами, использующими WS-Trust.Отсутствует исключение шифрования для шифрования в Apache CXF

My .net STS использует привязку WS2007Http и аутентификацию на основе UserNameToken, размещенную на конечной точке http.

var binding = new WS2007HttpBinding(); 
     binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; 
     binding.Security.Mode = SecurityMode.Message; 
     binding.Security.Message.NegotiateServiceCredential = false; 

Установка NegotiateServiceCredential устанавливается в ложь, чтобы подавить с помощью SslContextToken, которая не поддерживается Apache CXF.

код клиента My Java заключается в следующем:

public static void main(String[] args) throws Exception { 
    SpringBusFactory bf = new SpringBusFactory(); 
    URL busFile = Main.class.getResource("/cxf.xml"); 
    Bus bus = bf.createBus(busFile.toString()); 

    STSClient sts = new STSClient(bus); 
    sts.setWsdlLocation("http://localhost:19308/MainTenantManager/SecurityTokenService?singlewsdl"); 
    sts.setServiceName("{http://schemas.microsoft.com/ws/2008/06/identity/securitytokenservice}SecurityTokenService"); 
    sts.setEndpointName("{http://schemas.microsoft.com/ws/2008/06/identity/securitytokenservice}WS2007HttpBinding_IWSTrust13Sync"); 

    sts.setSpnego(true); 
    sts.setSecureConv(true); 
    sts.setSoap12(); 

    Properties p = new Properties();  
    p.setProperty("org.apache.ws.security.crypto.merlin.keystore.type", "jks"); 
    p.setProperty("org.apache.ws.security.crypto.merlin.keystore.password", "pass1234!"); 
    p.setProperty("org.apache.ws.security.crypto.merlin.keystore.alias", "localhost!"); 
    p.setProperty("org.apache.ws.security.crypto.merlin.file", "keystore.jks"); 

    org.apache.ws.security.components.crypto.Merlin m = new Merlin(p); 

    sts.getRequestContext().put(SecurityConstants.ENCRYPT_CRYPTO, m); 

    sts.getRequestContext().put(SecurityConstants.USERNAME, "admin"); 
    sts.getRequestContext().put(SecurityConstants.PASSWORD, "qwe"); 

    sts.requestSecurityToken("http://localhost:19308/MainTenantManager/Service"); 

} 

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

1437 [main] WARN org.apache.cxf.phase.PhaseInterceptorChain - Interceptor for {http://docs.oasis-open.org/ws-sx/ws-trust/200512/wsdl}SecurityTokenService#{http://docs.oasis-open.org/ws-sx/ws-trust/200512/wsdl}RequestSecurityToken has thrown exception, unwinding now 
org.apache.cxf.interceptor.Fault: No encryption crypto object found. 
at org.apache.cxf.ws.security.wss4j.policyhandlers.SymmetricBindingHandler.doSignBeforeEncrypt(SymmetricBindingHandler.java:395) 
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:162) 
at org.apache.cxf.ws.security.wss4j.PolicyBasedWSS4JOutInterceptor$PolicyBasedWSS4JOutInterceptorInternal.handleMessage(PolicyBasedWSS4JOutInterceptor.java:89) 
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262) 
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:531) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:464) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:367) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:320) 
at org.apache.cxf.ws.security.trust.STSClient.requestSecurityToken(STSClient.java:757) 
at org.apache.cxf.ws.security.trust.STSClient.requestSecurityToken(STSClient.java:635) 
at org.apache.cxf.ws.security.trust.STSClient.requestSecurityToken(STSClient.java:627) 
at org.apache.cxf.ws.security.policy.interceptors.SecureConversationOutInterceptor.issueToken(SecureConversationOutInterceptor.java:159) 
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:262) 
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:531) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:464) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:367) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:320) 
at org.apache.cxf.ws.security.trust.STSClient.requestSecurityToken(STSClient.java:757) 
at org.apache.cxf.ws.security.trust.STSClient.requestSecurityToken(STSClient.java:635) 
at org.apache.cxf.ws.security.trust.STSClient.requestSecurityToken(STSClient.java:627) 
at com.medius.cxf.client.Main.main(Main.java:55) 
Caused by: org.apache.cxf.ws.policy.PolicyException: No encryption crypto object found. 
at org.apache.cxf.ws.security.wss4j.policyhandlers.AbstractBindingBuilder.policyNotAsserted(AbstractBindingBuilder.java:307) 
at org.apache.cxf.ws.security.wss4j.policyhandlers.AbstractBindingBuilder.setEncryptionUser(AbstractBindingBuilder.java:1590) 
at org.apache.cxf.ws.security.wss4j.policyhandlers.AbstractBindingBuilder.getEncryptedKeyBuilder(AbstractBindingBuilder.java:1413) 
at org.apache.cxf.ws.security.wss4j.policyhandlers.SymmetricBindingHandler.setupEncryptedKey(SymmetricBindingHandler.java:827) 
at org.apache.cxf.ws.security.wss4j.policyhandlers.SymmetricBindingHandler.doSignBeforeEncrypt(SymmetricBindingHandler.java:296) 
... 23 more 

который, кажется, совершенно неправильно, так как, крипто объект установлен в коде. Я попытался настроить шифрование, хотя jaxws: настройка клиента с использованием файла .properties и настройка его в коде.

+0

Вы в конечном итоге решили его? –

+0

Да, однако мне нужно было полностью отключить SecureConversation на .Net сайте, а затем вместо этого использовать UserNameToken + Https. –

ответ

1

Какую версию CXF вы используете? Стиль создания объекта свойств и создание объекта Merlin с ним +, затем его использование для ENCRYPT_CRYPTO работает как с последним кодом CXF trunk + 2.7.x-fixes. Если вы используете более старую версию CXF, возможно, попробуйте более новую версию?

Кол.

+0

Это частично помогло, в конце концов я бросил WS2007HttpBinding с безопасным разговором, размещенным на http, для пользовательской привязки с отключенным сеансом безопасности и размещал его на https для обеспечения конфиденциальности. Затем я столкнулся с проблемами с привязкой синтаксического анализа от wsdl, а обновление CXF, наконец, заставило его работать. Я обновил его с 2.6.1 до 2.6.14. –

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