HTTPS工作原理

為什么需要 HTTPS?
我們?yōu)槭裁葱枰?HTTPS?主要有如下三個(gè)原因:
HTTPS 是什么?SSL/TLS 是什么?
于是 IETF 將 SSL 作了標(biāo)準(zhǔn)化,重新命名為 TLS(Transport Layer Security)。在 1999 年,TLS 1.0 誕生了(其實(shí)也就是 SSL 3.1)。

SSL/TLS 發(fā)展史




SSL/TLS 發(fā)展史如上圖:
-
Google 將在 Chrome 72 中不推薦使用 TLS 1.0 和 1.1,而 Chrome 81 之后將會(huì)完全不支持。
-
Mozilla 的 Firefox,微軟的 Edge 和 IE 以及蘋(píng)果的 Safari 都會(huì)分別于 2020 年逐漸移除對(duì) TLS 1.0 和 1.1 的支持。
要關(guān)閉瀏覽器對(duì) TLS 1.0 和 1.1 的支持,可以在 Internet 選項(xiàng)中修改:

SSL/TLS 的工作原理
需要理解 SSL/TLS 的工作原理,我們需要掌握加密算法。
加密算法有兩種:
-
對(duì)稱加密
-
非對(duì)稱加密
先來(lái)看下整個(gè) SSL/TLS 的握手過(guò)程,之后我們?cè)俜植襟E詳細(xì)解讀,每一步都干了些什么。

①當(dāng) TCP 建立連接之后,TLS 握手的第一步由客戶端發(fā)起,發(fā)送 ClientHello 的消息到服務(wù)器。
-
客戶端支持的 SSL/TLS 版本
-
客戶端支持的加密套件(Cipher Suites)
-
會(huì)話 Idsession id(如果有的值的話,服務(wù)器端會(huì)復(fù)用對(duì)應(yīng)的握手信息,避免短時(shí)間內(nèi)重復(fù)握手)
-
隨機(jī)數(shù) client-random
延伸閱讀:
加密套件名如:“TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA256”,這么長(zhǎng)的名字看著有點(diǎn)暈吧,不用怕,其實(shí)它的命名非常規(guī)范,格式很固定。基本的形式是“密鑰交換算法-服務(wù)身份驗(yàn)證算法-對(duì)稱加密算法-握手校驗(yàn)算法”。
握手過(guò)程中,證書(shū)簽名使用的 RSA 算法,如果證書(shū)驗(yàn)證正確,再使用 ECDHE 算法進(jìn)行密鑰交換,握手后的通信使用的是 AES256 的對(duì)稱算法分組模式是 GCM。
驗(yàn)證證書(shū)簽名合法性使用 SHA256 作哈希算法檢驗(yàn)。相關(guān)的算法的用處將在后文中詳解。
②然后服務(wù)器端在收到這個(gè) ClientHello,從中選擇服務(wù)器支持的版本和套件,發(fā)送 ServerHello 消息:
-
服務(wù)器所能支持的最高 SSL/TLS 版本
-
服務(wù)器選擇的加密套件
-
隨機(jī)數(shù) server-random
-
會(huì)話 Idsession id(用于下次復(fù)用當(dāng)前握手的信息,避免短時(shí)間內(nèi)重復(fù)握手。)
隨后服務(wù)器發(fā)送服務(wù)器的安全證書(shū)(含公鑰)。如果需要客戶端也提供證書(shū)的話,還會(huì)發(fā)出客戶端證書(shū)請(qǐng)求(Client Certificate Request),只有少數(shù)金融機(jī)構(gòu)才需要客戶端也提供客戶端證書(shū)。
此后客戶端發(fā)送 Server Hello Done 消息表示 Hello 階段完成。
③客戶端收到 ServerHello 后,會(huì)對(duì)收到的證書(shū)進(jìn)行驗(yàn)證。
我們來(lái)看一下為什么可以通過(guò) CA(Certificate Authority,證書(shū)頒發(fā)機(jī)構(gòu))簽發(fā)的證書(shū)來(lái)確認(rèn)網(wǎng)站的身份?
當(dāng)我們安裝操作系統(tǒng)或者瀏覽器的時(shí)候,會(huì)安裝一組可信任的 CA(根證書(shū) CA 包括 GlobalSign、GeoTrust、Verisign 等)列表。
根 CA 如 GlobalSign 就在我們的可信任的 CA 列表里,你的瀏覽器或者操作系統(tǒng)含有 GlobalSign 的公鑰。

瀏覽器首先用哈希函數(shù)對(duì)明文信息的摘要做哈希得到一個(gè)哈希值(用到的就是證書(shū)中的簽名哈希算法 SHA256),然后用根 CA 的公鑰對(duì)根證書(shū)的簽名作解密得到另一個(gè)哈希值(用到的算法就是 RSA 非對(duì)稱算法)。

這樣就免受中間人攻擊了,因?yàn)榧偃缬兄虚g人修改了證書(shū)的內(nèi)容(如將證書(shū)中的公鑰替換成自己的公鑰),那么將獲得不同的哈希值,從而兩個(gè)哈希值不匹配導(dǎo)致驗(yàn)證失敗。
如果要繞過(guò)這個(gè)機(jī)制,中間人必須要也替換簽名,使簽名也相匹配。而做到這一點(diǎn)就需要破解到了根證書(shū)的密鑰(而這是不可能的,中間人必然會(huì)失敗)。

那聰明的你肯定也想到了,如果你開(kāi)發(fā)了一個(gè)系統(tǒng)還在測(cè)試階段,還沒(méi)有正式申請(qǐng)一張證書(shū),那么你可以為服務(wù)器自簽名一張證書(shū),然后將證書(shū)導(dǎo)入客戶端的 CA 信任列表中。

可以看到證書(shū)路徑是:
-
GlobalSign Root CA-R2→GTS CA 1O1→*.google.com
因?yàn)槲覀兊臑g覽器信任 GlobalSign Root CA,根據(jù)信任鏈機(jī)制,你相信了根 CA 頒發(fā)的證書(shū),也要相信它簽名的子 CA 頒發(fā)的證書(shū),也要相信子 CA 簽名的子子 CA 的證書(shū)。
而我們通過(guò)一級(jí)級(jí)的校驗(yàn),如果從根證書(shū)到最下層的證書(shū)都沒(méi)有被篡改過(guò),我們就相信最下層的這個(gè)服務(wù)器證書(shū)是合法的。所以在這個(gè)機(jī)制中,你就需要無(wú)條件的相信根證書(shū)的頒發(fā)機(jī)構(gòu)。
如果通過(guò)驗(yàn)證,客戶端生成一個(gè)隨機(jī)數(shù) pre-master,用于密鑰交換過(guò)程。
④密鑰交換過(guò)程:客戶端用第三步中服務(wù)器的證書(shū)中拿到服務(wù)器的公鑰,用這個(gè)公鑰加密(算法是加密套件中的密鑰交換算法,譬如 ECDHE 算法)生成密文發(fā)送給服務(wù)器。
⑤客戶端用 server-random+client-random+pre-master 一起計(jì)算出對(duì)稱密鑰 master secret。
⑥服務(wù)器收到第四步的信息之后,用服務(wù)器的私鑰對(duì)密文進(jìn)行解密得到密鑰 pre-master。
因?yàn)橹挥蟹?wù)器有私鑰,可以針對(duì)客戶端發(fā)出的加密過(guò)的信息進(jìn)行解密得到 pre-master,這樣就保證了只有服務(wù)器和客戶端知道 pre-master。
服務(wù)器端也可以用 server-random+client-random+pre-master 一起計(jì)算出對(duì)稱密鑰 master secret。
現(xiàn)在客戶端和服務(wù)器均有密鑰 master secret 了,后面就可以用它來(lái)進(jìn)行加密和解密了。
為什么不能只用一個(gè) pre-master 作為之后加密的對(duì)稱密鑰?
⑦客戶端用 master secret 加密了一條握手完成的消息發(fā)送給服務(wù)器。
⑧服務(wù)器端也回發(fā)了一條用 master secret 加密的握手完成的消息。
⑨當(dāng)兩方都收到對(duì)方發(fā)送的握手消息之后,也成功解密后,就可以用 master secret 愉快的開(kāi)始數(shù)據(jù)加密和解密了。
綜上,整個(gè)握手過(guò)程主要是通過(guò)一系列步驟通過(guò)非對(duì)稱加密的算法交換得到了 master secret,這個(gè)步驟通常需要幾百毫秒,但是就是這一頓猛操作之后使得只有服務(wù)器和客戶端知道 master secret。
之后的通信又利用了高效的對(duì)稱算法對(duì)所有信息進(jìn)行加密和解密,雖然加密和解密也需要耗時(shí)耗流量,不過(guò)信息是完全不可能被別人篡改和破解的,這一點(diǎn)損耗還是值得的。