網(wǎng)站群 seosemaphore
前一篇文章:計(jì)算機(jī)網(wǎng)絡(luò) —— HTTP 協(xié)議(詳解)-CSDN博客
目錄
·前言
一、HTTPS 協(xié)議簡(jiǎn)介
二、HTTPS 工作過程
1.對(duì)稱加密
2.非對(duì)稱加密
3.中間人攻擊
4.引入證書
三、HTTPS 常見問題
1.中間人能否篡改證書?
2.中間人能否調(diào)包證書?
3.HTTPS 工作完整流程
·總結(jié)
·前言
? ? ? ? 前一篇文章中對(duì)?HTTP 協(xié)議整體做了一個(gè)基本介紹,在本篇文章里將介紹一下基于 HTTP 協(xié)議創(chuàng)造出來的 HTTPS 協(xié)議,關(guān)于 HTTPS 協(xié)議的重點(diǎn)內(nèi)容就是它的一個(gè)工作過程,它是如何保證我們網(wǎng)絡(luò)中傳輸數(shù)據(jù)的安全性呢?這將是本篇文章的要重點(diǎn)介紹的內(nèi)容,下面就開始本篇文章的內(nèi)容介紹。
一、HTTPS 協(xié)議簡(jiǎn)介
? ? ? ? HTTPS 協(xié)議與 HTTP 協(xié)議一樣都是應(yīng)用層協(xié)議,HTTPS 協(xié)議是在 HTTP 協(xié)議的基礎(chǔ)上引入了一個(gè)加密層,由于 HTTP 協(xié)議的內(nèi)容都是按照文本的方式明文傳輸,這就導(dǎo)致在使用 HTTP 協(xié)議傳輸數(shù)據(jù)的過程中會(huì)出現(xiàn)一些數(shù)據(jù)被篡改的情況,比如:“運(yùn)營(yíng)商劫持”。
? ? ? ? 什么是 “運(yùn)營(yíng)商劫持” 呢?不知道有沒有小伙伴在網(wǎng)上搜索某個(gè)軟件點(diǎn)擊下載后發(fā)現(xiàn)下的不是要下載的軟件而是其他軟件,這就是 “運(yùn)營(yíng)商劫持”,如下圖所示:


? ? ? ? 如上圖所示,當(dāng)我們下載一個(gè) “天天動(dòng)聽” 時(shí),圖1 未被劫持點(diǎn)擊下載按鈕是可以彈出正確的天天動(dòng)聽的鏈接,圖2 已被劫持時(shí),點(diǎn)擊下載按鈕,彈窗的是 QQ瀏覽器的下載鏈接,這就是 “運(yùn)營(yíng)商劫持”,那么它是如何做到的呢?流程如下圖所示:
?????????當(dāng)然,不止運(yùn)營(yíng)商可以劫持,其他的 “黑客” 也可以用類似的手段來進(jìn)行劫持,竊取用戶的隱私信息,或者篡改內(nèi)容,所以在互聯(lián)網(wǎng)上,明文傳輸是比較危險(xiǎn)的事情,HTTPS 就是在 HTTP 的基礎(chǔ)上進(jìn)行了加密,進(jìn)一步來保證用戶的信息安全。
? ? ? ? 解決安全問題最核心的要點(diǎn)就是 “加密”,什么是加密呢?加密就是把明文(要傳輸?shù)恼鎸?shí)數(shù)據(jù))進(jìn)行一系列變換,生成密文(針對(duì)明文加密之后得到的結(jié)果,往往不直觀,不易理解),解密就是把密文通過一系列變換,還原成明文,在這個(gè)加密與解密的過程中,往往需要一個(gè)或者多個(gè)中間的數(shù)據(jù)來輔助完成這個(gè)過程,這樣的數(shù)據(jù)就被稱為 “密鑰”。
二、HTTPS 工作過程
? ? ? ? 為了保證數(shù)據(jù)的安全,HTTPS 就在 HTTP 基礎(chǔ)上進(jìn)行 “加密” 操作,這樣網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)就不再是直接傳輸明文了,而是加密之后的 “密文”,加密的方式有很多,但是整體可以分為兩大類:“對(duì)稱加密” 和 “非對(duì)稱加密”,下面我就來介紹一下 HTTPS 的工作過程,及遇到問題的對(duì)應(yīng)解決方法。
1.對(duì)稱加密
? ? ? ? 對(duì)稱加密其實(shí)就是通過同一個(gè) “密鑰”,來把明文加密成密文,并且還可以把密文加密成明文,引入對(duì)稱加密之后,即使數(shù)據(jù)被截獲,由于黑客不知道密鑰是什么,也就無法進(jìn)行解密進(jìn)一步去獲取我們請(qǐng)求的真實(shí)內(nèi)容了,引入對(duì)稱加密后,此時(shí)數(shù)據(jù)傳輸過程如下圖所示:
? ? ? ? 根據(jù)上述介紹可以發(fā)現(xiàn)對(duì)稱加密具有以下特點(diǎn):
- 使用對(duì)稱加密,客戶端與服務(wù)器需要使用同一個(gè)密鑰;
- 不同的客戶端需要使用不同的密鑰(如果密鑰都相同,那么黑客就可以獲取密鑰)。?
? ? ? ? 此時(shí),由于不同客戶端使用的密鑰都不相同,這就意味著服務(wù)器需要維護(hù)每個(gè)客戶端和密鑰的關(guān)聯(lián)關(guān)系會(huì)引入很大的額外開銷。
? ? ? ? 對(duì)稱加密除了會(huì)引入額外的開銷還有一個(gè)致命的問題,那就是這種加密并不安全,由于對(duì)稱密鑰是要傳輸給對(duì)方的,就意味著傳輸密鑰的過程是明文傳輸?shù)?#xff0c;那么此時(shí)黑客只要獲取到傳輸?shù)拿荑€,對(duì)稱加密的操作就毫無意義了,如下圖所示:
? ? ? ? ?造成上圖結(jié)果就是因?yàn)槭褂妹魑膫鬏斆荑€,黑客就會(huì)獲取到密鑰,后續(xù)的加密操作就形同虛設(shè)了,所以我們需要對(duì)傳輸?shù)拿荑€進(jìn)行加密傳輸,如果我們對(duì)密鑰仍進(jìn)行對(duì)稱加密的方式進(jìn)行傳輸就需要確定一個(gè) “密鑰的密鑰”,此時(shí)面臨的問題還是 “密鑰的密鑰” 是明文,黑客仍然可以拿到密鑰,所以對(duì)密鑰進(jìn)行加密傳輸使用對(duì)稱加密的方式就行不通了,這就需要引入非對(duì)稱加密。
2.非對(duì)稱加密
? ? ? ? 使用非對(duì)稱加密主要目的就是為了對(duì) “對(duì)稱加密” 的密鑰進(jìn)行加密,來確保對(duì)稱密鑰的安全性,在非對(duì)稱加密中要用到兩個(gè)密鑰:“公鑰” 與 “私鑰”,公鑰和私鑰是配對(duì)的(公鑰對(duì)明文加密變成密文,密文只能使用配對(duì)的私鑰來進(jìn)行解密),它們最大的缺點(diǎn)就是加密與解密的運(yùn)算速度非常慢(消耗 CPU 資源),所以不能完全使用非對(duì)稱加密來對(duì)傳輸?shù)臄?shù)據(jù)進(jìn)行加密,而只是對(duì)“對(duì)稱加密”的密鑰進(jìn)行加密。
? ? ? ? 引入非對(duì)稱加密之后,就可以由服務(wù)器生成公鑰和私鑰,公鑰可以公開給每個(gè)客服端,私鑰只有自己知道,這樣客戶端就可以使用公鑰對(duì)對(duì)稱密鑰進(jìn)行加密然后傳輸給服務(wù)器,服務(wù)器獲取到密文使用私鑰解密獲取到對(duì)稱密鑰,后面就可以繼續(xù)使用對(duì)稱加密來進(jìn)行數(shù)據(jù)傳輸了,具體過程如下圖所示:
? ? ? ? 下面我來對(duì)上述過程做一個(gè)梳理:
- ?客戶端在本地生成對(duì)稱密鑰,通過公鑰加密,發(fā)送給服務(wù)器;
- 由于黑客沒有私鑰所以無法對(duì)截取的數(shù)據(jù)進(jìn)行解密進(jìn)而無法獲取對(duì)稱密鑰;
- 服務(wù)器使用私鑰解密,獲取對(duì)稱密鑰,使用對(duì)稱密鑰加密給客戶端返回的響應(yīng);
- 后續(xù)客戶端與服務(wù)器的通信使用對(duì)稱加密即可,由于該密鑰只有客戶端與服務(wù)器兩個(gè)主機(jī)知道,所以黑客截獲數(shù)據(jù)也無法進(jìn)行解密。
? ? ? ? 上述過程雖然看起來安全,但是還有漏洞,由于公鑰是需要客戶端從服務(wù)器這邊獲取,那么就存在一個(gè)問題:獲取的公鑰是不是黑客偽造的?這就涉及到中間人攻擊了。?
3.中間人攻擊
? ? ? ? 黑客通過中間人攻擊就可以獲取到對(duì)稱密鑰,由于非對(duì)稱加密算法是公開的,所以黑客也可以使用非對(duì)稱加密算法來得到自己的公鑰私鑰,此時(shí)就可以在客戶端向服務(wù)器發(fā)送獲取公鑰的請(qǐng)求時(shí)進(jìn)行中間人攻擊,具體過程如下圖所示:
?????????下面我來對(duì)上述過程做一個(gè)梳理:
- 服務(wù)器使用非對(duì)稱加密算法生成公鑰:pub1,私鑰:pri1;
- 黑客使用非對(duì)稱加密算法生成公鑰:pub2,私鑰:pri2;
- 客戶端生成對(duì)稱密鑰:key;
- 客戶端向服務(wù)器發(fā)送請(qǐng)求詢問公鑰是什么?
- 服務(wù)器明文傳輸公鑰 pub1 給客戶端;
- 黑客截取數(shù)據(jù),提取公鑰 pub1 并保存,然后將數(shù)據(jù)中的公鑰 pub1 替換成自己的公鑰 pub2,并將偽造的數(shù)據(jù)發(fā)給客戶端;
- 客戶端收到數(shù)據(jù),提取公鑰 pub2(并不清楚公鑰已經(jīng)被換),用公鑰 pub2 加密對(duì)稱密鑰 key,形成報(bào)文發(fā)送給服務(wù)器;
- 黑客截取數(shù)據(jù),直接使用自己的私鑰 pri2 進(jìn)行解密,獲取到對(duì)稱密鑰 key,再使用保存的服務(wù)端公鑰 pub1 加密后,將報(bào)文發(fā)送給服務(wù)器;
- 服務(wù)器拿到報(bào)文后,使用私鑰 pri1 進(jìn)行解密,獲取對(duì)稱密鑰 key;
- 后續(xù)服務(wù)器與客戶端都使用 key 進(jìn)行對(duì)稱加密,進(jìn)行通信,此時(shí)黑客就可以使用對(duì)稱密鑰 key 劫持?jǐn)?shù)據(jù)對(duì)數(shù)據(jù)進(jìn)行竊聽或者修改。
????????那么如何解決中間人攻擊這樣的問題呢?最關(guān)鍵的一點(diǎn)就在于客戶端拿到公鑰的時(shí)候要有辦法驗(yàn)證這個(gè)公鑰是真的而不是黑客偽造的,這就需要服務(wù)器提供一個(gè) “證書”。?
4.引入證書
? ? ? ?證書是一個(gè)結(jié)構(gòu)化的數(shù)據(jù),其中包含很多的信息,如:證書發(fā)布機(jī)構(gòu)、證書有效期、公鑰、證書所有者、簽名……,服務(wù)器在使用 HTTPS 之前需要向第三方公正機(jī)構(gòu)申請(qǐng)一份數(shù)字證書,然后服務(wù)器把證書傳給瀏覽器,瀏覽器從證書中獲取公鑰就可以了,證書就相當(dāng)于身份證,證明當(dāng)前公鑰的正確性。
? ? ? ? 在證書中,用來驗(yàn)證證書真?zhèn)蔚男畔⒕褪?“簽名”,對(duì)于簽名要詳細(xì)介紹一下,這是通過證書解決中間人攻擊問題的關(guān)鍵,簽名的形成也是基于非對(duì)稱加密算法的,當(dāng)服務(wù)端申請(qǐng)證書的時(shí)候,公正機(jī)構(gòu)就會(huì)對(duì)服務(wù)端進(jìn)行審核,并專門為該網(wǎng)站形成數(shù)字簽名,過程如下:
- 公正機(jī)構(gòu)擁有非對(duì)稱加密的公鑰:A 和私鑰:A*;
- 公正機(jī)構(gòu)對(duì)服務(wù)端申請(qǐng)的證書明文數(shù)據(jù)進(jìn)行 hash,形成數(shù)據(jù)摘要;
- 公正機(jī)構(gòu)再對(duì)數(shù)據(jù)摘要用私鑰 A* 加密,得到簽名 S。
? ? ? ? 此時(shí),服務(wù)端申請(qǐng)的證書明文與簽名 S 就共同形成了證書,這樣的證書就頒布給了服務(wù)端。這樣就可以解決中間人攻擊問題,此時(shí)數(shù)據(jù)傳輸?shù)倪^程如下圖所示:
? ? ? ? 圖中客戶端獲取到證書對(duì)證書進(jìn)行校驗(yàn)的過程如下:
- 判定證書有效期是否過期;
- 判定證書的發(fā)布機(jī)構(gòu)是否受信任(操作系統(tǒng)中已經(jīng)內(nèi)置了受信任的證書發(fā)布機(jī)構(gòu));
- 驗(yàn)證證書是否被篡改:從操作系統(tǒng)中獲取證書發(fā)布機(jī)構(gòu)的公鑰,對(duì)簽名進(jìn)行解密,得到 hash 值(數(shù)據(jù)摘要)設(shè)為 hash1,然后計(jì)算整個(gè)證書的 hash 值設(shè)為 hash2,對(duì)比 hash1 和 hash2 是否相等,如果相等就說明證書沒有被篡改過。?
三、HTTPS 常見問題
1.中間人能否篡改證書?
? ? ? ? 中間人無法篡改證書,理由如下:
- 中間人篡改了證書的明文,由于他沒有公正機(jī)構(gòu)的私鑰,所以無法在?hash 之后使用私鑰形成簽名,那么就無法對(duì)篡改后的證書形成匹配的簽名;
- 如果中間人強(qiáng)行篡改,客戶端收到證書后在驗(yàn)證時(shí)就會(huì)發(fā)現(xiàn)證書明文的 hash 值與簽名解密后得到的 hash 值不一樣,就會(huì)發(fā)現(xiàn)證書被篡改,從而終止向服務(wù)器傳輸信息。?
2.中間人能否調(diào)包證書?
? ? ? ? 中間人無法調(diào)包整個(gè)證書,理由如下:
- 中間人沒有公正機(jī)構(gòu)的私鑰,所以無法制作假的證書;
- 中間人只能向公正機(jī)構(gòu)申請(qǐng)真證書,然后使用自己申請(qǐng)的證書進(jìn)行掉包;
- 但是證書中明文包含了域名等服務(wù)端認(rèn)證信息,所以整體調(diào)包客戶端依舊可以識(shí)別。
? ? ? ? 我們要知道,中間人沒有公正機(jī)構(gòu)的私鑰對(duì)任何證書都無法進(jìn)行合法修改,包括自己的。?
3.HTTPS 工作完整流程
? ? ? ? 左側(cè)是客戶端要做的事,右側(cè)是服務(wù)器要做的事,完整流程如下圖所示:
·總結(jié)
? ? ? ? 文章到此就要結(jié)束了,本篇文章重點(diǎn)介紹了 HTTPS 的工作過程,在這里涉及到的密鑰一共有三組,如下所示:
- 第一組(非對(duì)稱加密):用于校驗(yàn)證書是否被篡改,服務(wù)器持有私鑰(私鑰在注冊(cè)證書時(shí)獲得),客戶端持有公鑰(操作系統(tǒng)包含了可信任的認(rèn)證機(jī)構(gòu)有哪些,同時(shí)持有對(duì)應(yīng)的公鑰),服務(wù)器使?這個(gè)私鑰對(duì)證書的簽名進(jìn)行加密,客戶端通過這個(gè)公鑰解密獲取到證書的簽名,從?校驗(yàn)證書內(nèi)容是否是篡改過;
- 第二組(非對(duì)稱加密):用于協(xié)商?成對(duì)稱加密的密鑰,服務(wù)器生成這組 私鑰-公鑰 對(duì),然后通過證書把公鑰傳遞給客戶端,然后客戶端用這個(gè)公鑰給?成的對(duì)稱加密的密鑰加密,傳輸給服務(wù)器,服務(wù)器通過私鑰解密獲取到對(duì)稱加密的密鑰;
- 第三組(對(duì)稱加密):客戶端和服務(wù)器后續(xù)傳輸?shù)臄?shù)據(jù)都通過這個(gè)對(duì)稱密鑰加密解密。
? ? ? ? ?切的關(guān)鍵都是圍繞這個(gè)對(duì)稱加密的密鑰,其他的機(jī)制都是輔助這個(gè)密鑰?作的,第二組非對(duì)稱加密的密鑰是為了讓客戶端把這個(gè)對(duì)稱密鑰傳給服務(wù)器,第一組非對(duì)稱加密的密鑰是為了讓客戶端拿到第二組非對(duì)稱加密的公鑰,如果你認(rèn)為讀了本篇文章您有所收獲,希望給本篇文章點(diǎn)個(gè)贊,收藏走一波,后面我會(huì)繼續(xù)與大家分享計(jì)算機(jī)網(wǎng)絡(luò)的相關(guān)知識(shí),關(guān)注博主不迷路~~~您的支持就是我創(chuàng)作最大的動(dòng)力,我們下一篇文章再見~~~