引言
最近上海連續(xù)下了一周雨,溫度一夜之間回到解放前,穿夏裝的我被凍得瑟瑟發(fā)抖,躲在家里哪也不想去。

在家百無(wú)聊賴的刷著網(wǎng)頁(yè),看到公眾號(hào)后臺(tái)的留言,有同學(xué)問(wèn)我 HTTP 和 HTTPS 有啥區(qū)別?
這還用問(wèn),當(dāng)然是 HTTPS 要比 HTTP 更加的安全啊,沒(méi)看到后面帶著個(gè) S 呢么,帶著 S 就這么 NB 。
然后同學(xué)的下一個(gè)問(wèn)題把我問(wèn)懵逼了,為啥帶 S 的更安全呢?能詳細(xì)的講講么。
我跟你講嗷,不是我吹,我這么多年。。。。。。
就沒(méi)見(jiàn)過(guò)你這么刨根究底的同學(xué),老問(wèn)這種我也不是很清楚的問(wèn)題。
雖然這個(gè)問(wèn)題問(wèn)的我老臉一紅,但是我有一種不要臉的精神 「我不會(huì),但是我可以學(xué)」 。

HTTP
首先先來(lái)了解下 HTTP :
HTTP 協(xié)議全稱為:Hyper Text Transfer Protocol ,翻譯過(guò)來(lái)就是超文本傳輸協(xié)議,請(qǐng)不要質(zhì)疑這個(gè)翻譯,我專門(mén)用百度翻譯翻了一下。
TCP/IP 四層模型應(yīng)該都知道的,有數(shù)據(jù)鏈路層,網(wǎng)絡(luò)層,傳輸層和應(yīng)用層:

而 HTTP 協(xié)議就是位于 TCP/IP 四層模型的應(yīng)用層上。

這里很多人都會(huì)混淆 TCP 和 HTTP ,實(shí)際上 HTTP 是基于 TCP 連接基礎(chǔ)上的。
簡(jiǎn)單的說(shuō), TCP 就是單純建立連接,不涉及任何我們需要請(qǐng)求的實(shí)際數(shù)據(jù),簡(jiǎn)單的傳輸。而 HTTP 是用來(lái)收發(fā)數(shù)據(jù),即實(shí)際應(yīng)用上來(lái)的。
HTTP 協(xié)議通過(guò)請(qǐng)求和響應(yīng)在客戶端和服務(wù)端之間收發(fā)數(shù)據(jù),進(jìn)行通信:

HTTPS
HTTP 協(xié)議看起來(lái)好像沒(méi)啥問(wèn)題,唯一的問(wèn)題就是不夠安全,因?yàn)?HTTP 協(xié)議的傳輸方式完全是由明文傳輸?shù)模蛔鋈魏渭用埽@就讓一些不懷好意的人有了可乘之機(jī)。
這種傳輸方式誘發(fā)了一種經(jīng)典的攻擊方式:中間人攻擊。

對(duì)于這種情況,最簡(jiǎn)單的我們可以使用加密方案,比如使用 AES 加密,服務(wù)端和客戶端先約定一個(gè)隨機(jī)生成的密鑰 key ,后續(xù)的通信中,所有的信息都使用這個(gè)密鑰進(jìn)行 AES 加密:

這樣雖然后面的通信過(guò)程安全了,但是我們?cè)诘谝话l(fā)送 AES 密鑰的時(shí)候還是存在被中間人攔截的風(fēng)險(xiǎn),一旦中間人攔截到我們的密鑰,可用對(duì)密鑰進(jìn)行更換或者直接解密請(qǐng)求內(nèi)容:

這時(shí)我們可以使用不對(duì)稱加密,來(lái)專門(mén)對(duì)密鑰的傳輸做一次額外的保護(hù)。
不對(duì)稱加密會(huì)有兩個(gè)密鑰,一個(gè)是公鑰,一個(gè)是私鑰。明文可以使用公鑰加密私鑰解密,也可以使用私鑰加密公鑰解密。
現(xiàn)在比較通用的非對(duì)稱加密算法有 RSA 。

看到這里的同學(xué)一定在奇怪,既然都使用了不對(duì)稱加密,為啥只對(duì) AES 的密鑰做不對(duì)稱加密,好像有多此一舉,完全可以對(duì)后續(xù)所有的通信信息全都使用不對(duì)稱加密。
因?yàn)椴粚?duì)稱加密相比較對(duì)稱加密性能上存在明顯的劣勢(shì),可能你覺(jué)得在一個(gè)請(qǐng)求中多消耗幾 ms 或者幾 ns 無(wú)所謂,但是請(qǐng)求到達(dá)服務(wù)端是要進(jìn)行解密,每個(gè)請(qǐng)求都多消耗幾 ms 累計(jì)起來(lái)還是非常可觀的。
上面這個(gè)方案看起來(lái)已經(jīng)很安全了,中間人即使攔截到我們的公鑰,由于不知道我們的私鑰貌似也沒(méi)辦法解密。
實(shí)際上中間人完全不需要解密我們的信息,他可以生成一對(duì)新的公私鑰發(fā)送給客戶端進(jìn)行攻擊,后續(xù)客戶端的通信中間人使用自己創(chuàng)造的私鑰進(jìn)行解密,然后通過(guò)服務(wù)端生成的公鑰進(jìn)行加密返回給服務(wù)端:

CA 證書(shū)
上面的問(wèn)題我們僅通過(guò)客戶端和服務(wù)端已經(jīng)沒(méi)辦法了,這時(shí)候需要引入新的第三方機(jī)構(gòu),一個(gè)頒發(fā) CA 證書(shū)的機(jī)構(gòu)。
常見(jiàn)的第三方 CA 機(jī)構(gòu)有:Symantec(賽門(mén)鐵克),Comodo(科莫多),GeoTrust(環(huán)度網(wǎng)信),GoDaddy,Thawte,daoRapidSSL 等等。
在中間人攻擊中,我們遇到的問(wèn)題不是加密算法不夠神奇,不是密鑰方式不夠嚴(yán)謹(jǐn),而是我們沒(méi)有辦法向我們的客戶端表明我們給他的公鑰是我們的,是不是很像我沒(méi)辦法證明我是我的問(wèn)題。

所以第三方機(jī)構(gòu)應(yīng)運(yùn)而生,第三方機(jī)構(gòu)只做一件事情,將服務(wù)端的公鑰刻上了我們的名字(CA 證書(shū)),客戶端接收到公鑰之后,只需要來(lái)第三方機(jī)構(gòu)這里查詢,就能知道這個(gè)公鑰是不是真的服務(wù)器,然后再將自己生成的 AES 密鑰使用 CA 證書(shū)中解密得到的公鑰進(jìn)行加密后發(fā)送給服務(wù)端。

最后服務(wù)端使用私鑰解密得到 AES 密鑰,就可以愉快的和客戶端進(jìn)行通信了。
最后的最后,CA 機(jī)構(gòu)驗(yàn)證不是每次都要去 CA 機(jī)構(gòu)查詢。這樣做太傻了而且太耗時(shí),尤其是很多 CA 機(jī)構(gòu)的服務(wù)都在海外,這樣一來(lái)一去消耗的時(shí)間太多了。
CA 機(jī)構(gòu)高明的地方就在于,我們?nèi)フ宜?cè)公鑰,它會(huì)使用另一個(gè)來(lái)注冊(cè)的公司的私鑰對(duì)我們的公鑰加密,得到一個(gè)我們的公鑰的指紋(全球唯一),然后將這家公司的公鑰信息(其實(shí)也是證書(shū))和我們的公鑰以及我們公鑰的指紋打包成一個(gè)證書(shū)。
當(dāng)我們使用 HTTPS 將證書(shū)下發(fā)給客戶端校驗(yàn)時(shí),客戶端(比如瀏覽器)從證書(shū)中看到了上級(jí)證書(shū)的信息,恰巧這個(gè)證書(shū)就在瀏覽器(或者本機(jī))中,已經(jīng)被驗(yàn)證過(guò)是合法的,瀏覽器只要使用這個(gè)證書(shū)中的公鑰將我們的公鑰指紋進(jìn)行解密,然后比對(duì)我們的公鑰信息就知道我們也是的合法的。因?yàn)榧僮C書(shū)中的公鑰簽名不可能被合法的上級(jí)證書(shū)中公鑰解密 。
這段稍微有點(diǎn)繞,慢慢看多看幾次就理解了。
參考
https://www.jianshu.com/p/691b8ba3a70f
https://blog.csdn.net/u010144805/article/details/80803059
https://blog.csdn.net/caofengtao1314/article/details/87912078
作者:極客挖掘機(jī)
來(lái)源:
https://www.cnblogs.com/babycomeon/p/13041439.html