科普 TLS 1.3—新特性與開啟方式


TLS 1.3 協議針對安全強化及效率提升等方面進行了大量修改,相繼推出 20 多個草案版本,即將完成最終的標准化。標准完成后,OpenSSL 組織將推出 OpenSSL 1.1.1 版本,對 TLS1.3 協議標准提供支持。

本文主要講解 TLS 1.3 版本的相關特性以及如何在你的服務器上啟用 TLS 1.3 的支持。

在談 TLS 1.3 之前,我們先來看下 TLS 1.2 的工作模式,如圖所示是 TLS 1.2 客戶端和服務端交互的過程,如圖所示:

 

我們也可以通過 Wireshark 抓包得到的數據

 

以 ECDHE 密鑰交換算法為例,TLS1.2 協議完整的SSL握手過程如下:

  • 第一步,首先客戶端發送 ClientHello 消息,該消息中主要包括客戶端支持的協議版本、加密套件列表及握手過程需要用到的 ECC 擴展信息;
  • 第二步,服務端回復 ServerHello,包含選定的加密套件和 ECC 擴展;發送證書給客戶端;選用客戶端提供的參數生成 ECDH 臨時公鑰,同時回復 ServerKeyExchange 消息;
  • 第三步,客戶端接收 ServerKeyExchange 后,使用證書公鑰進行簽名驗證,獲取服務器端的 ECDH 臨時公鑰,生成會話所需要的共享密鑰;生成 ECDH 臨時公鑰和 ClientKeyExchange 消息發送給服務端;
  • 第四步,服務器處理 ClientKeyExchange 消息,獲取客戶端 ECDH 臨時公鑰;服務器生成會話所需要的共享密鑰;發送密鑰協商完成消息給客戶端;
  • 第五步,雙方使用生成的共享密鑰對消息加密傳輸,保證消息安全。

可以看到,TLS1.2 協議中需要加密套件協商、密鑰信息交換、ChangeCipherSpec 協議通告等過程,需要消耗 2-RTT 的握手時間,這也是造成 HTTPS 協議慢的一個重要原因之一。

我們來看下 TLS 1.3 的的交互過程,如圖所示:

其抓包得到的數據流如下:

 

在 TLS 1.3 中,客戶端首先不僅發送 ClientHello 支持的密碼列表,而且還猜測服務器將選擇哪種密鑰協商算法,並發送密鑰共享,這可以節省很大一部分的開銷,從而提高了速度。

TLS1.3 提供 1-RTT 的握手機制,還是以 ECDHE 密鑰交換過程為例,握手過程如下。將客戶端發送 ECDH 臨時公鑰的過程提前到 ClientHello,同時刪除了 ChangeCipherSpec 協議簡化握手過程,使第一次握手時只需要 1-RTT,來看具體的流程:

  • 客戶端發送 ClientHello 消息,該消息主要包括客戶端支持的協議版本、DH 密鑰交換參數列表 KeyShare;
  • 服務端回復 ServerHello,包含選定的加密套件;發送證書給客戶端;使用證書對應的私鑰對握手消息簽名,將結果發送給客戶端;選用客戶端提供的參數生成 ECDH 臨時公鑰,結合選定的 DH 參數計算出用於加密 HTTP 消息的共享密鑰;服務端生成的臨時公鑰通過 KeyShare 消息發送給客戶端;
  • 客戶端接收到 KeyShare 消息后,使用證書公鑰進行簽名驗證,獲取服務器端的 ECDH 臨時公鑰,生成會話所需要的共享密鑰;
  • 雙方使用生成的共享密鑰對消息加密傳輸,保證消息安全。

如果客戶端之前已經連接,我們有辦法在 1.2 中進行 1-RTT 連接,而在 TLS 1.3 中允許我們執行 0-RTT 連接,如圖所示:

需要說明的是,如需查看 TLS 1.3 的報文,需要使用 2.5 版本的 wireshark,可以去  下載

TLS 1.3 的新特性

1.廢除不支持前向安全性的 RSA 和 DH 密鑰交換算法;

2.MAC 只使用 AEAD 算法;

3.禁用 RC4 / SHA1 等不安全的算法;

4.加密握手消息;

5.減少往返時延 RTT,支持 0-RTT;

6.兼容中間設備 TLS 1.2;

7.加密握手消息:

TLS1.2 及之前版本的協議中各種擴展信息在 ServerHello 中以明文方式發送,但是 TLS 1.3 協議要求 ServerHello 消息之后的握手信息都需要加密。

 

△ tls1.2

△ tls1.3

瀏覽器支持 TLS 1.3

目前最新的 Chrome 和 Firefox 都支持 TLS 1.3,但需要手動開啟:

Chrome 中需要將 chrome://flags/ 中的 Maximum TLS version enabled 改為 TLS 1.3(Chrome 62 中需要將 TLS 1.3 改為 Enabled (Draft)

Firefox 中,將 about:config 中的 security.tls.version.max 改為 4;

Web 服務器支持 TLS 1.3

首先,需要下載 openssl 開發版,目前 TLS 1.3 還處於 draft 版,所以要克隆其分支進行編譯。

git clone -b tls1.3-draft-18 --single-branchopenssl

注意: github 的最新版本 tls1.3-draft-19 編譯后並不會有效果

以 nginx 1.13.8 為例(自 1.13.0 開始 nginx 開始支持 TLSv1.3),在編譯的時候加上

--with-openssl=../openssl --with-openssl-opt='enable-tls1_3 enable-weak-ssl-ciphers'

例如我的編譯參數

./configure --prefix=/usr/local/nginx --user=www --group=www --with-pcre=/opt/nginx/pcre-8.41 --with-http_ssl_module --with-zlib=/opt/nginx/zlib-1.2.11 --with-http_v2_module --add-module=../nginx-ct-1.3.2 --add-module=../ngx_brotli --with-openssl=../openssl --with-openssl-opt='enable-tls1_3 enable-weak-ssl-ciphers' --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module

編譯完成停止你的 nginx 進程,在 nginx 目錄執行如下命令

cp -rf ./objs/nginx /usr/local/nginx/sbin/

在你的 nginx 配置文件中添加如下配置

ssl_protocols              TLSv1.2 TLSv1.3; #增加 TLSv1.3重啟 nginx 服務。
ssl_ciphers                TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;

CDN 支持 TLS 1.3

目前,又拍雲的 CDN 網絡已經率先支持 TLS 1.3,你可以在又拍雲的控制台中開啟。

開啟路徑:CDN → 功能配置 → HTTPS → TLS1.3

開啟后通過瀏覽器訪問可以看到協議版本。

 

推薦閱讀:

一文讀懂 HTTP/2 特性

從 HTTP 到 HTTPS 再到 HSTS

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM