Balanjaneyulu P
Balanjaneyulu P

Reputation: 181

How to set Proxy with Apache camel http4 component while connecting https Urls with TLS certifcate

I have been working on Apache camel to connect https URLS' by providing TLS certificate via proxy but getting error org.apache.http.conn.UnsupportedSchemeException: http protocol is not supported

Below is the camel route and ssl context with proxy

public class HttpProxyRouter extends RouteBuilder {

@Override
public void configure() throws Exception { 
    configureSslForHttp4(getContext());
    from("direct:httpproxy") 
    .log("Invoking dhttpproxy")
    .setHeader("CamelHttpMethod") 
    .simple("GET").setHeader("Accept")
    .simple(Constants.JSON_MEDIA_TYPE_VALUE) 
    .setHeader(Exchange.HTTP_PATH)
    .simple("{{http.proxy.path}}") 
    .setHeader(Exchange.REST_HTTP_QUERY)
    .simple("{{http.proxy.query.param}}") 
    .to("{{http.proxy.url}}")
    .log("The Retrival of CCO subscription API response code is: ${header.CamelHttpResponseCode}, JSON Response ${body}") 
    .end(); 
}

private void configureSslForHttp4(CamelContext camelContext) {
    KeyStore truststore = KeyStore.getInstance("JKS");
    truststore.load(getClass().getClassLoader().getResourceAsStream("H:\config/AL/certpath/cert/keystore.jks"), "njfeijiiii".toCharArray()); 

    TrustManagerFactory trustFactory = TrustManagerFactory.getInstance("SunX509"); 
    trustFactory.init(truststore);
    SSLContext sslcontext = SSLContext.getInstance("TLS");
    sslcontext.init(null, trustFactory.getTrustManagers(), null);
    SSLSocketFactory factory = new SSLSocketFactory(sslcontext, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
    SchemeRegistry registry = new SchemeRegistry(); 
    final Scheme scheme = new Scheme("https4", 443, factory);
    registry.register(scheme);
    HttpComponent http4 = camelContext.getComponent("https4", HttpComponent.class); 
    http4.setHttpClientConfigurer(new HttpClientConfigurer() {
        @Override 
        public void configureHttpClient(HttpClientBuilder builder) {
            builder.setSSLSocketFactory(factory); 
            HttpHost proxy = new HttpHost("MYcompany.proxy",8080); 
            builder.setProxy(proxy); 
            builder.setRoutePlanner(new DefaultProxyRoutePlanner(proxy)); 
            Registry registry = RegistryBuilder.create().register("https", factory).build(); 
            HttpClientConnectionManager connectionManager = new BasicHttpClientConnectionManager(registry);
            builder.setConnectionManager(connectionManager); 
        }}); 
}

}

Error being encountered

org.apache.catalina.core.ApplicationContext logINFO: Initializing Spring FrameworkServlet 'dispatcherServlet'43953 [http-nio-6723-exec-2] INFO org.springframework.web.servlet.DispatcherServlet -FrameworkServlet 'dispatcherServlet': initialization started44033 [http-nio-6723-exec-2] INFO org.springframework.web.servlet.DispatcherServlet -FrameworkServlet 'dispatcherServlet': initialization completed in 80 ms44126 [http-nio-6723-exec-2] INFO com.db.gtbb.adapter.controller.HttpProxyRestController -httpProxyHandler has been started!44152 [http-nio-6723-exec-2] INFO route1 -Invoking dhttpproxy 44291 [http-nio-6723-exec-2] INFO org.apache.http.impl.execchain.RetryExec -I/O exception (org.apache.http.conn.UnsupportedSchemeException) caught when processing request to {tls}->http://mycompany.proxy:8080->https://mycompany.target:443: http protocol is not supported44293 [http-nio-6723-exec-2] INFO org.apache.http.impl.execchain.RetryExec -Retrying request to {tls}->http://mycompany.proxy:8080->https://mycompany.target:44344296 [http-nio-6723-exec-2] INFO org.apache.http.impl.execchain.RetryExec -I/O exception (org.apache.http.conn.UnsupportedSchemeException) caught when processing request to {tls}->http://mycompany.proxy:8080->https://mycompany.target:443: http protocol is not supported44296 [http-nio-6723-exec-2] INFO org.apache.http.impl.execchain.RetryExec -Retrying request to {tls}->http://mycompany.proxy:8080->https://mycompany.target:44344296 [http-nio-6723-exec-2] INFO org.apache.http.impl.execchain.RetryExec -I/O exception (org.apache.http.conn.UnsupportedSchemeException) caught when processing request to {tls}->http://mycompany.proxy:8080->https://mycompany.target:443: http protocol is not supported44296 [http-nio-6723-exec-2] INFO org.apache.http.impl.execchain.RetryExec -Retrying request to {tls}->http://mycompany.proxy:8080->https://mycompany.target:44344301 [http-nio-6723-exec-2] ERROR org.apache.camel.processor.DefaultErrorHandler -Failed delivery for (MessageId: ID-SGSINSD822483-57673-1614083753968-0-1on ExchangeId: ID-SGSINSD822483-57673-1614083753968-0-2). Exhausted after delivery attempt: 1 caught: org.apache.http.conn.UnsupportedSchemeException: http protocol is not supportedMessage History---------------------------------------------------------------------------------------------------------------------------------------RouteId ProcessorId Processor Elapsed (ms)[route1 ] [route1 ] [ ] [ 155][route1 ] [log1 ] [log ] [ 6][route1 ] [setHeader1 ] [setHeader[CamelHttpMethod] ] [ 3][route1 ] [setHeader2 ] [setHeader[Accept] ] [ 2][route1 ] [setHeader3 ] [setHeader[CamelHttpPath] ] [ 2][route1 ] [setHeader4 ] [setHeader[CamelRestHttpQuery] ] [ 16][route1 ] [to1 ] [{{http.proxy.url}} ] [ 118]Stacktrace--------------------------------------------------------------------------------------------------------------------------------------- org.apache.http.conn.UnsupportedSchemeException: http protocol is not supportedat org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:108)at org.apache.http.impl.conn.BasicHttpClientConnectionManager.connect(BasicHttpClientConnectionManager.java:338)at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:388)at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55)at org.apache.camel.component.http4.HttpProducer.executeMethod(HttpProducer.java:306)at org.apache.camel.component.http4.HttpProducer.process(HttpProducer.java:178)at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:145)at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:542)at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197)at org.apache.camel.processor.Pipeline.process(Pipeline.java:120)at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197)at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:62)at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97)at org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:529)at org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:497)at org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:365)at org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:497)at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:209)at org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:139)at org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:125)at com.db.gtbb.adapter.controller.HttpProxyRestController.httpProxyHandler(HttpProxyRestController.java:27)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:105)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:89)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:107)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1100)at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:687)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java:748)44318 [http-nio-6723-exec-2] INFO

Upvotes: 0

Views: 819

Answers (1)

tocasu
tocasu

Reputation: 1

you need to add http protocol to registry:

SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslctxt, hnv);

Registry<ConnectionSocketFactory> lookup = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", PlainConnectionSocketFactory.INSTANCE)
                .register("https", sslSocketFactory).build();

Upvotes: 0

Related Questions