如何在Apache HttpClient中設置TLS版本

1.簡介

Apache HttpClient是一個低級,輕量級的客戶端HTTP庫,用於與HTTP服務器進行通信。在本教程中,我們將學習如何在使用HttpClient時配置支持的傳輸層安全性(TLS)版本。我們將首先概述客戶端和服務器之間TLS版本協商的工作方式。之後,我們將研究使用HttpClient時配置受支持的TLS版本的三種不同方式

2. TLS版本協商

TLS是一種互聯網協議,可在兩方之間提供安全,可信任的通信。它封裝了諸如HTTP之類的應用程序層協議。自從1999年首次發布以來,TLS協議已進行了多次修訂。因此,對於客戶端和服務器,首先要商定在建立新連接時將使用哪個版本的TLS,這一點很重要。客戶端和服務器交換問候消息後,將同意TLS版本:

  1. 客戶端發送支持的TLS版本的列表。
  2. 服務器選擇一個,並在響應中包括所選版本。
  3. 客戶端和服務器使用所選版本繼續進行連接設置。

正確配置Web客戶端支持的TLS版本非常重要,因為存在降級攻擊的風險。請注意,為了使用最新版本的TLS(TLS 1.3),我們必須使用Java 11或更高版本。

3.靜態設置TLS版本

3.1 SSLConnectionSocketFactory

讓我們用HttpClientBuilder通過暴露HttpClients#custom構建器方法,以定制我們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進行通信。請注意,在4.3之前的Apache HttpClient版本中,該類稱為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.example.com. SSLSocket之前插入自定義邏輯的功能,我們的應用程序現在可以自定義TLS通信詳細信息。

5.結論

在本文中,我們研究了使用Apache HttpClient庫時配置受支持的TLS版本的三種不同方式。我們已經了解瞭如何為所有連接或基於每個連接設置TLS版本。

相關推薦
企業網絡安全工具的10種主要類型

企業安全性是一組技術,方法和策略,可幫助保護組織免受攻擊和任何其他未經授權的訪問。有很多方法可以使用高級工具和軟件應用程序檢測入侵和對手,這些工具可以全面檢查已安裝的網絡和應用程序。讓我們詳細了解企業安全軟件的主要類型:

2020年11月30日閱讀 138

具有MQTT,NiFi和InfluxDB的物聯網數據管道

我們在本教程中介紹了一個基本的IoT用例。我們還了解瞭如何使用MQTT,NiFi和InfluxDB之類的工具來構建可擴展的數據管道。當然,這並不涵蓋物聯網應用程序的全部範圍,並且擴展數據分析管道的可能性是無限的。

2021年3月2日閱讀 145

在Java中以字符串形式讀取HTTP響應正文

探索幾種在Java中將HTTP響應正文作為字符串讀取的選項

2021年3月24日閱讀 120

如何在Spring Boot應用程序中啟用TLS技術

安全通信在現代應用程序中起著重要作用。客戶端和服務器之間通過純HTTP進行的通信不安全。對於可用於生產的應用程序,我們應在應用程序中通過TLS(傳輸層安全性)協議啟用HTTPS。在本教程中,我們將討論如何在Spring Boot應用程序中啟用TLS技術。

2021年4月7日閱讀 269

Java NIO DatagramChannel

在本教程中,我們將探索DatagramChannel類,該類允許我們發送和接收UDP數據包。

2021年4月12日閱讀 59

使用Istio的服務網格架構

在本教程中,我們介紹了服務網格模式的基本概念以及它提供給我們的功能。特別是,我們詳細介紹了Istio。這涵蓋了Istio的核心體系結構及其基本組件。此外,我們詳細介紹了一些常見用例的安裝和使用Istio的細節。

2021年4月13日閱讀 151