当前位置: 首页 > 知识库问答 >
问题:

如何在连接https URL和TLS Certificate时使用Apache camel http4组件设置代理

楚望
2023-03-14

我一直在工作的Apache骆驼连接https URLS'通过提供TLS证书通过代理,但得到错误org.apache.http.conn.不支持的模式异常:超文本传输协议不支持

下面是驼峰路由和带有代理的ssl上下文

公共类HttpProxyRouter扩展了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); 
        }}); 
}

}

遇到错误

org.apache.catalina.core.Application Context logINFO:初始化Spring FrameworkServlet'调度Servlet'43953[超文本传输协议-nio-6723-exec-2]INFOorg.springframework.web.servlet.DispatcherServlet'调度Servlet':初始化开始44033[超文本传输协议-nio-6723-exec-2]INFOorg.springframework.web.servlet.DispatcherServlet-FrameworkServlet'调度Servlet':初始化完成80 ms44126[超文本传输协议-nio-6723-exec-2]INFOcom.db.gtbb.adapter.controller.HttpProxyRestController-httpProxyHandler已启动!44152[超文本传输协议-nio-6723-exec-2]INFO route1-调用dhttpprox44291[超文本传输协议-nio-6723-exec-2]INFOorg.apache.http.impl.execchain.RetryExec-I/O异常(org.apache.http.conn.Unsupport tedSchemeException)在处理{tls}的请求时捕获-

共有1个答案

鲜于俊侠
2023-03-14

您需要将http协议添加到注册表:

SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslctxt, hnv);

Registry<ConnectionSocketFactory> lookup = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", PlainConnectionSocketFactory.INSTANCE)
                .register("https", sslSocketFactory).build();
 类似资料:
  • 因为我计划从v.3升级httpclient依赖项。第1至第4节。5.13,但后来我意识到,许多功能已经改变,其中之一就是多线程HttpConnectionManager已经从最新版本中删除。当我搜索一个等价类时,stackoverflow HttpClient 4中的一篇文章——多线程HttpConnectionManager发生了什么事?,建议使用PoolightTPClientConnecti

  • 在泽西1中,我们在类中有一个函数setConnectTimeout。 在jersey 2中,类用于缺少此函数的地方。 如何设置连接超时和读取超时在泽西2. x?

  • 问题内容: 我的环境 Java 5 Spring2.5.5 DBCP数据源 (org.apache.commons.dbcp.BasicDataSource) 的MySQL 类似职位 使用Spring JDBC Oracle设置会话时区 链接 http://www.mysqlfaqs.net/mysql-faqs/General-Questions/How-to-manage-Time-Zone-

  • 问题内容: 我正在使用PDO从MySQL服务器获取数据。我注意到的是:如果MySQL服务器不可用,则此代码返回异常 实际上 需要(相对)长的时间: 如果使用MySQL,则发生异常(SQLSTATE [HY000] [2003]无法在…上连接到MySQL服务器)仅需2分钟以上,而在PostgreSQL上则需要30秒(SQLSTATE [08006] [7]超时已过期) )。 我尝试使用PDO ::

  • 我知道volley有一个重试策略,但我知道,这是针对套接字超时,而不是连接超时,Apache HttpClient有setConnectionTimeout和setSoTimeout方法,有人知道我是否要为volley framework设置连接超时吗。

  • 我尝试制作示例代码来研究jms。我遇到了一些错误。所以,我搜索了一些解决错误的文章。我放弃了,因为我找不到如何使用spring4在ActiveMQ中设置代理。请给我一些建议或解决问题。 这是一个错误。 这是我的Spring配置文件。 而且,当我尝试设置使用ActiveMQConnectionFactory的CachingConnectionFactory时,它带来了错误。然而,在这个站点(http