HTTPS工作(do)原理

2022-02-16 欄目:技術知識
當我(I)們(them)沒有看到(arrive)那個(indivual)小鎖的(of)小圖标的(of)時(hour)候,需要(want)提高警惕,不(No)要(want)随意輸入個(indivual)人(people)重要(want)的(of)資料。所有的(of)銀行和(and)支付相關的(of)網站都是(yes) 100% 使用(use) HTTPS 的(of)。

爲(for)什麽需要(want) HTTPS?

 

我(I)們(them)爲(for)什麽需要(want) HTTPS?主要(want)有如下三個(indivual)原因:

 

 

①保護隐私(Privacy所有信息都是(yes)加密傳播,第三方無法竊聽數據。如果使用(use) HTTP 明文傳輸數據的(of)話,很可能被第三方劫持數據,那麽所輸入的(of)密碼或者其他(he)個(indivual)人(people)資料都被暴露在(exist)他(he)人(people)面前,後果可想而知。

 

 

 

②數據完整性(Integraty):一(one)旦第三方篡改了(Got it)數據,接收方會知道數據經過了(Got it)篡改,這(this)樣便保證了(Got it)數據在(exist)傳輸過程中不(No)被篡改——數據的(of)完整性。

 

 

 

③身份認證(Identification):第三方不(No)可能冒充身份參與通信,因爲(for)服務器配備了(Got it)由證書頒發機構(Certificate Authority,簡稱 CA)頒發的(of)安全證書,可以(by)證實服務器的(of)身份信息,防止第三方冒充身份。

 

 

 

也有少數情況下,通信需要(want)客戶端提供證書,例如銀行系統,需要(want)用(use)戶在(exist)登錄的(of)時(hour)候,插入銀行提供給用(use)戶的(of) USB,就是(yes)需要(want)客戶端提供證書,用(use)來(Come)驗證客戶的(of)身份信息。

 

 

 

HTTPS 是(yes)什麽?SSL/TLS 是(yes)什麽?

HTTP 協議(HyperText Transfer Protocol,超文本傳輸協議)是(yes)大(big)家最熟悉的(of)一(one)種協議,它是(yes)一(one)個(indivual)用(use)于(At)傳輸超媒體文檔的(of)協議,它位于(At) OSI 網絡協議模型的(of)應用(use)層。

 

 

 

但是(yes)它是(yes)明文傳輸協議,是(yes)非常不(No)安全的(of),容易被人(people)篡改和(and)竊取數據。

 

 

 

SSL(Secure Socket Layer)——網景(Netscape)公司設計的(of)主要(want)用(use)于(At) Web 的(of)安全傳輸協議。
它位于(At) TCP 傳輸層協議和(and)應用(use)層協議之間。(它沒有被劃分在(exist) OSI 網絡協議模型中,且認爲(for)它是(yes)應用(use)層的(of)子層。)
衆所周知,網景公司 20 世紀 90 年代在(exist)和(and)微軟的(of)競争中最終敗下陣來(Come),之後網景公司将 SSL 協議的(of)管理權轉交給 IETF(Internet Engineering Task Force, www.ietf.org)。

 

 

于(At)是(yes) IETF 将 SSL 作(do)了(Got it)标準化,重新命名爲(for) TLS(Transport Layer Security)。在(exist) 1999 年,TLS 1.0 誕生(born)了(Got it)(其實也就是(yes) SSL 3.1)。

 

HTTPS(HyperText Transfer Protocol Secure)是(yes)建立在(exist) SSL/TLS 協議之上(superior),信息通信通過 SSL/TLS 進行加密,最後一(one)個(indivual) S 就是(yes) Secure 的(of)縮寫,代表安全的(of)意思,HTTPS = HTTP+SSL/TLS。
 

SSL/TLS 發展史

 

 

 

 

SSL/TLS 發展史如上(superior)圖:

 

實際上(superior)現代的(of)浏覽器已經基本不(No)使用(use) SSL,使用(use)的(of)都是(yes) TLS,SSL 3.0 于(At) 2015 年已經壽終正寝,各大(big)浏覽器也不(No)支持了(Got it)。

 

 

 

但是(yes)由于(At) SSL 這(this)個(indivual)術語存在(exist)的(of)時(hour)間太長,很多地(land)方還是(yes)廣泛的(of)使用(use)它,但是(yes)要(want)清楚其實它說的(of)是(yes) TLS。

 

 

 

有調查顯示現在(exist)絕大(big)部分浏覽器(>99.5%)都使用(use) TLS 1.2 或者 TLS 1.3。隻有不(No)足 1% 的(of)浏覽器仍然使用(use) TLS 1.0 或者 TLS 1.1。

 

 

 

TLS 1.2 仍然是(yes)主流協議(本文寫于(At) 2020 年初),相信将來(Come)逐漸 TLS 1.3 将會作(do)爲(for)主流協議。

 

 

 

很多浏覽器将會開始不(No)支持 TLS 1.0 和(and) 1.1:

 

  • 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)支持。

 

 

那麽一(one)些還在(exist)使用(use) TLS 1.0 和(and) 1.1 的(of)網站就得被迫升級到(arrive) TLS 1.2 或者 TLS 1.3。

 

 

要(want)關閉浏覽器對 TLS 1.0 和(and) 1.1 的(of)支持,可以(by)在(exist) Internet 選項中修改:

 

 

SSL/TLS 的(of)工作(do)原理

 

需要(want)理解 SSL/TLS 的(of)工作(do)原理,我(I)們(them)需要(want)掌握加密算法。

 

加密算法有兩種:

  • 對稱加密

  • 非對稱加密

 

對稱加密:通信雙方使用(use)相同的(of)密鑰進行加密。特點是(yes)加密速度快,但是(yes)缺點是(yes)需要(want)保護好密鑰,如果密鑰洩露的(of)話,那麽加密就會被别人(people)破解。常見的(of)對稱加密有 AES,DES 算法。

 

 

 

非對稱加密:它需要(want)生(born)成兩個(indivual)密鑰:公鑰(Public Key)和(and)私鑰(Private Key)。

 

 

 

公鑰顧名思義是(yes)公開的(of),任何人(people)都可以(by)獲得,而私鑰是(yes)私人(people)保管的(of),相信大(big)多程序員已經對這(this)種算法很熟悉了(Got it)。

 

 

 

我(I)們(them)提交代碼到(arrive) Github 的(of)時(hour)候,就可以(by)使用(use) SSH key:在(exist)本地(land)生(born)成私鑰和(and)公鑰,私鑰放在(exist)本地(land) .ssh 目錄中,公鑰放在(exist) Github 網站上(superior)。

 

 

 

這(this)樣每次提交代碼,不(No)用(use)麻煩的(of)輸入用(use)戶名和(and)密碼了(Got it),Github 會根據網站上(superior)存儲的(of)公鑰來(Come)識别我(I)們(them)的(of)身份。公鑰負責加密,私鑰負責解密;或者,私鑰負責加密,公鑰負責解密。
這(this)種加密算法安全性更高,但是(yes)計算量相比對稱加密大(big)很多,加密和(and)解密都很慢。

 

 

 

常見的(of)非對稱算法有 RSA。SSL/TLS 是(yes)利用(use)了(Got it)對稱加密和(and)非對稱加密的(of)特點。

 

先來(Come)看下整個(indivual) SSL/TLS 的(of)握手過程,之後我(I)們(them)再分步驟詳細解讀,每一(one)步都幹了(Got it)些什麽。

當 TCP 建立連接之後,TLS 握手的(of)第一(one)步由客戶端發起,發送 ClientHello 的(of)消息到(arrive)服務器。

 

ClientHello 消息包含:

 

  • 客戶端支持的(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)公鑰。

 

先來(Come)看一(one)下 Google 的(of)證書,當你訪問 Google 的(of)時(hour)候,Google 會發給你它的(of)證書。證書中包含頒發機構的(of)簽名以(by)及服務器的(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 非對稱算法)。

 

如果兩個(indivual)哈希值相等則說明證書沒有被篡改過。當然還需校驗證書中服務器名稱是(yes)否合法以(by)及驗證證書是(yes)否過期。

 

這(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)必然會失敗)。

 

浏覽器會出(out)現以(by)下畫面,告訴你正在(exist)遭受中間人(people)攻擊,因爲(for)證書被篡改了(Got it):

 

那聰明的(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)對稱密鑰?

 

雖然隻有服務器有私鑰,能夠解密 pre-master 呀,但僅用(use)它作(do)爲(for) master secret 是(yes)不(No)夠安全的(of),這(this)是(yes)因爲(for)要(want)以(by)防客戶端的(of) pre-master 并不(No)是(yes)随機數的(of)情況。

 

 

 

加上(superior)另外兩個(indivual)随機數 client-random 以(by)及 server-random(而這(this)兩個(indivual)随機數和(and)時(hour)間有相關性),這(this)樣就能保證最後生(born)成的(of) master secret 一(one)定是(yes)随機數。

 

客戶端用(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)。