斯坦福 CS144 計(jì)算機(jī)網(wǎng)絡(luò)播客:網(wǎng)絡(luò)安全關(guān)鍵概念與手段 TLS/HTTPS
在本文中,我們將從網(wǎng)絡(luò)安全的四大核心屬性出發(fā),逐步深入探討常見的威脅模型、強(qiáng)大的密碼學(xué)工具箱、保障信任的證書體系,并最終通過(guò)解析 TLS/HTTPS 協(xié)議,將所有知識(shí)點(diǎn)串聯(lián)起來(lái)。
奠定安全基石:網(wǎng)絡(luò)安全的四大核心屬性
任何一個(gè)安全系統(tǒng)的設(shè)計(jì),都離不開四個(gè)基本目標(biāo),它們是評(píng)估系統(tǒng)安全性的基石。
- 機(jī)密性 (Confidentiality) :確保信息只被授權(quán)的實(shí)體訪問(wèn)和理解。通俗地說(shuō),就是“不該看的人看不懂”。即使攻擊者竊聽了你們的通信,他也無(wú)法解讀其中真正的內(nèi)容。實(shí)現(xiàn)機(jī)密性的主要技術(shù)是 加密 (Encryption) 。一個(gè)有趣的應(yīng)用是機(jī)會(huì)性加密 (Opportunistic encryption),它指的是即使通信雙方身份未經(jīng)嚴(yán)格認(rèn)證,也進(jìn)行加密,其主要目的是防止大規(guī)模、非針對(duì)性的網(wǎng)絡(luò)監(jiān)聽。
- 完整性 (Integrity) :確保數(shù)據(jù)在傳輸或存儲(chǔ)過(guò)程中沒有被未經(jīng)授權(quán)地篡改或損壞。也就是說(shuō),你收到的數(shù)據(jù)必須和你朋友發(fā)送的數(shù)據(jù)一模一樣,一個(gè)比特都不能差。需要注意的是,加密本身只保證機(jī)密性,并不能防止攻擊者修改密文。在很多場(chǎng)景下,完整性的優(yōu)先級(jí)甚至高于機(jī)密性。
- 真實(shí)性 (Authenticity) :確認(rèn)通信參與方的身份是其所聲稱的身份。簡(jiǎn)單來(lái)說(shuō),就是“確認(rèn)和你聊天的是你以為的那個(gè)人”。真實(shí)性是建立安全通信的前提,你必須先確認(rèn)對(duì)方的身份,然后才能放心地將機(jī)密信息發(fā)送給他。 證書 (Certificate) 是實(shí)現(xiàn)真實(shí)性的關(guān)鍵技術(shù)。
- 可用性 (Availability) :確保授權(quán)用戶在需要時(shí)能夠正常訪問(wèn)和使用網(wǎng)絡(luò)服務(wù)與資源。這個(gè)屬性主要用來(lái)對(duì)抗拒絕服務(wù)攻擊等旨在讓服務(wù)癱瘓的攻擊。
知己知彼:理解我們面臨的威脅
網(wǎng)絡(luò)世界中的威脅多種多樣,我們可以將其大致分為兩類:意外破壞和蓄意的對(duì)抗性攻擊。
意外破壞 (Accidental Corruption)
這類威脅并非出于惡意,而是由硬件故障、軟件 bug、信道噪聲等原因?qū)е碌臄?shù)據(jù)損壞。我們熟悉的 IP 頭的校驗(yàn)和、TCP/UDP 的校驗(yàn)和以及以太網(wǎng)的幀校驗(yàn)序列 (Frame Check Sequence, FCS),其主要目的就是檢測(cè)這類意外錯(cuò)誤。
對(duì)抗性攻擊 (Adversarial Attacks)
這是我們關(guān)注的重點(diǎn),指攻擊者主動(dòng)發(fā)起的、旨在破壞系統(tǒng)安全屬性的惡意行為。
竊聽 (Eavesdropping)
攻擊者被動(dòng)地監(jiān)聽網(wǎng)絡(luò)流量以獲取敏感信息。在早期的集線器 (Hub) 以太網(wǎng)或如今的 Wi-Fi 環(huán)境中,數(shù)據(jù)包以廣播形式發(fā)送,竊聽相對(duì)容易。在現(xiàn)代交換式網(wǎng)絡(luò)中,攻擊者可以通過(guò) MAC 地址泛洪攻擊 (MAC Overflow Attack) ,向交換機(jī)發(fā)送大量偽造源 MAC 地址的數(shù)據(jù)包,耗盡其 MAC 地址表容量,迫使交換機(jī)進(jìn)入“廣播模式”,從而監(jiān)聽到整個(gè)網(wǎng)絡(luò)的流量。
篡改 (Modification)
攻擊者在數(shù)據(jù)傳輸過(guò)程中主動(dòng)修改、插入或刪除數(shù)據(jù)。例如,攻擊者可以修改數(shù)據(jù)包的目標(biāo)地址,或者篡改 DNS 響應(yīng),將用戶引導(dǎo)至惡意網(wǎng)站。為了不被發(fā)現(xiàn),攻擊者通常會(huì)重新計(jì)算并修改數(shù)據(jù)包的校驗(yàn)和。對(duì)抗篡改的主要武器是 安全哈希 和 消息認(rèn)證碼 (Message Authentication Code, MAC) 。
重放 (Replay)
攻擊者截獲一段合法的通信數(shù)據(jù),然后在稍后的時(shí)間點(diǎn)重新發(fā)送它,以達(dá)到欺騙系統(tǒng)的目的。例如,截獲一個(gè)轉(zhuǎn)賬請(qǐng)求并重復(fù)發(fā)送。防御重放攻擊的一個(gè)有效方式是確保協(xié)議操作的 冪等性 (Idempotence) ,即重復(fù)執(zhí)行同一操作不會(huì)產(chǎn)生額外的副作用,或者在協(xié)議中加入時(shí)間戳或一次性隨機(jī)數(shù) (Nonce)。
中間人攻擊 (Man-in-the-Middle, MITM)
這是最經(jīng)典也最危險(xiǎn)的攻擊之一。攻擊者將自己插入到兩個(gè)通信方之間,對(duì)雙方冒充對(duì)方的身份,從而能夠竊聽、篡改甚至完全控制雙方的通信,而通信雙方卻毫不知情。
ARP 欺騙 (ARP Spoofing) 是局域網(wǎng)中實(shí)現(xiàn) MITM 的常見手段。攻擊者通過(guò)偽造 ARP 響應(yīng),讓用戶的流量錯(cuò)誤地發(fā)送到攻擊者的機(jī)器上,再由攻擊者轉(zhuǎn)發(fā)給真正的網(wǎng)關(guān)。
# 正常通信 (Normal Communication)
# User A 的流量直接發(fā)往 Gateway
[ User A ] ----> [ Gateway ] ----> [ Internet ]
# ARP 欺騙后的通信 (Communication after ARP Spoofing)
# User A 的流量先被 Attacker 截獲,再由 Attacker 轉(zhuǎn)發(fā)
[ User A ] ----> [ Attacker ] ----> [ Gateway ] ----> [ Internet ]拒絕服務(wù)攻擊 (Denial of Service, DoS)
DoS 攻擊及其分布式版本 DDoS,旨在通過(guò)消耗目標(biāo)的網(wǎng)絡(luò)帶寬、計(jì)算資源或連接數(shù),使其無(wú)法為正常用戶提供服務(wù)。DDoS 攻擊通常由一個(gè)控制端和大量被操控的“僵尸網(wǎng)絡(luò) (Botnet)”構(gòu)成。攻擊手段五花八門,遍布網(wǎng)絡(luò)協(xié)議的各個(gè)層級(jí):
網(wǎng)絡(luò)層
- Ping 泛洪 (Ping Flood) :用海量的
ICMP Echo Request數(shù)據(jù)包淹沒目標(biāo)。 - Smurf 攻擊 :將偽造成受害者
IP的ICMP Echo Request發(fā)送到一個(gè)網(wǎng)絡(luò)的廣播地址,導(dǎo)致該網(wǎng)絡(luò)所有設(shè)備都向受害者回復(fù)IC-MP Echo Reply,形成流量放大效應(yīng)。 - IP 碎片泛洪 (IP Fragment Flooding) :發(fā)送大量
IP碎片,但故意不發(fā)送最后一個(gè)碎片,迫使目標(biāo)服務(wù)器為重組數(shù)據(jù)包而持續(xù)分配內(nèi)存,最終耗盡資源。
傳輸層
- SYN 泛洪 (SYN Flood) :利用
TCP三次握手的缺陷,攻擊者發(fā)送大量偽造源IP的SYN包,服務(wù)器為這些半開連接分配資源并等待ACK,最終導(dǎo)致連接表被耗盡。
應(yīng)用層
- DNS 放大攻擊 (DNS Amplification Attack) :攻擊者偽造受害者
IP向大量開放DNS解析器發(fā)送一個(gè)短請(qǐng)求,而DNS服務(wù)器則會(huì)向受害者返回一個(gè)非常大的響應(yīng),從而放大攻擊流量。 - SSL/TLS 握手攻擊 :
SSL/TLS握手過(guò)程中,服務(wù)器需要進(jìn)行計(jì)算密集型的公鑰解密操作。攻擊者通過(guò)發(fā)起大量握手請(qǐng)求來(lái)耗盡服務(wù)器的CPU資源。
劫持 (Hijacking)
BGP 劫持 (BGP Hijacking) :BGP 是互聯(lián)網(wǎng)的路由協(xié)議。攻擊者所在的自治系統(tǒng) (Autonomous System, AS) 可以惡意地向全球宣告一個(gè)不屬于它的 IP 地址段歸它所有,從而將原本流向這個(gè) IP 段的流量“劫持”到自己的網(wǎng)絡(luò)中。2008 年巴基斯坦電信意外劫持 YouTube 流量就是一次著名的真實(shí)案例。
TCP 連接劫持 (TCP Connection Hijacking) :攻擊者通過(guò)預(yù)測(cè) TCP 序列號(hào) (Sequence Number),在兩個(gè)已建立連接的通信方之間注入惡意數(shù)據(jù),從而接管該 TCP 連接。
元數(shù)據(jù)隱私 (Metadata Privacy)
即使通信內(nèi)容被加密,數(shù)據(jù)包的 IP 頭部信息(如源/目標(biāo)地址、數(shù)據(jù)包大小、通信時(shí)間)依然是明文的。這些元數(shù)據(jù)同樣可以暴露大量隱私信息。
鑄造堅(jiān)盾:密碼學(xué)的核心工具箱
密碼學(xué) (Cryptography) 是網(wǎng)絡(luò)安全的數(shù)學(xué)基礎(chǔ),它為我們提供了對(duì)抗上述威脅的強(qiáng)大武器。
安全哈希算法 (Secure Hash Algorithm)
哈希函數(shù)能將任意長(zhǎng)度的輸入(消息)轉(zhuǎn)換成一個(gè)固定長(zhǎng)度的輸出(哈希值或摘要)。一個(gè)安全的哈希函數(shù)應(yīng)具備兩個(gè)關(guān)鍵特性:
- 單向性 (One-way) :從哈希值反推出原始輸入在計(jì)算上是不可行的。
- 抗碰撞性 (Collision-resistant) :找到兩個(gè)不同的輸入,使得它們的哈希值相同,在計(jì)算上是不可行的。
哈希的主要用途是驗(yàn)證 完整性 。SHA-256 和 SHA-3 是當(dāng)前推薦使用的算法,而 MD5 和 SHA-1 已被證明存在嚴(yán)重安全缺陷,應(yīng)避免使用。
消息認(rèn)證碼 (Message Authentication Code, MAC)
MAC 也被稱為 帶密鑰的哈希 (keyed hash) 。它結(jié)合了一個(gè)秘密密鑰 K 和消息 M 來(lái)生成一個(gè)認(rèn)證標(biāo)簽 (tag)。接收方使用相同的密鑰和收到的消息重新計(jì)算標(biāo)簽,并與收到的標(biāo)簽對(duì)比。如果一致,就能證明消息在傳輸過(guò)程中 未被篡改 (完整性) ,并且該消息確實(shí) 來(lái)自持有相同密鑰的發(fā)送方 (真實(shí)性) 。HMAC 是一種基于哈希函數(shù)構(gòu)造 MAC 的標(biāo)準(zhǔn)方法。
一個(gè)重要的實(shí)踐原則是 先加密,再認(rèn)證 (Encrypt-then-MAC) ,即對(duì)加密后的密文計(jì)算 MAC 值。
對(duì)稱加密 (Symmetric Encryption)
對(duì)稱加密使用同一個(gè)密鑰進(jìn)行加密和解密。它的優(yōu)點(diǎn)是速度快,適合加密大量數(shù)據(jù)。
一次性密碼本 (One-Time Pad) :理論上最安全的加密方式。它使用一個(gè)與明文等長(zhǎng)的、完全隨機(jī)的密鑰,與明文進(jìn)行異或 (XOR) 操作。它的安全性無(wú)懈可擊,但前提是密鑰必須是真隨機(jī)、只使用一次且安全地分發(fā)。這些嚴(yán)苛的條件使其在實(shí)踐中幾乎無(wú)法應(yīng)用。 密鑰重用是其致命缺陷 ,如果用同一密鑰加密兩條不同消息 m1 和 m2,攻擊者可以通過(guò) c1 XOR c2 直接得到 m1 XOR m2,從而破解密文。
流密碼 (Stream Ciphers) :它模擬了一次性密碼本,通過(guò)一個(gè)種子密鑰生成一個(gè)足夠長(zhǎng)的偽隨機(jī)密鑰流,然后與明文進(jìn)行異或。早期的 Wi-Fi 加密協(xié)議 WEP 就使用了流密碼,但因其設(shè)計(jì)缺陷而很快被攻破。
分組密碼 (Block Ciphers) :它將明文分成固定大小的塊(如 128 位),然后對(duì)每個(gè)塊進(jìn)行加密。 AES (Advanced Encryption Standard) 是目前最流行、最安全的分組密碼標(biāo)準(zhǔn)。為了加密比單個(gè)分組更長(zhǎng)的消息,需要配合不同的 工作模式 (mode of operation) 。
- 電子密碼本模式 (Electronic Code Book, ECB) :這是最簡(jiǎn)單但也最不安全的模式。它獨(dú)立地加密每個(gè)明文塊。如果明文中存在重復(fù)的塊,那么加密后的密文中也會(huì)出現(xiàn)重復(fù)的塊,從而暴露了原始數(shù)據(jù)的模式。 絕對(duì)不要使用 ECB 模式!
- 密文分組鏈接模式 (Cipher Block Chaining, CBC) :為了解決
ECB的問(wèn)題,CBC模式在加密當(dāng)前明文塊之前,會(huì)先將其與前一個(gè)密文塊進(jìn)行異或。這使得即使明文塊相同,產(chǎn)生的密文塊也不同,從而隱藏了數(shù)據(jù)模式。CBC需要一個(gè)隨機(jī)且不可預(yù)測(cè)的 初始化向量 (Initialization Vector, IV) 作為第一個(gè)塊的“前一個(gè)密文塊”。
公鑰密碼學(xué) (Public-key Cryptography)
公鑰密碼學(xué),也稱非對(duì)稱加密,使用一對(duì)密鑰:一個(gè) 公鑰 (public key) 和一個(gè) 私鑰 (private key) 。公鑰可以公開分發(fā),而私鑰必須由所有者嚴(yán)格保密。
- 加密通信 :任何人都可以用接收方的公鑰加密信息,但只有持有對(duì)應(yīng)私鑰的接收方才能解密。這完美地解決了對(duì)稱加密中密鑰分發(fā)的難題。
- 數(shù)字簽名 (Digital Signature) :發(fā)送方可以用自己的私鑰對(duì)消息的哈希值進(jìn)行“簽名”,接收方可以用發(fā)送方的公鑰來(lái)驗(yàn)證簽名。如果驗(yàn)證通過(guò),就能確認(rèn)消息的 完整性 和 真實(shí)性 (即消息確實(shí)由該私鑰所有者發(fā)出且未被篡改)。
RSA 是最著名的公鑰算法。相比對(duì)稱加密,公鑰加密的計(jì)算開銷非常大。因此,在實(shí)踐中,通常采用混合方案: 使用公鑰加密來(lái)安全地協(xié)商一個(gè)臨時(shí)的對(duì)稱密鑰,然后使用這個(gè)對(duì)稱密鑰進(jìn)行高效的數(shù)據(jù)加密 。
密鑰交換與前向保密
Diffie-Hellman (迪菲-赫爾曼) 密鑰交換協(xié)議允許通信雙方在一個(gè)完全公開的信道上,協(xié)商出一個(gè)只有他們兩人知道的共享秘密,即使竊聽者監(jiān)視了所有交換過(guò)程也無(wú)法得知這個(gè)秘密。
一個(gè)極其重要的概念是 前向保密 (Forward Secrecy) 。它指的是,即使服務(wù)器的長(zhǎng)期私鑰在未來(lái)某個(gè)時(shí)間點(diǎn)被泄露,攻擊者也無(wú)法用這個(gè)私鑰解密過(guò)去被截獲的通信數(shù)據(jù)。實(shí)現(xiàn)前向保密的關(guān)鍵在于每次會(huì)話都使用臨時(shí)的、用后即焚的密鑰(例如 Ephemeral Diffie-Hellman),而不是直接使用服務(wù)器的長(zhǎng)期私KEY。
臨時(shí)密鑰并不“傳輸”私鑰本身,而是雙方各自產(chǎn)生臨時(shí)密鑰對(duì)并只交換臨時(shí)公鑰;通過(guò)(Ephemeral)Diffie–Hellman 的數(shù)學(xué)操作在雙方本地各自算出相同的共享密鑰。攻擊者即便事后拿到長(zhǎng)期私鑰,也無(wú)法從握手中記錄的公鑰推算出當(dāng)時(shí)的會(huì)話密鑰(前提是離散對(duì)數(shù)問(wèn)題不可解)。
關(guān)鍵差別——RSA 密鑰交換 vs. Ephemeral DH (DHE/ECDHE)
- 在傳統(tǒng)的 RSA 密鑰交換(早期 TLS 配置)中,客戶端生成
pre-master并用服務(wù)器的 長(zhǎng)期公鑰 加密后發(fā)送。若攻擊者事后獲得服務(wù)器的長(zhǎng)期私鑰,就能解密錄下的握手記錄,從而恢復(fù)pre-master并解密過(guò)去會(huì)話 —— 沒有前向保密 。 - 在 Ephemeral Diffie–Hellman (DHE/ECDHE) 中,客戶端和服務(wù)器各自生成一次性的(ephemeral)DH 私鑰與對(duì)應(yīng)公鑰,只交換 公鑰 。最終的會(huì)話密鑰 = 基于雙方私鑰與對(duì)方公鑰在本地計(jì)算得到的共享值(例如 ),私鑰從未離開各自主機(jī),也不會(huì)被明文發(fā)送。即使攻擊者后來(lái)拿到服務(wù)器長(zhǎng)期私鑰,也無(wú)法由握手記錄推出當(dāng)時(shí)的 ephemeral 私鑰或共享密鑰 ,因此過(guò)去會(huì)話保持保密 —— 實(shí)現(xiàn)前向保密 。
數(shù)學(xué)/實(shí)現(xiàn)上的直觀 :雙方交換的是 和 (公鑰),客戶端計(jì)算 ,服務(wù)器計(jì)算 ,兩者相同。要從 或 推出 或 需要解決離散對(duì)數(shù)問(wèn)題(被認(rèn)為不可行)。
但注意兩點(diǎn)例外 / 限制:
- 如果實(shí)現(xiàn)或配置錯(cuò)誤(例如服務(wù)器同時(shí)記錄或泄露了 ephemeral 私鑰,或使用非臨時(shí)的 DH 參數(shù)),前向保密就失效。
- 如果未來(lái)有算法/硬件(例如大規(guī)模量子計(jì)算機(jī))能高效解決相應(yīng)數(shù)學(xué)問(wèn)題,那么現(xiàn)在記錄的握手也可能被解密 —— 這是為什么加密算法和參數(shù)需要周期性更新的原因。
TLS 1.3 默認(rèn)使用基于(橢圓)DH 的 ephemeral 密鑰交換,天然優(yōu)先前向保密;而 TLS 1.2 只有在使用 ECDHE/DHE 時(shí)才有前向保密,使用 RSA 密鑰交換就沒有。
信任的根基:證書與公鑰基礎(chǔ)設(shè)施
公鑰密碼學(xué)很棒,但它留下一個(gè)關(guān)鍵問(wèn)題:我如何確定這個(gè)公鑰真的屬于 Amazon,而不是某個(gè)中間人攻擊者偽造的?
答案是 公鑰基礎(chǔ)設(shè)施 (Public Key Infrastructure, PKI) 和 數(shù)字證書 (Digital Certificate) 。
- 證書 :一個(gè)由權(quán)威機(jī)構(gòu)頒發(fā)的數(shù)字文件,它將一個(gè)身份(如域名
www.google.com)和一個(gè)公鑰綁定在一起。 - 證書頒發(fā)機(jī)構(gòu) (Certificate Authority, CA) :一個(gè)受信任的第三方,負(fù)責(zé)驗(yàn)證申請(qǐng)者的身份,并用自己的私鑰為申請(qǐng)者的證書進(jìn)行簽名。
- 信任鏈 (Chain of Trust) :你的操作系統(tǒng)和瀏覽器預(yù)裝了一批“根
CA”的證書。當(dāng)你訪問(wèn)一個(gè)網(wǎng)站(如google.com)時(shí),它會(huì)出示自己的證書。這個(gè)證書可能是由一個(gè)“中間CA”頒發(fā)的,而這個(gè)中間CA的證書又是由根CA頒發(fā)的。通過(guò)逐級(jí)驗(yàn)證簽名,你的瀏覽器最終可以確認(rèn)google.com的證書是可信的,從而建立起一條信任鏈。
為防止 CA 被攻破或?yàn)E用權(quán)力, 證書透明度日志 (Certificate Transparency Log) 機(jī)制被提了出來(lái)。它要求所有 CA 公開記錄其頒發(fā)的每一份證書,允許任何人監(jiān)督,從而及時(shí)發(fā)現(xiàn)未經(jīng)授權(quán)的證書。
實(shí)戰(zhàn)剖析:TLS/HTTPS 如何保護(hù)你的通信
TLS (Transport Layer Security) ,即傳輸層安全協(xié)議,是 HTTPS 的核心。它位于 TCP 之上,應(yīng)用層之下,為 HTTP 等應(yīng)用層協(xié)議提供機(jī)密性、完整性和真實(shí)性保護(hù)。下面是 TLS 1.2 握手協(xié)議的簡(jiǎn)化流程:
- Client Hello :客戶端向服務(wù)器發(fā)送它支持的
TLS版本、一個(gè)密碼套件 (Cipher Suite) 列表和一個(gè)隨機(jī)數(shù)random_c。 - Server Hello :服務(wù)器從列表中選擇一個(gè)密碼套件,返回自己的證書和一個(gè)隨機(jī)數(shù)
random_s。 - 密鑰交換 :客戶端驗(yàn)證服務(wù)器證書。驗(yàn)證通過(guò)后,生成一個(gè) 預(yù)主密鑰 (pre-master secret) ,用服務(wù)器證書中的公鑰加密后發(fā)送給服務(wù)器。
- 生成會(huì)話密鑰 :客戶端和服務(wù)器現(xiàn)在都擁有了
random_c、random_s和pre-master secret。它們使用這三個(gè)隨機(jī)源,通過(guò)一個(gè)偽隨機(jī)函數(shù) (PRF) 計(jì)算出完全相同的 主密鑰 (master secret) ,并由主密鑰進(jìn)一步派生出會(huì)話所需的所有對(duì)稱密鑰(加密密鑰、MAC 密鑰等)。 - Finished :雙方各自發(fā)送一個(gè)
Finished消息,該消息是之前所有握手消息的MAC值,并用剛剛生成的會(huì)話密鑰加密。這可以驗(yàn)證整個(gè)握手過(guò)程沒有被篡改。
握手完成后,雙方就可以使用協(xié)商好的對(duì)稱會(huì)話密鑰來(lái)加密和認(rèn)證應(yīng)用數(shù)據(jù)了?,F(xiàn)代的 TLS (如 TLS 1.3) 還會(huì)優(yōu)先使用支持前向保密的密鑰交換算法 (如 ECDHE)。
下面是 TLS 1.3 握手協(xié)議的流程:
- Client Hello (客戶端):
- 包含支持的 TLS 版本集合、密碼套件列表、
key_share(客戶端的 ephemeral 公鑰,如 ECDHE 公鑰)、psk/early_data(若嘗試 0-RTT)、以及 ALPN 等擴(kuò)展。 - 客戶端計(jì)算并保存握手記錄的 transcript(握手消息哈希)。
- (可能) HelloRetryRequest (服務(wù)器):如果服務(wù)器需要客戶端使用其他曲線或密鑰交換參數(shù),會(huì)返回 HelloRetryRequest,客戶端據(jù)此發(fā)送一個(gè)更新過(guò)
ClientHello(帶新的key_share)。 - ServerHello (服務(wù)器):選擇版本、密碼套件并返回自己的
key_share(服務(wù)器 ephemeral 公鑰)。到這一步,雙方都能基于各自的 ephemeral 私鑰與對(duì)方公鑰導(dǎo)出共享密鑰(ECDHE 生成的共享值)。 - 派生握手密鑰(Handshake keys) :雙方使用 HKDF 等機(jī)制基于共享值與早期 secret(若有 PSK)派生出“握手密鑰”,用于對(duì)后續(xù)握手消息加密/認(rèn)證。
- EncryptedExtensions、Certificate、CertificateVerify、Finished(服務(wù)器→客戶端) :服務(wù)器在加密的握手通道上發(fā)送其證書(如果需要),并用
CertificateVerify對(duì)證書內(nèi)容進(jìn)行簽名,然后發(fā)送Finished。這些消息已經(jīng)由握手密鑰加密/認(rèn)證,從而防止中間人篡改握手后半程。 - 客戶端驗(yàn)證并響應(yīng) :客戶端驗(yàn)證證書鏈與
CertificateVerify,計(jì)算 transcript hash,驗(yàn)證服務(wù)器的Finished,然后發(fā)送(加密的)Finished給服務(wù)器。 - 應(yīng)用數(shù)據(jù)(Encrypted Application Data) :雙方用由 master secret 派生出的應(yīng)用密鑰來(lái)加密后續(xù)的應(yīng)用數(shù)據(jù)(HTTP 請(qǐng)求/響應(yīng))。
- 會(huì)話恢復(fù) / NewSessionTicket(可選,服務(wù)器在握手后發(fā)送) :服務(wù)器可在握手完成后發(fā)送
NewSessionTicket,客戶端以后用它 + PSK 做會(huì)話恢復(fù)或 0-RTT 數(shù)據(jù)發(fā)送。
這里的 0-RTT(zero-Round-Trip-Time) 是 TLS 1.3 的一項(xiàng)特性,允許客戶端在發(fā)出第一次網(wǎng)絡(luò)包(ClientHello)時(shí)就把應(yīng)用數(shù)據(jù)一起發(fā)出去,無(wú)需等待服務(wù)器完成完整握手。換句話說(shuō):客戶端可以在“第 0 個(gè)往返”就發(fā)送數(shù)據(jù),從而顯著降低延遲(對(duì)首包請(qǐng)求很有用)。
HTTPS 基本流程就是這樣:應(yīng)用(HTTP)在 TLS 之上,TLS 在傳輸層(通常是 TCP)之上。常見 HTTPS 流程為:建立 TCP → 在該 TCP 上做 TLS 握手 → 握手完成后在加密通道上發(fā)送 HTTP。但也有現(xiàn)代變體(比如 QUIC/HTTP/3)把 TLS 與傳輸層更緊密地結(jié)合了。
傳統(tǒng) HTTPS(HTTP/1.1、常見 HTTP/2 實(shí)現(xiàn)):
- DNS 解析 → 2. 與服務(wù)器建立 TCP 連接(例如到 443 端口)。
- 在那個(gè) TCP 連接上進(jìn)行 TLS 握手 (協(xié)商協(xié)議版本、密碼套件、完成密鑰交換并建立加密通道)。
- TLS 完成后, HTTP 請(qǐng)求/響應(yīng)以加密形式在該通道上傳輸(HTTP 報(bào)文被 TLS 封裝和保護(hù))。
- TLS 握手期間可以通過(guò) ALPN(Application-Layer Protocol Negotiation) 協(xié)商使用 HTTP/2、HTTP/1.1 等。
HTTP/3(QUIC)例外
- QUIC 是基于 UDP 的新傳輸協(xié)議,它將運(yùn)輸層功能和 TLS 安全集成在同一個(gè)協(xié)議里。也就是說(shuō),QUIC 在握手過(guò)程中同時(shí)完成傳輸層建立和 TLS 安全協(xié)商(TLS 1.3 的握手被嵌入 QUIC),因此沒有先 TCP 再 TLS 再 HTTP 的嚴(yán)格分層:是 UDP → QUIC(內(nèi)含 TLS)→ HTTP/3。這樣可以減少連接建立延遲和提升遷移/重連性能。
其他補(bǔ)充
- TLS 會(huì)話恢復(fù) / PSK :為了降低延遲,客戶端可使用會(huì)話恢復(fù)或預(yù)共享密鑰(PSK)來(lái)跳過(guò)完整握手,從而減少 RTT。TLS 1.3 在這方面更高效(0-RTT 有風(fēng)險(xiǎn):早期數(shù)據(jù)在重放和部分安全屬性上要謹(jǐn)慎)。
- TLS 本身不是專門為 HTTP 設(shè)計(jì)的,它可以保護(hù)多種應(yīng)用層協(xié)議(SMTP、IMAP、數(shù)據(jù)庫(kù)協(xié)議等),但 HTTPS 是其最常見的應(yīng)用場(chǎng)景。
安全之道:超越算法的設(shè)計(jì)哲學(xué)
一些超越具體技術(shù)的高層次安全原則如下。
- 不要自己發(fā)明或?qū)崿F(xiàn)加密算法 (Don't roll your own crypto) :密碼學(xué)極其微妙,一個(gè)微小的實(shí)現(xiàn)錯(cuò)誤都可能導(dǎo)致整個(gè)系統(tǒng)崩潰。永遠(yuǎn)優(yōu)先使用經(jīng)過(guò)公開、嚴(yán)格審查的、被廣泛接受的標(biāo)準(zhǔn)庫(kù)和實(shí)現(xiàn)。
- 保持加密敏捷性 (Crypto Agility) :在設(shè)計(jì)系統(tǒng)時(shí),應(yīng)使其能夠方便地切換和升級(jí)加密算法。當(dāng)某個(gè)算法被發(fā)現(xiàn)不再安全時(shí),你可以迅速遷移到更強(qiáng)的替代方案。
- 培養(yǎng)安全思維 (Security Mindset) :始終以攻擊者的視角來(lái)審視自己設(shè)計(jì)的系統(tǒng)。遵循 縱深防御 (Defense in Depth) 和 最小權(quán)限原則 (Least Privilege) ,假設(shè)任何組件都可能被攻破,并為此設(shè)計(jì)應(yīng)對(duì)措施。
- 假定網(wǎng)絡(luò)是不安全的 (Assume the network is insecure) :這是網(wǎng)絡(luò)安全設(shè)計(jì)的黃金法則。永遠(yuǎn)不要信任底層的網(wǎng)絡(luò)。你應(yīng)該假設(shè)攻擊者可以竊聽、篡改、重放、劫持你的所有網(wǎng)絡(luò)通信,并在此基礎(chǔ)上構(gòu)建你的安全協(xié)議。

























