1、简介

Apache HttpClient是一个底层、轻量级的客户端HTTP库,用于与HTTP服务器进行通信。

在本教程中,我们将学习如何在使用HttpClient时配置支持的传输层安全(TLS)版本。

我们将首先概述TLS版本协商如何在客户端和服务器之间工作。

之后,我们将看看在使用HttpClient时配置支持的TLS版本的三种不同方式

2、TLS版本协商

TLS是一种互联网协议,可在两方之间提供安全、可信的通信。它封装了像HTTP这样的应用层协议。

TLS协议自1999年首次发布以来已多次修订。

因此,客户端和服务器在建立新连接时,首先就他们将使用的TLS版本达成一致非常重要。

TLS版本在客户端和服务器交换hello消息后达成一致:

  1. 客户端发送支持的 TLS 版本列表。
  2. 服务器选择一个并在响应中包含所选版本。
  3. 客户端和服务器使用所选版本继续连接设置。

由于存在降级攻击的风险,因此正确配置Web客户端支持的TLS版本非常重要。

请注意,为了使用最新版本的TLS(TLS 1.3),我们必须使用Java 11或更高版本

3、固定设置TLS版本

3.1、SSLConnectionSocketFactory

让我们通过HttpClients#custom定制构建方法提供的HttpClientBuilder,来定制我们的HTTPClient配置。

此构建器模式允许我们传入我们自己的SSLConnectionSocketFactory,它将根据一组所需支持的TLS版本进行实例化:

SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
SSLContexts.createDefault(),
new String[] { "TLSv1.2", "TLSv1.3" },
null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier()); CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();

返回的Httpclient对象现在可以执行HTTP请求了。

通过在SSLConnectionSocketFactory构造函数中显式设置支持的协议,客户端将仅支持通过TLS 1.2或TLS 1.3的通信。

请注意,在 Apache HttpClient 4.3 之前的版本中,该类称为SSLSocketFactory

3.2、Java运行时参数

另外,我们可以使用Java的https.protocols系统属性配置支持的TLS版本。

此方法可以防止必须将值硬编码到应用程序代码中。

相反,我们将配置HttpClient以在设置连接时使用该系统属性。

HttpClient API提供了两种方法来实现。第一个是通过HttpClients#createSystem

CloseableHttpClient httpClient = HttpClients.createSystem();

如果需要更多的客户端配置,我们可以使用builder方法代替:

CloseableHttpClient httpClient = HttpClients.custom().useSystemProperties().build();

这两种方法都告诉HttpClient在连接配置期间使用系统属性。

这允许我们在应用程序运行时使用命令行参数设置所需的TLS版本。例如:

$ java -Dhttps.protocols=TLSv1.1,TLSv1.2,TLSv1.3 -jar webClient.jar

4、动态设置TLS版本

还可以根据主机名和端口等连接详细信息设置TLS版本。我们将扩展SSLConnectionSocketFactory并覆盖prepareSocket方法。

客户端会在启动新连接之前调用prepareSocket方法,这将可以让我们在每个连接的基础上决定使用哪些TLS协议。

也可以启用对旧TLS版本的支持,但前提是远程主机具有特定的子域:

SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(SSLContexts.createDefault()){

    @Override
protected void prepareSocket(SSLSocket socket) { String hostname = socket.getInetAddress().getHostName();
if (hostname.endsWith("internal.system.com")){
socket.setEnabledProtocols(new String[] { "TLSv1", "TLSv1.1", "TLSv1.2", "TLSv1.3" });
}
else {
socket.setEnabledProtocols(new String[] {"TLSv1.3"});
}
}
};
CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();

在上面的示例中,prepareSocket方法首先获取SSLSocket将连接到的远程主机名,然后使用主机名来确定要启用的TLS协议。

现在,我们的HTTP客户端将对每个请求强制执行TLS 1.3,除了目标主机名的格式为*.internal.system.com

由于能够在创建新SSLSocket之前插入自定义逻辑,我们的应用程序现在可以自定义TLS通信的详细信息。

5、结论

在本文中,我们研究了在使用Apache HttpClient库时配置支持的TLS版本的三种不同方式。

我们已经了解了如何为所有连接或基于每个连接设置TLS版本。

原文:https://www.baeldung.com/apache-httpclient-tls

翻译:码农熊猫

更多技术干货,请访问我的个人网站https://pinmost.com,或关注公众号【码农熊猫】

如何在Apache HttpClient中设置TLS版本的更多相关文章

  1. 如何在Linux服务器中隐藏PHP版本

    通常,大多数默认设置安装的web服务器存在信息泄露,这其中之一就是PHP.PHP 是如今流行的服务端html嵌入式语言(之一?).在如今这个充满挑战的时代,有许多攻击者会尝试发现你服务端的漏洞.因此, ...

  2. 如何在 Apache Flink 中使用 Python API?

    本文根据 Apache Flink 系列直播课程整理而成,由 Apache Flink PMC,阿里巴巴高级技术专家 孙金城 分享.重点为大家介绍 Flink Python API 的现状及未来规划, ...

  3. 为何在font-family属性中设置多个值

    通常前端开发中会对body标签中设置font-family属性多个值,例如: body{padding:0;margin:0;font-size:12px;text-align:left;font-f ...

  4. 转--Android如何在java代码中设置margin

    ========  3 在Java代码里设置button的margin(外边距)? 1.获取按钮的LayoutParams LinearLayout.LayoutParams layoutParams ...

  5. 如何在Webstorm/Phpstorm中设置连接FTP,并快速进行文件比较,上传下载,同步等操作

    Phpstorm除了能直接打开localhost文件之外,还可以连接FTP,除了完成正常的数据传递任务之外,还可以进行本地文件与服务端文件的异同比较,同一文件自动匹配目录上传,下载,这些功能是平常ID ...

  6. apache服务器中设置目录不可访问

    <Directory "d:/amp/apache/htdocs/images">    Allow from all    Options None</Dire ...

  7. Android如何在java代码中设置margin

    习惯了直接在xml里设置margin(距离上下左右都是10dip),如: <ImageView android:layout_margin="10dip" android:s ...

  8. 如何在Quartus II中设置Virtual pin

    为了验证FPGA工程中的某个模块的功能和时序的正确性,常常需要对其单独进行验证,但是这些模块通常都与内部的众多信号相连(如系统总线,中断信号线等),往往一个模块的对外接口引脚会多达几百个,对其单独仿真 ...

  9. 如何在Windows系统中设置Python程序定时运行

    文章出处:http://blog.csdn.net/wwy11/article/details/51100432 首先,我们肯定是要用到Windows下的[计划任务]功能 之后点击右侧的[创建基本任务 ...

随机推荐

  1. unittest的前置后置,pytest的fixture和共享机制conftest.py

    Unittest setUp/tearDown setUp当中得到的变量,用self.xxx = value传递给测试用例 setUpClass/tearDownClass setupClass当中得 ...

  2. 多目标跟踪:CVPR2019论文阅读

    多目标跟踪:CVPR2019论文阅读 Robust Multi-Modality Multi-Object Tracking  论文链接:https://arxiv.org/abs/1909.0385 ...

  3. 用OpenCV4实现图像的超分别率

    用OpenCV4实现图像的超分别率 本实验原文链接:· https://arxiv.org/pdf/1807.06779.pdf 原文摘要 单图像超分辨率(SISR)的主要挑战是如何恢复微小纹理等高频 ...

  4. Paddle Lite端侧部署

    Paddle Lite端侧部署 端侧推理引擎的由来 随着深度学习的快速发展.特别是小型网络模型的不断成熟,原本应用到云端的深度学习推理,就可以放到终端上来做,比如手机.手表.摄像头.传感器.音响,也就 ...

  5. ARM系列处理器和架构

    从一只ARM到另一只ARM! ARM处理器和架构 当前可用的处理器 ARM1 ARM2 ARM3 ARM4和5 ARM6 ARM7 ARM8 强壮有力的ARM ARM9 ARM10 ARM架构 v1  ...

  6. 整理AI性能指标

    整理AI性能指标 Sorting out AI performance metrics 推理性能的最佳衡量标准是什么? 在人工智能加速器的世界里,对于给定的算法,芯片的性能经常以每秒万亿次的运算量(T ...

  7. 孟老板 BaseAdapter封装 (三) 空数据占位图

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...

  8. 【题解】Luogu P3052 【USACO12】摩天大楼里的奶牛Cows in a Skyscraper

    迭代加深搜索基础 题目描述 A little known fact about Bessie and friends is that they love stair climbing races. A ...

  9. 机器人路径规划其二 A-Star Algorithm【附动态图源码】

    首先要说明的是,机器人路径规划与轨迹规划属于两个不同的概念,一般而言,轨迹规划针对的对象为机器人末端坐标系或者某个关节的位置速度加速度在时域的规划,常用的方法为多项式样条插值,梯形轨迹等等,而路径规划 ...

  10. 基于ABP落地领域驱动设计-00.目录和小结

    <实现领域驱动设计> -- 基于 ABP Framework 实现领域驱动设计实用指南 翻译缘由 自 ABP vNext 1.0 开始学习和使用该框架,被其优雅的设计和实现吸引,适逢 AB ...