2016-03-03 129 views
0

我使用Apache Camel CXF作为生产者调用SOAP Webservice。我不使用Spring配置,但以编程方式执行所有操作(我是初学者,希望避免学习Spring和Apache Camel)。 Webservice使用带有自签名证书的SSL。我把它添加到信任,并希望能够将它添加到CxfEndpoint类似我如何与https4做到了:Apache Camel CXF:以编程方式添加TlsClientParameters

KeyStoreParameters ksp = new KeyStoreParameters(); 
ksp.setResource("src/main/resources/truststore.jks"); 
ksp.setPassword("..."); 

KeyManagersParameters kmp = new KeyManagersParameters(); 
kmp.setKeyStore(ksp); 
kmp.setKeyPassword("..."); 

SSLContextParameters scp = new SSLContextParameters(); 
scp.setKeyManagers(kmp); 

CamelContext context = new DefaultCamelContext(); 
context.addRoutes(routeBuilder); 

HttpComponent httpComponent = context.getComponent("https4", HttpComponent.class); 
httpComponent.setSslContextParameters(scp); 

- 但似乎不与CxfComponent工作。我发现了很多关于使用Spring添加TlsClientParameters和配置CxfEndpoint的文档,例如:apache camel cxf https not workingCalling secure webservice using CXF and Camel。但是我没有找到关于如何为我做了https4甚至在路线定义,这是一个信任简单地添加到组件的任何提示:

from(ENDPOINT_URI) 
.setProperty(SecurityConstants.PASSWORD, constant(PASSWORD)) 
.setProperty(SecurityConstants.USERNAME, constant(USERNAME)) 
.to("cxf://" + SERVICE_URL + "?" + 
    "wsdlURL=" + WSDL_URL + "&" + 
     "serviceName=" + SERVICE_NAME + "&" + 
     "portName=" + PORT_NAME + "&" + 
     "dataFormat=CXF_MESSAGE&" + 
     "synchronous=true&" + 
     "defaultOperationName=" + DEFAULT_OPERATION_NAME) 
.streamCaching(); 

我想这一定是一个很简单的问题,所以我仍然期望有一些简单的方法可以简单地添加信任库(或者甚至接受任何证书,因为它在我们的用例中并不相关)。如果有一个简单的编程方法,我会非常高兴。有人知道吗?

回答

0

我通过将证书添加到jre/lib/cacerts中的JVMs truststore来解决此问题。这是可行的,因为我可以访问运行应用程序的机器上的JVM。这似乎是最简单的解决方案。

更新

如果有人有兴趣在一个更妥善的解决办法:CxfEndpoint提供影响HTTPConduit和TLS参数的装置。这是修改后的代码:

  • 添加“cxfEndpointConfigurer = SageEndpointConfigurer”到CXF端点参数
  • 创建端点“SageEndpointConfigurer”时,会使用类型转换器解决
  • 的TypeConverter,增加的该类型转换器注册上下文,即直接在RouteBuilder getContext().getTypeConverterRegistry().addTypeConverter(CxfEndpointConfigurer.class, String.class, new SageEndpointConfigurerConverter());
  • 配置TLSParameters,只是从TypeConverter的返回CxfEndpointConfigurer

    private class SageEndpointConfigurerConverter extends TypeConverterSupport { 
    
    @Override 
    public <T> T convertTo(Class<T> type, Exchange exchange, Object value) throws TypeConversionException { 
        CxfEndpointConfigurer configurer = new CxfEndpointConfigurer() { 
         @Override 
         public void configure(AbstractWSDLBasedEndpointFactory factoryBean) { 
          // do nothing 
         } 
    
         @Override 
         public void configureClient(Client client) { 
          URLConnectionHTTPConduit conduit = (URLConnectionHTTPConduit) client.getConduit(); 
          TLSClientParameters tlsParams = new TLSClientParameters(); 
          tlsParams.setDisableCNCheck(true); 
          tlsParams.setTrustManagers(new TrustManager[]{new TrustAllTrustManager()}); 
          conduit.setTlsClientParameters(tlsParams); 
         } 
    
         @Override 
         public void configureServer(Server server) { 
          //do nothing 
         } 
        }; 
        return (T) configurer; 
    } 
    } 
    
  • 的TrustAllManager被实现这样的

    public class TrustAllTrustManager implements X509TrustManager { 
    
    private static Logger LOG = LoggerFactory.getLogger(TrustAllTrustManager.class); 
    
    @Override 
    public void checkClientTrusted(X509Certificate[] x509Certificates, String authType) throws CertificateException { 
    //do nothing, trust all certificates 
    logMessage(x509Certificates, authType); 
    } 
    
    @Override 
    public void checkServerTrusted(X509Certificate[] x509Certificates, String authType) throws CertificateException { 
    //do nothing, trust all certificates 
    logMessage(x509Certificates, authType); 
    } 
    
    @Override 
    public X509Certificate[] getAcceptedIssuers() { 
    return new X509Certificate[0]; 
    } 
    
    private void logMessage(X509Certificate[] x509Certificates, String authType) { 
    StringBuilder message = new StringBuilder(); 
    String lineSeparator = System.getProperty("line.separator"); 
    message.append("Trusted following certificates for authentication type '").append(authType).append("'").append(lineSeparator); 
    for (X509Certificate certificate : x509Certificates) { 
        message.append(certificate).append(lineSeparator); 
    } 
    LOG.trace(message.toString()); 
    } 
    }