為什么HTTPS是安全的
點(diǎn)擊上方“碼農(nóng)突圍”,馬上關(guān)注
這里是碼農(nóng)充電第一站,回復(fù)“666”,獲取一份專屬大禮包
真愛,請(qǐng)?jiān)O(shè)置“星標(biāo)”或點(diǎn)個(gè)“在看”

1. HTTP 協(xié)議
1.1 HTTP 協(xié)議介紹
應(yīng)用層。
請(qǐng)求
POST?http://www.baidu.com?HTTP/1.1
Host:?www.baidu.com
Connection:?keep-alive
Content-Length:?7
User-Agent:?Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/71.0.3578.98?Safari/537.36
wd=HTTP
響應(yīng)
HTTP/1.1?200?OK
Connection:?Keep-Alive
Content-Encoding:?gzip
Content-Type:?text/html;charset=utf-8
Date:?Thu,?14?Feb?2019?07:23:49?GMT
Transfer-Encoding:?chunked
...
1.2 HTTP 中間人攻擊
不安全。小明在 JAVA 貼吧發(fā)帖,內(nèi)容為 我愛JAVA:
被中間人進(jìn)行攻擊,內(nèi)容修改為 我愛PHP
小明被群嘲(手動(dòng)狗頭)
1.3 防止中間人攻擊
對(duì)稱加密的方式將報(bào)文加密這樣中間人不就看不到明文了嗎,于是如下改造:雙方約定加密方式 
使用 AES 加密報(bào)文 

非對(duì)稱加密,我們可以通過 RSA 算法來(lái)實(shí)現(xiàn)。公私鑰,服務(wù)器將公鑰返回給客戶端,客戶端本地生成一串秘鑰(AES_KEY)用于對(duì)稱加密,并通過服務(wù)器發(fā)送的公鑰進(jìn)行加密得到(AES_KEY_SECRET),之后返回給服務(wù)端,服務(wù)端通過私鑰將客戶端發(fā)送的AES_KEY_SECRET進(jìn)行解密得到AEK_KEY,最后客戶端和服務(wù)器通過AEK_KEY進(jìn)行報(bào)文的加密通訊,改造如下:
AES加密的秘鑰,所以對(duì)于后續(xù)的通訊是肯定無(wú)法進(jìn)行解密了,那么這樣做就是絕對(duì)安全了嗎?AES_KEY,那我就把自己模擬成一個(gè)客戶端和服務(wù)器端的結(jié)合體,在用戶->中間人的過程中中間人模擬服務(wù)器的行為,這樣可以拿到用戶請(qǐng)求的明文,在中間人->服務(wù)器的過程中中間人模擬客戶端行為,這樣可以拿到服務(wù)器響應(yīng)的明文,以此來(lái)進(jìn)行中間人攻擊:
AES_KEY,在拿到AES_KEY之后就能輕松的進(jìn)行解密了。2. HTTPS 協(xié)議
2.1 HTTPS 簡(jiǎn)介
SSL+HTTP的簡(jiǎn)稱,當(dāng)然現(xiàn)在SSL基本已經(jīng)被TLS取代了,不過接下來(lái)我們還是統(tǒng)一以SSL作為簡(jiǎn)稱,SSL協(xié)議其實(shí)不止是應(yīng)用在HTTP協(xié)議上,還在應(yīng)用在各種應(yīng)用層協(xié)議上,例如:FTP、WebSocket。SSL協(xié)議大致就和上一節(jié)非對(duì)稱加密的性質(zhì)一樣,握手的過程中主要也是為了交換秘鑰,然后再通訊過程中使用對(duì)稱加密進(jìn)行通訊,大概流程如下:
公鑰,客戶端會(huì)對(duì) SSL 證書進(jìn)行驗(yàn)證,其中證書認(rèn)證體系就是確保SSL安全的關(guān)鍵,接下來(lái)我們就來(lái)講解下CA 認(rèn)證體系,看看它是如何防止中間人攻擊的。2.2 CA 認(rèn)證體系
權(quán)威認(rèn)證機(jī)構(gòu)
在 CA 認(rèn)證體系中,所有的證書都是由權(quán)威機(jī)構(gòu)來(lái)頒發(fā),而權(quán)威機(jī)構(gòu)的 CA 證書都是已經(jīng)在操作系統(tǒng)中內(nèi)置的,我們把這些證書稱之為
CA根證書:
簽發(fā)證書
我們的應(yīng)用服務(wù)器如果想要使用 SSL 的話,需要通過權(quán)威認(rèn)證機(jī)構(gòu)來(lái)簽發(fā)
CA證書,我們將服務(wù)器生成的公鑰和站點(diǎn)相關(guān)信息發(fā)送給CA簽發(fā)機(jī)構(gòu),再由CA簽發(fā)機(jī)構(gòu)通過服務(wù)器發(fā)送的相關(guān)信息用CA簽發(fā)機(jī)構(gòu)進(jìn)行加簽,由此得到我們應(yīng)用服務(wù)器的證書,證書會(huì)對(duì)應(yīng)的生成證書內(nèi)容的簽名,并將該簽名使用CA簽發(fā)機(jī)構(gòu)的私鑰進(jìn)行加密得到證書指紋,并且與上級(jí)證書生成關(guān)系鏈。這里我們把百度的證書下載下來(lái)看看:

GlobalSign G2,同樣的GlobalSign G2是受信于GlobalSign R1,當(dāng)客戶端(瀏覽器)做證書校驗(yàn)時(shí),會(huì)一級(jí)一級(jí)的向上做檢查,直到最后的根證書,如果沒有問題說(shuō)明服務(wù)器證書是可以被信任的。如何驗(yàn)證服務(wù)器證書
那么客戶端(瀏覽器)又是如何對(duì)
服務(wù)器證書做校驗(yàn)的呢,首先會(huì)通過層級(jí)關(guān)系找到上級(jí)證書,通過上級(jí)證書里的公鑰來(lái)對(duì)服務(wù)器的證書指紋進(jìn)行解密得到簽名(sign1),再通過簽名算法算出服務(wù)器證書的簽名(sign2),通過對(duì)比sign1和sign2,如果相等就說(shuō)明證書是沒有被篡改也不是偽造的。

AES_KEY從而發(fā)起攔截和修改 HTTP 通訊的報(bào)文。總結(jié)
最近熱文
? ?如果面試被問“紅黑樹”,可以這樣回答 ???她是北大“一個(gè)人的畢業(yè)照”主人公,2010級(jí)古生物專業(yè)獨(dú)苗,十年后搞起了AI ???剛剛用鴻蒙跑了個(gè)“hello world”!跑通后,我特么開始懷疑人生了.... ???今天終于搞懂了:為什么 Java 的 main 方法必須是 public static void? 最近整理了一份大廠算法刷題指南,包括一些刷題技巧,在知乎上已經(jīng)有上萬(wàn)贊。同時(shí)還整理了一份6000頁(yè)面試筆記。關(guān)注下面公眾號(hào),在公眾號(hào)內(nèi)回復(fù)「刷題」,即可免費(fèi)獲??!回復(fù)「加群」,可以邀請(qǐng)你加入讀者群!
明天見(??ω??)??
