HTTPS工作(do)原理
爲(for)什麽需要(want) HTTPS?
我(I)們(them)爲(for)什麽需要(want) HTTPS?主要(want)有如下三個(indivual)原因:
HTTPS 是(yes)什麽?SSL/TLS 是(yes)什麽?
于(At)是(yes) IETF 将 SSL 作(do)了(Got it)标準化,重新命名爲(for) TLS(Transport Layer Security)。在(exist) 1999 年,TLS 1.0 誕生(born)了(Got it)(其實也就是(yes) SSL 3.1)。
SSL/TLS 發展史
SSL/TLS 發展史如上(superior)圖:
-
Google 将在(exist) Chrome 72 中不(No)推薦使用(use) TLS 1.0 和(and) 1.1,而 Chrome 81 之後将會完全不(No)支持。
-
Mozilla 的(of) Firefox,微軟的(of) Edge 和(and) IE 以(by)及蘋果的(of) Safari 都會分别于(At) 2020 年逐漸移除對 TLS 1.0 和(and) 1.1 的(of)支持。
要(want)關閉浏覽器對 TLS 1.0 和(and) 1.1 的(of)支持,可以(by)在(exist) Internet 選項中修改:
SSL/TLS 的(of)工作(do)原理
需要(want)理解 SSL/TLS 的(of)工作(do)原理,我(I)們(them)需要(want)掌握加密算法。
加密算法有兩種:
-
對稱加密
-
非對稱加密
先來(Come)看下整個(indivual) SSL/TLS 的(of)握手過程,之後我(I)們(them)再分步驟詳細解讀,每一(one)步都幹了(Got it)些什麽。
①當 TCP 建立連接之後,TLS 握手的(of)第一(one)步由客戶端發起,發送 ClientHello 的(of)消息到(arrive)服務器。
-
客戶端支持的(of) SSL/TLS 版本
-
客戶端支持的(of)加密套件(Cipher Suites)
-
會話 Idsession id(如果有的(of)值的(of)話,服務器端會複用(use)對應的(of)握手信息,避免短時(hour)間内重複握手)
-
随機數 client-random
延伸閱讀:
加密套件名如:“TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA256”,這(this)麽長的(of)名字看着有點暈吧,不(No)用(use)怕,其實它的(of)命名非常規範,格式很固定。基本的(of)形式是(yes)“密鑰交換算法-服務身份驗證算法-對稱加密算法-握手校驗算法”。
握手過程中,證書簽名使用(use)的(of) RSA 算法,如果證書驗證正确,再使用(use) ECDHE 算法進行密鑰交換,握手後的(of)通信使用(use)的(of)是(yes) AES256 的(of)對稱算法分組模式是(yes) GCM。
驗證證書簽名合法性使用(use) SHA256 作(do)哈希算法檢驗。相關的(of)算法的(of)用(use)處将在(exist)後文中詳解。
②然後服務器端在(exist)收到(arrive)這(this)個(indivual) ClientHello,從中選擇服務器支持的(of)版本和(and)套件,發送 ServerHello 消息:
-
服務器所能支持的(of)最高 SSL/TLS 版本
-
服務器選擇的(of)加密套件
-
随機數 server-random
-
會話 Idsession id(用(use)于(At)下次複用(use)當前握手的(of)信息,避免短時(hour)間内重複握手。)
随後服務器發送服務器的(of)安全證書(含公鑰)。如果需要(want)客戶端也提供證書的(of)話,還會發出(out)客戶端證書請求(Client Certificate Request),隻有少數金融機構才需要(want)客戶端也提供客戶端證書。
此後客戶端發送 Server Hello Done 消息表示 Hello 階段完成。
③客戶端收到(arrive) ServerHello 後,會對收到(arrive)的(of)證書進行驗證。
我(I)們(them)來(Come)看一(one)下爲(for)什麽可以(by)通過 CA(Certificate Authority,證書頒發機構)簽發的(of)證書來(Come)确認網站的(of)身份?
當我(I)們(them)安裝操作(do)系統或者浏覽器的(of)時(hour)候,會安裝一(one)組可信任的(of) CA(根證書 CA 包括 GlobalSign、GeoTrust、Verisign 等)列表。
根 CA 如 GlobalSign 就在(exist)我(I)們(them)的(of)可信任的(of) CA 列表裏,你的(of)浏覽器或者操作(do)系統含有 GlobalSign 的(of)公鑰。
浏覽器首先用(use)哈希函數對明文信息的(of)摘要(want)做哈希得到(arrive)一(one)個(indivual)哈希值(用(use)到(arrive)的(of)就是(yes)證書中的(of)簽名哈希算法 SHA256),然後用(use)根 CA 的(of)公鑰對根證書的(of)簽名作(do)解密得到(arrive)另一(one)個(indivual)哈希值(用(use)到(arrive)的(of)算法就是(yes) RSA 非對稱算法)。
這(this)樣就免受中間人(people)攻擊了(Got it),因爲(for)假如有中間人(people)修改了(Got it)證書的(of)内容(如将證書中的(of)公鑰替換成自己的(of)公鑰),那麽将獲得不(No)同的(of)哈希值,從而兩個(indivual)哈希值不(No)匹配導緻驗證失敗。
如果要(want)繞過這(this)個(indivual)機制,中間人(people)必須要(want)也替換簽名,使簽名也相匹配。而做到(arrive)這(this)一(one)點就需要(want)破解到(arrive)了(Got it)根證書的(of)密鑰(而這(this)是(yes)不(No)可能的(of),中間人(people)必然會失敗)。
那聰明的(of)你肯定也想到(arrive)了(Got it),如果你開發了(Got it)一(one)個(indivual)系統還在(exist)測試階段,還沒有正式申請一(one)張證書,那麽你可以(by)爲(for)服務器自簽名一(one)張證書,然後将證書導入客戶端的(of) CA 信任列表中。
可以(by)看到(arrive)證書路徑是(yes):
-
GlobalSign Root CA-R2→GTS CA 1O1→*.google.com
因爲(for)我(I)們(them)的(of)浏覽器信任 GlobalSign Root CA,根據信任鏈機制,你相信了(Got it)根 CA 頒發的(of)證書,也要(want)相信它簽名的(of)子 CA 頒發的(of)證書,也要(want)相信子 CA 簽名的(of)子子 CA 的(of)證書。
而我(I)們(them)通過一(one)級級的(of)校驗,如果從根證書到(arrive)最下層的(of)證書都沒有被篡改過,我(I)們(them)就相信最下層的(of)這(this)個(indivual)服務器證書是(yes)合法的(of)。所以(by)在(exist)這(this)個(indivual)機制中,你就需要(want)無條件的(of)相信根證書的(of)頒發機構。
如果通過驗證,客戶端生(born)成一(one)個(indivual)随機數 pre-master,用(use)于(At)密鑰交換過程。
④密鑰交換過程:客戶端用(use)第三步中服務器的(of)證書中拿到(arrive)服務器的(of)公鑰,用(use)這(this)個(indivual)公鑰加密(算法是(yes)加密套件中的(of)密鑰交換算法,譬如 ECDHE 算法)生(born)成密文發送給服務器。
⑤客戶端用(use) server-random+client-random+pre-master 一(one)起計算出(out)對稱密鑰 master secret。
⑥服務器收到(arrive)第四步的(of)信息之後,用(use)服務器的(of)私鑰對密文進行解密得到(arrive)密鑰 pre-master。
因爲(for)隻有服務器有私鑰,可以(by)針對客戶端發出(out)的(of)加密過的(of)信息進行解密得到(arrive) pre-master,這(this)樣就保證了(Got it)隻有服務器和(and)客戶端知道 pre-master。
服務器端也可以(by)用(use) server-random+client-random+pre-master 一(one)起計算出(out)對稱密鑰 master secret。
現在(exist)客戶端和(and)服務器均有密鑰 master secret 了(Got it),後面就可以(by)用(use)它來(Come)進行加密和(and)解密了(Got it)。
爲(for)什麽不(No)能隻用(use)一(one)個(indivual) pre-master 作(do)爲(for)之後加密的(of)對稱密鑰?
⑦客戶端用(use) master secret 加密了(Got it)一(one)條握手完成的(of)消息發送給服務器。
⑧服務器端也回發了(Got it)一(one)條用(use) master secret 加密的(of)握手完成的(of)消息。
⑨當兩方都收到(arrive)對方發送的(of)握手消息之後,也成功解密後,就可以(by)用(use) master secret 愉快的(of)開始數據加密和(and)解密了(Got it)。
綜上(superior),整個(indivual)握手過程主要(want)是(yes)通過一(one)系列步驟通過非對稱加密的(of)算法交換得到(arrive)了(Got it) master secret,這(this)個(indivual)步驟通常需要(want)幾百毫秒,但是(yes)就是(yes)這(this)一(one)頓猛操作(do)之後使得隻有服務器和(and)客戶端知道 master secret。
之後的(of)通信又利用(use)了(Got it)高效的(of)對稱算法對所有信息進行加密和(and)解密,雖然加密和(and)解密也需要(want)耗時(hour)耗流量,不(No)過信息是(yes)完全不(No)可能被别人(people)篡改和(and)破解的(of),這(this)一(one)點損耗還是(yes)值得的(of)。