HTTPS - TLS 1.3 為何性能和安全性更高?
2008 年 8 月 TLS v1.2 發(fā)布,時隔 10 年,TLS v1.3 于 2018 年 8 月發(fā)布,在性能優(yōu)化和安全性上做了很大改變,同時為了避免新協(xié)議帶來的升級沖突,TLS v1.3 也做了兼容性處理,通過增加擴(kuò)展協(xié)議來支持舊版本的客戶端和服務(wù)器。
安全性
TLS v1.2 支持的加密套件很多,在兼容老版本上做的很全,里面有些加密強(qiáng)度很弱和一些存在安全漏洞的算法很可能會被攻擊者利用,為業(yè)務(wù)帶來潛在的安全隱患。TLS v1.3 移除了這些不安全的加密算法,簡化了加密套件,對于服務(wù)端握手過程中也減少了一些選擇。
- 移除 MD5、SHA1 密碼散列函數(shù)的支持,推薦使用 SHA2(例如,SHA-256)。
 - 移除 RSA 及所有靜態(tài)密鑰(密鑰協(xié)商不具有前向安全特性)。
 - 溢出 RC4 流密碼、DES 對稱加密算法。
 - 密鑰協(xié)商時的橢圓曲線算法增加 https://www.wanweibaike.net/wiki-X25519 支持。
 - 支持帶 Poly1305消息驗證碼 的 ChaCha20 流加密算法,流加密也是一種對稱加密算法。
 - 移除了 CBC 分組模式,TLS v1.3 對稱加密僅支持 AES GCM、AES CCM、ChaCha20**-**Poly1305 三種模式。
 - 服務(wù)端 “Server Hello” 之后的消息都會加密傳輸,因此常規(guī)抓包分析就會有疑問為什么看不到證書信息。
 
性能優(yōu)化
性能優(yōu)化一個顯著的變化是簡化了 TLS 握手階段,由 TLS v1.2 的 2-RTT 縮短為 1-RTT,同時在第一次建立鏈接后 TLS v1.3 還引入了 0-RTT 概念。
來源 https://www.a10networks.com/wp-content/uploads/differences-between-tls-1.2-and-tls-1.3-full-handshake.png
密鑰協(xié)商在 TLS v1.2 中需要客戶端/服務(wù)端雙方交換隨機(jī)數(shù)和服務(wù)器發(fā)送完證書后,雙方各自發(fā)送 “Clent/Server Key Exchange” 消息交換密鑰協(xié)商所需參數(shù)信息。在安全性上,TLS v1.3 移除了很多不安全算法,簡化了密碼套件,現(xiàn)在已移除了 “Clent/Server Key Exchange” 消息,在客戶端發(fā)送 “Client Hello” 消息時在擴(kuò)展協(xié)議里攜帶支持的橢圓曲線名稱、臨時公鑰、簽名信息。服務(wù)器收到消息后,在 “Server Hello” 消息中告訴客戶端選擇的密鑰協(xié)商參數(shù),由此可少了一次消息往返(1-RTT)。
- Client Server
 - Key ^ ClientHello
 - Exch | + key_share*
 - | + signature_algorithms*
 - | + psk_key_exchange_modes*
 - v + pre_shared_key* -------->
 - ServerHello ^ Key
 - + key_share* | Exch
 - + pre_shared_key* v
 - {EncryptedExtensions} ^ Server
 - {CertificateRequest*} v Params
 - {Certificate*} ^
 - {CertificateVerify*} | Auth
 - {Finished} v
 - <-------- [Application Data*]
 - ^ {Certificate*}
 - Auth | {CertificateVerify*}
 - v {Finished} -------->
 - [Application Data] <-------> [Application Data]
 - The basic full TLS handshake
 
當(dāng)訪問之前訪問過的站點時,客戶端可以通過利用先前會話中的 預(yù)共享密鑰 (PSK) 將第一條消息上的數(shù)據(jù)發(fā)送到服務(wù)器,實現(xiàn) “零往返時間(0-RTT)”。
- Client Server
 - ClientHello
 - + early_data
 - + key_share*
 - + psk_key_exchange_modes
 - + pre_shared_key
 - (Application Data*) -------->
 - ServerHello
 - + pre_shared_key
 - + key_share*
 - {EncryptedExtensions}
 - + early_data*
 - {Finished}
 - <-------- [Application Data*]
 - (EndOfEarlyData)
 - {Finished} -------->
 - [Application Data] <-------> [Application Data]
 - Message Flow for a 0-RTT Handshake
 
TLS v1.3 抓包分析
以一次客戶端/服務(wù)端完整的 TLS 握手為例,通過抓包分析看下 TLS v1.3 的握手過程。下圖是抓取的 www.zhihu.com 網(wǎng)站數(shù)據(jù)報文,且對報文做了解密處理,否則 “Change Cipher Spec” 報文后的數(shù)據(jù)都已經(jīng)被加密是分析不了的。抓包請參考 “網(wǎng)絡(luò)協(xié)議那些事兒 - 如何抓包并破解 HTTPS 加密數(shù)據(jù)?”。
image.png
TLS v1.3 握手過程如下圖所示:
tls-1-3-full-handshake.jpg
Client Hello
握手開始客戶端告訴服務(wù)端自己的 Random、Session ID、加密套件等。
除此之外,TLS v1.3 需要關(guān)注下 “擴(kuò)展協(xié)議”,TLS v1.3 通過擴(kuò)展協(xié)議做到了 “向前兼容“,客戶端請求的時候告訴服務(wù)器它支持的協(xié)議、及一些其它擴(kuò)展協(xié)議參數(shù),如果老版本不識別就忽略。
下面看幾個主要的擴(kuò)展協(xié)議:
- supported_versions:客戶端支持的 TLS 版本,供服務(wù)器收到后選擇。
 - supported_groups:支持的橢圓曲線名稱
 - key_share:橢圓曲線名稱和對應(yīng)的臨時公鑰信息。
 - signature_algorithms:簽名
 
- Transport Layer Security
 - TLSv1.3 Record Layer: Handshake Protocol: Client Hello
 - Version: TLS 1.0 (0x0301)
 - Handshake Protocol: Client Hello
 - Handshake Type: Client Hello (1)
 - Version: TLS 1.2 (0x0303)
 - Random: 77f485a55b836cbaf4328ea270082cdf35fd8132aa7487eae19997c8939a292a
 - Session ID: 8d4609d9f0785880eb9443eff3867a63c23fb2e23fdf80d225c1a5a25a900eee
 - Cipher Suites (16 suites)
 - Cipher Suite: Reserved (GREASE) (0x1a1a)
 - Cipher Suite: TLS_AES_128_GCM_SHA256 (0x1301)
 - Cipher Suite: TLS_AES_256_GCM_SHA384 (0x1302)
 - Cipher Suite: TLS_CHACHA20_POLY1305_SHA256 (0x1303)
 - Extension: signature_algorithms (len=18)
 - Extension: supported_groups (len=10)
 - Supported Groups (4 groups)
 - Supported Group: Reserved (GREASE) (0xcaca)
 - Supported Group: x25519 (0x001d)
 - Supported Group: secp256r1 (0x0017)
 - Supported Group: secp384r1 (0x0018)
 - Extension: key_share (len=43)
 - Type: key_share (51)
 - Key Share extension
 - Client Key Share Length: 41
 - Key Share Entry: Group: Reserved (GREASE), Key Exchange length: 1
 - Key Share Entry: Group: x25519, Key Exchange length: 32
 - Group: x25519 (29)
 - Key Exchange Length: 32
 - Key Exchange: 51afc57ca38df354f6d4389629e222ca2654d88f2800cc84f8cb74eefd473f4b
 - Extension: supported_versions (len=11)
 - Type: supported_versions (43)
 - Supported Versions length: 10
 - Supported Version: TLS 1.3 (0x0304)
 - Supported Version: TLS 1.2 (0x0303)
 
Server Hello
服務(wù)端收到客戶端請求后,返回選定的密碼套件、Server Random、選定的橢圓曲線名稱及對應(yīng)的公鑰(Server Params)、支持的 TLS 版本。
這次的密碼套件看著短了很多 TLS_AES_256_GCM_SHA384,其中用于協(xié)商密鑰的參數(shù)是放在 key_share 這個擴(kuò)展協(xié)議里的。
- TLSv1.3 Record Layer: Handshake Protocol: Server Hello
 - Content Type: Handshake (22)
 - Handshake Protocol: Server Hello
 - Handshake Type: Server Hello (2)
 - Version: TLS 1.2 (0x0303)
 - Random: 1f354a11aea2109ba22e26d663a70bddd78a87a79fed85be2d03d5fc9deb59a5
 - Session ID: 8d4609d9f0785880eb9443eff3867a63c23fb2e23fdf80d225c1a5a25a900eee
 - Cipher Suite: TLS_AES_256_GCM_SHA384 (0x1302)
 - Compression Method: null (0)
 - Extensions Length: 46
 - Extension: supported_versions (len=2)
 - Supported Version: TLS 1.3 (0x0304)
 - Extension: key_share (len=36)
 - Type: key_share (51)
 - Key Share extension
 - Key Share Entry: Group: x25519, Key Exchange length: 32
 - Group: x25519 (29)
 - Key Exchange: ac1e7f0dd5a4ee40fd088a8c00113178bafb2df59e0d6fc74ce77452732bc44d
 
服務(wù)端此時拿到了 Client Random、Client Params、Server Random、Server Params 四個參數(shù),可優(yōu)先計算出預(yù)主密鑰。在 TLS v1.2 中是經(jīng)歷完第一次消息往返之后,客戶端優(yōu)先發(fā)起請求。
在計算出用于對稱加密的會話密鑰后,服務(wù)端發(fā)出 Change Cipher Spec 消息并切換到加密模式,之后的所有消息(證書、證書驗證)傳輸都會加密處理,也減少了握手期間的明文傳遞。
Certificate、Certificate Verify、Finished
除了 Certificate 外,TLS v1.3 還多了個 “Certificate Verify” 消息,使用服務(wù)器私鑰對握手信息做了一個簽名,強(qiáng)化了安全措施。
- Transport Layer Security
 - TLSv1.3 Record Layer: Handshake Protocol: Certificate
 - TLSv1.3 Record Layer: Handshake Protocol: Certificate Verify
 - Handshake Protocol: Certificate Verify
 - Signature Algorithm: rsa_pss_rsae_sha256 (0x0804)
 - Signature Hash Algorithm Hash: Unknown (8)
 - Signature Hash Algorithm Signature: Unknown (4)
 - Signature length: 256
 - Signature: 03208990ec0d4bde4af8e2356ae7e86a045137afa5262ec7c82d55e95ba23b6eb5876ebb…
 - TLSv1.3 Record Layer: Handshake Protocol: Finished
 - Handshake Protocol: Finished
 - Verify Data
 
客戶端切換加密模式
客戶端獲取到 Client Random、Client Params、Server Random、Server Params  四個參數(shù)計算出最終會話密鑰后,也會發(fā)起 “Certificate Verify”、“Finished” 消息,當(dāng)客戶端和服務(wù)端都發(fā)完 “Finished”  消息后握手也就完成了,接下來就可安全的傳輸數(shù)據(jù)了。
image.png



















 
 
 







 
 
 
 