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

HttpClient支持多个TLS协议

华子昂
2023-03-14

我们正在编写一个应用程序,它必须使用HTTPS与几个服务器通信。它需要与AWS通信(使用AWS库),还需要与我们使用TLS1.2的一些内部服务通信。

我首先将HttpClient更改为使用TLS1.2SSLContext:

public static SchemeRegistry buildSchemeRegistry() throws Exception {
    final SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
    sslContext.init(createKeyManager(), createTrustManager(), new SecureRandom());
    final SchemeRegistry schemeRegistry = new SchemeRegistry();
    schemeRegistry.register(new Scheme("https", 443, new SSLSocketFactory(sslContext)));
    return schemeRegistry;
}

并且(通过spring)将这个SchemeRegistry注入到DefaultHttpClient对象中,但是这样做会从AWS得到错误,因此我假设(我可能错了)AWS不支持TLS1.2(如果我只是使用普通的DefaultHttpClient就不会得到这个消息):

AmazonServiceException: Status Code: 403, AWS Service: AmazonSimpleDB, AWS Request ID: 5d91d65f-7158-91b6-431d-56e1c76a844c, AWS Error Code: InvalidClientTokenId, AWS Error Message: The AWS Access Key Id you provided does not exist in our records.

如果我尝试在spring中定义两个HttpClient,一个使用TLS1.2,另一个是默认的,我会得到以下错误,我假设这意味着spring不喜欢实例化和自动连接两个HttpClient对象:

SEVERE: Servlet /my-refsvc threw load() exception
java.lang.NullPointerException
at com.company.project.refsvc.base.HttpsClientFactory.<clinit>(BentoHttpsClientFactory.java:25)
...
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1031)
at 
...
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)

我在java中使用HTTPS不多,所以你们好心人能给我一些建议吗?1)我如何让Spring允许两个HttpClient对象,一个连接到AWS stuff bean,另一个连接到其他bean,以访问TLS1.2服务2)或者是否可以更改一个HttpClient对象,使其能够尝试TLS1.2(通过SSLContext或SchemeRegistry或其他东西),如果失败,则尝试TLS1.1或1.0?3)如果两者都可能,那么做的“更好”的方法是什么?

共有1个答案

竺绍辉
2023-03-14

TLS有一个内置机制来协商要使用的协议版本。RFC 5246(附录E):

TLS版本1.0、1.1和1.2以及SSL 3.0非常相似,并且使用兼容的ClientHello消息;因此,支持所有这些都是相对容易的。类似地,只要ClientHello格式保持兼容,并且客户端支持服务器中可用的最高协议版本,服务器就可以轻松地处理尝试使用TLS未来版本的客户端。

希望与此类较旧服务器协商的TLS 1.2客户端将发送一个普通的TLS 1.2 ClientHello,在ClientHello.client_Version中包含{3,3}(TLS 1.2)。如果服务器不支持此版本,它将使用包含较旧版本号的ServerHello进行响应。如果客户端同意使用此版本,协商将根据协商后的协议进行。

(我想可能性不大,但如果没有看到您的createKeyManager()createTrustManager(),就很难说了)。可能您使用的服务器与TLS1.2和版本协商机制不兼容。sun.security.ssl.sslContexTIMPL中有以下注释:

SSL/TLS协议指定了前向兼容性和版本回滚攻击保护,然而,许多SSL/TLS服务器供应商没有正确地实现这些方面,并且当前的一些SSL/TLS服务器可能拒绝与TLS1.1或更高版本的客户端通话。

 类似资料:
  • 本文向大家介绍Dubbo支持服务多协议吗?相关面试题,主要包含被问及Dubbo支持服务多协议吗?时的应答技巧和注意事项,需要的朋友参考一下 Dubbo 允许配置多协议,在不同服务上支持不同协议或者同一服务上同时支持多种协议。

  • 需求 有时我们需要一套应用程序支持多个客户端,进而需要应用支持多个协议。例如一个IM即时通讯应用,可能需要同时支持浏览器使用,又要支持移动App客户端。而二者所使用的协议可能完全不同。 如何支持多协议 在WorkerMan中最简单的实现方法是开启多个端口,每个端口使用一种协议。不同客户端使用各自的协议去连特定的端口。 示例(小蝌蚪) 小蝌蚪应用程序是运行在PC浏览器里面的,使用Websocket协

  • <?php use Yurun\Util\YurunHttp; use Yurun\Util\HttpRequest; // 设置默认请求处理器为 Swoole YurunHttp::setDefaultHandler(\Yurun\Util\YurunHttp\Handler\Swoole::class); // Swoole 处理器必须在协程中调用 go('test'); functio

  • 现在我正在使用Xamarin. form开发一个应用程序。我遇到了TLS协议的问题。 我的应用程序使用应用编程接口。由于安全原因,应用编程接口使用HTTPS。本周,我们决定删除对TLS 1.0的支持,只在服务器端接受TLS 1.1和1.2,但在我们做出这一更改后,我注意到我的应用程序停止工作。 调试时,我注意到API的调用引发了一个异常(我使用的是.Net中的HttpClient类)。通过在互联网

  • 本文向大家介绍iOS 支持多个域,包括了iOS 支持多个域的使用技巧和注意事项,需要的朋友参考一下 示例 应用程序支持的每个域都需要提供其自己的apple-app-site-association文件。如果每个域提供的内容不同,则文件的内容也将更改以支持相应的路径。否则,可以使用相同的文件,但是需要在每个受支持的域中访问该文件。

  • WorkerMan在接口上支持各种协议,只要符合ConnectionInterface接口即可(参见定制通讯协议章节)。 为了方便开发者,WorkerMan提供了HTTP协议、WebSocket协议以及非常简单的Text文本协议、可用于二进制传输的frame协议。开发者可以直接使用这些协议,不必再二次开发。如果这些协议都不满足需要,开发者可以参照定制协议章节实现自己的协议。 开发者也可以直接基于t