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

使用Apache Httpclient和WebSphere Liberty配置文件设置TLS版本

古畅
2023-03-14

我们正在从WebSphere Liberty Profile(8.5.5.6)REST服务访问一个外部服务,该服务使用Apache HTTPClient 4.3.5连接到该服务。

该服务刚刚更改为使用TLS v1。现在我们的服务失败了:[4/21/16 12:23:37:596 EDT]000000 5D bm。myw3。服务。awf。sso。ejb。发电机SSOTokeneratorImpl I异常::javax。网ssl。SSLException:收到致命警报:协议_版本[4/21/16 12:23:37:597 EDT]000000 5D com。国际商用机器公司myw3。服务。awf。sso。ejb。SSOTokenManagerBean E SSOTokenGeneratorException::{0}com。国际商用机器公司myw3。服务。awf。sso。ejb。配置。SSOTokeneratorException:执行http请求以检索令牌时发生异常

我们找到了以下链接,并在代码中实现了它:
如何在apache HttpClient上设置TLS版本

SSLContext sslContext = SSLContexts.custom().useTLS().build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, new String[] { "TLSv1.2" }, null, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

我还设置了“https”。协议':

wasadmin 28548 1 10 12:28 pts/0 00:00:55/usr/lib/jvm/jre-1.7.1-ibm。x86_64/bin/java-javaagent:/opt/IBM/WebSphere/Liberty/wlp/bin/tools/ws-javaagent。贾尔贾瓦。awt。headless=true-XX:MaxPermSize=256m-Dcom。国际商用机器公司html" target="_blank">安全辖区policydir=/devops/w3Services/ssoProxy-Dhttps。协议=TLSv1。2、TLSv1。TLSv1-jar/opt/IBM/WebSphere/Liberty/wlp/bin/tools/ws-server。jar w3svcs-ssoproxy-svr1

但这没什么区别。我们还需要做些什么才能让它与WLP一起工作吗?

共有2个答案

薛烨
2023-03-14

构建HttpClient实例时,不能同时设置自定义套接字工厂和完全初始化的连接管理器。方法#setConnectionManager取代#setSSLSocketFactory。

要么这样做

SSLContext sslContext = SSLContexts.custom().useProtocol("TLSv1.2").build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, new String[] { "TLSv1.2" },
        new String[] { "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256" },
        SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create()
        .setDefaultRequestConfig(requestConfig)
        .setSSLSocketFactory(sslsf);

还是这个

SSLContext sslContext = SSLContexts.custom().useProtocol("TLSv1.2").build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, new String[] { "TLSv1.2" },
        new String[] { "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256" },
        SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
        .register("http", PlainConnectionSocketFactory.getSocketFactory())
        .register("https", sslsf)
        .build();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(socketFactoryRegistry);

HttpClientBuilder httpClientBuilder = HttpClientBuilder.create()
        .setDefaultRequestConfig(requestConfig)
        .setConnectionManager(cm);

哦,是的,还有一件事。请考虑升级到4.5

孙思源
2023-03-14

我们尝试了其他一些方法,下面是我们最新的代码迭代:

SSLContext sslContext = SSLContexts.custom().useProtocol("TLSv1.2").build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, new String[] { "TLSv1.2" },
    new String[] { "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256" },
    SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig)
    .setConnectionManager(connManager).setSSLSocketFactory(sslsf);
handleAuthentication(uri, httpClientBuilder);
httpClient = httpClientBuilder.build();

我还设置了以下JVM选项:
JVM_ARGS=-Dhttps。协议=TLSv1。2-Djdk。tls。客户协议=TLSv1。2-Djavax。网调试=全部

但是我们仍然得到错误:

[4/21/16 17:27:37:123 EDT]00000042 id=bm。myw3。服务。awf。sso。ejb。发电机SSOTokeneratorImpl I异常::javax。网ssl。SSLException:收到致命警报:协议版本[4/21/16 17:27:37:124 EDT]000000 42 id=com。国际商用机器公司myw3。服务。awf。sso。ejb。SSOTokenManagerBean E SSOTokenGeneratorException::{0}com。国际商用机器公司myw3。服务。awf。sso。ejb。配置。SSOTokeneratorException:执行http请求以检索令牌时发生异常

我有线索。来自WLP的日志,如果有人认为可以查看,我可以上传。但这里有各种追踪记录:

Default Executor-thread-25, WRITE: TLSv1.2 Handshake, length = 80
Default Executor-thread-25, WRITE: TLSv1.2 Application Data, length = 256
Default Executor-thread-25, READ: TLSv1.2 Application Data, length = 1552
SEND TLSv1.2 ALERT:
Finalizer thread, WRITE: TLSv1.2 Alert, length = 64

然后它继续尝试TLSv1,我们正在调用的服务不再支持它。我不确定要寻找什么来确定它为什么不使用TLSv1。但是没有任何东西从痕迹中向我跳出来。

 类似资料:
  • 问题内容: 我有一个使用maven作为构建工具的应用程序。 我正在使用Maven配置文件从不同的配置文件设置不同的属性。 我想做的是将maven中的所有活动配置文件也移植到spring活动配置文件中,以便我可以在bean签名()中引用它们。但我不确定该怎么做。 例如:考虑以下Maven设置 假设我在未指定任何其他配置文件的情况下运行maven,而我希望spring具有和 配置为活动配置文件。 问题

  • 我有两个环境来设置我的API,所以我有生产和开发。我首先需要的是找到一种方法来自动完成这一任务,例如,在运行时,不发送任何参数(-d)应用程序找到了一种方法来识别环境,但我没有找到任何方法来完成这一任务。 所以我看了一个教程,在同样有一个方法放了一个环境变量,并定义了我的application.properties。所以在下面的步骤中: > 我在我的应用程序中定义了3个文件,application

  • 问题内容: 我正在尝试根据某个Maven配置文件是否处于活动状态来使用数据库信息配置Spring配置文件。我已经看到了一些答案,但是很难将它们放在一起。 我有一个这样的Maven个人资料: 还有一个settings.xml文件,如下所示: 并在servlet-context.xml中: 我的问题基本上是,如何将Maven属性放入servlet- context.xml文件中?我需要一个.prope

  • 我有一个用maven作为构建工具的应用程序。 我正在使用maven概要文件从不同的概要文件设置不同的属性。 假设我运行带有out的maven,并指定我希望spring的任何其他概要文件,将和作为活动概要文件。

  • 我想做的是用httpclient下载一个文件。目前我的代码如下。 我的下载URL如下所示:http://example.com/file/afz938f348dfa3 正如你可以看到没有扩展名的文件(至少在网址)然而,当我去一个正常的浏览器网址,它下载文件asdasdaasda.txt或asdasdasdsd.pdf(名称是不同的url和extenstion并不总是相同的,取决于我试图下载什么)。

  • 我为开发和测试环境配置了两个Spring概要文件和。在每个环境中,我使用不同的数据库,即dev中的,以及测试中的。以下是每个配置文件的属性文件,其中通过spring boot分别解析为和,具体取决于配置的数据源。 application-dev.properties application-test.properties 配置文件的Flyway迁移文件位于下,而配置文件位于 当我使用profile