TLS 1.3 協議針對安全強化及效率提高等方面進行了大量修改,相繼推出 20 多個草案版本,即將完成最終的標準化。標準完成後,OpenSSL 組織將推出 OpenSSL 1.1.1 版本,對 TLS1.3 協議標準提供支持。html
本文主要講解 TLS 1.3 版本的相關特性以及如何在你的服務器上啓用 TLS 1.3 的支持。nginx
在談 TLS 1.3 以前,咱們先來看下 TLS 1.2 的工做模式,如圖所示是 TLS 1.2 客戶端和服務端交互的過程,如圖所示:git
咱們也能夠經過 Wireshark 抓包獲得的數據github
以 ECDHE 密鑰交換算法爲例,TLS1.2 協議完整的SSL握手過程以下:算法
能夠看到,TLS1.2 協議中須要加密套件協商、密鑰信息交換、ChangeCipherSpec 協議通告等過程,須要消耗 2-RTT 的握手時間,這也是形成 HTTPS 協議慢的一個重要緣由之一。chrome
咱們來看下 TLS 1.3 的的交互過程,如圖所示:瀏覽器
其抓包獲得的數據流以下:安全
在 TLS 1.3 中,客戶端首先不只發送 ClientHello 支持的密碼列表,並且還猜想服務器將選擇哪一種密鑰協商算法,併發送密鑰共享,這能夠節省很大一部分的開銷,從而提升了速度。服務器
TLS1.3 提供 1-RTT 的握手機制,仍是以 ECDHE 密鑰交換過程爲例,握手過程以下。將客戶端發送 ECDH 臨時公鑰的過程提早到 ClientHello,同時刪除了 ChangeCipherSpec 協議簡化握手過程,使第一次握手時只須要 1-RTT,來看具體的流程:網絡
若是客戶端以前已經鏈接,咱們有辦法在 1.2 中進行 1-RTT 鏈接,而在 TLS 1.3 中容許咱們執行 0-RTT 鏈接,如圖所示:
須要說明的是,如需查看 TLS 1.3 的報文,須要使用 2.5 版本的 wireshark,能夠去 https://www.wireshark.org/download/automated/ 下載
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
目前最新的 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;
首先,須要下載 openssl 開發版,目前 TLS 1.3 還處於 draft 版,因此要克隆其分支進行編譯。
git clone -b tls1.3-draft-18 --single-branchhttps://github.com/openssl/openssl.git
openssl
注意: 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 → 功能配置 → HTTPS → TLS1.3
開啓後經過瀏覽器訪問能夠看到協議版本。
推薦閱讀: