HTTPS是怎么保證安全的?
本文轉(zhuǎn)載自微信公眾號「碼工是小?!梗髡叽a工是小希。轉(zhuǎn)載本文請聯(lián)系碼工是小希公眾號。
"噔噔噔......"傳來一陣敲門聲,把我從睡夢中驚醒了。
朦朧間聽到有人在說活"提莫,在家不?”
“來了來了”,推門一看,原來是“李青”。
「李青」:自稱武術(shù)大師,所有因為他安靜冥想的舉動而掉以輕心敵人都將會品嘗他燃燒的拳頭和熾烈的回旋踢,人送外號“盲僧”。
瞧瞧HTTPS
「提莫」:HTTPS這并不是應(yīng)用層的一種新協(xié)議。只是HTTP通信接口部分使用SSL(安全套階層)和TLS(安全傳輸層協(xié)議)協(xié)議代替而已。
HTTP是直接和TCP通信的。如果你用SSL,就變成先和SSL通信,SSL再和TCP通信了。簡單來說,與SSL組合使用的HTTP被稱為HTTPS(超文本傳輸安全協(xié)議)或HTTP over SSL。
你用了SSL,HTTP就有了HTTPS的加密、證書和完整性保護這些功能了。SSL是獨立于HTTP的協(xié)議,所以不光是HTTP協(xié)議,其它運行在應(yīng)用層的SMTP和Telnet等協(xié)議也要配合SSL協(xié)議的使用??梢哉fSSL是世界上應(yīng)用最為廣泛的網(wǎng)絡(luò)安全技術(shù)。
步驟1:客戶端通過發(fā)Client Hello報文開始SSL通信。報文中包含客戶端支持的SSL的指定版本、加密組件列表(所使用的加密算法及密鑰長度等)。
步驟2:服務(wù)器可進行SSL通信時,會以Server Hello報文作為應(yīng)答。和客戶端一樣,在報文中包含SSL版本和加密組件。服務(wù)器的加密組件內(nèi)容是從接收到的客戶端加密組件內(nèi)篩出來的。
步驟3:之后服務(wù)器發(fā)送Certificate報文。報文中包含公開密鑰證書。
步驟4:最后服務(wù)器發(fā)Server Hello Done報文通知客戶端,最初階段的SSL握手協(xié)商就結(jié)束了。
步驟5:SSL第一次握手結(jié)束之后,客戶端以Client Key Exchange報文最為回應(yīng)。報文中包含通信加密中使用的一種被稱作Pre-master secret的隨機密碼串。該報文已用步驟3中的公開密鑰進行加密。
步驟6:接著客戶端繼續(xù)發(fā)送Change Cipher Spec報文。該報文會提示服務(wù)器,在此報文之后的通信會采用Pre-master secret密鑰加密。
步驟7:客戶端發(fā)送Finished報文。該報文包含連接至今全部報文的整體效驗值。這次握手協(xié)商是否能夠成功,是以服務(wù)器是否能夠正確解密該報文作為判定標(biāo)準(zhǔn)。
步驟8:服務(wù)器同樣發(fā)送Change Cipher Spec報文。
步驟9:服務(wù)器同樣發(fā)送Finished報文。
步驟10:服務(wù)器和客戶端的Finished報文交換完畢之后,SSL連接就算建立完成,當(dāng)然,通信會受到SSL的保護。從此處開始進行應(yīng)用層協(xié)議的通信,即發(fā)送HTTP請求。
步驟11:應(yīng)用層協(xié)議通信,即發(fā)送HTTP響應(yīng)。
步驟12:最后由客戶端斷開連接。斷開連接時,發(fā)送close_notify報文。上圖做了一些省略,這步之后再發(fā)送TCP FIN報文來關(guān)閉與TCP的通信。
在以上流程中,應(yīng)用層發(fā)送數(shù)據(jù)時會附加一種叫做MAC(Message Authentication Code)的報文摘要。MAC能夠知道報文是否遭到篡改,從而保護報文的完整性。
「提莫」:每次發(fā)送真實數(shù)據(jù)之前,服務(wù)器這邊先生成一把密鑰,接著把密鑰傳給客戶端。后面服務(wù)器給客戶端發(fā)送真實數(shù)據(jù)的時候,會拿這把密鑰對數(shù)據(jù)加密,客戶端收到加密數(shù)據(jù)之后,用剛才收到的密鑰進行解密。當(dāng)然,如果客戶端要給服務(wù)器發(fā)數(shù)據(jù),也是用這把密鑰來加密,這里為了方便,我就用單方向傳輸?shù)男问絹肀硎?。如圖:
「盲僧」:你看哈服務(wù)器是用明文方式傳密鑰給客戶端,然后密鑰被中間人給偷了,那么在之后服務(wù)器和客戶端的加密傳輸過程中,中間人也可以用他偷的密鑰來解密啊。這樣的話,加密的數(shù)據(jù)在中間人看來和明文那沒啥兩樣了啊。
「提莫」:這種方法是讓客戶端和服務(wù)器都擁有兩把鑰匙,一把鑰匙是公開的(全世界都知道都沒關(guān)系),我們稱之為公鑰;另一把鑰匙則是保密的(只有自己本人才知道),我們稱之為私鑰。當(dāng)然,用公鑰加密的數(shù)據(jù),只有對應(yīng)的私鑰才能解密;用私鑰加密的數(shù)據(jù),只有對應(yīng)的公鑰才能解密。
這樣,服務(wù)器在給客戶端傳數(shù)據(jù)的過程中,可以用客戶端明文給他的公鑰進行加密,然后客戶端收到后,再用自己的私鑰來解密??蛻舳私o服務(wù)器發(fā)送數(shù)據(jù)的時候也可以采取這種方式。這樣能保持數(shù)據(jù)的安全傳輸了。上圖:
「提莫」:就是對稱加密+非對稱加密這兩種方式,我們可以用非對稱加密的方式來傳輸對稱加密過程中的密鑰,之后我們就可以采取對稱加密的方式來傳輸數(shù)據(jù)了呀。具體是這樣子:
服務(wù)器用明文的方式給客戶端發(fā)送自己的公鑰,客戶端收到公鑰之后,會生成一把密鑰(對稱加密用的),然后用服務(wù)器的公鑰對這把密鑰進行加密,接著再把密鑰傳給服務(wù)器,服務(wù)器收到后進行解密,最后服務(wù)器就可以安全著得到這把密鑰了,而客戶端也有同樣一把的密鑰,他們就可以進行對稱加密了,是不是很神奇呀,大師。

「盲僧」:服務(wù)器用明文的方式給客戶端傳輸公鑰的時候,中間人截取了這本屬于服務(wù)器的公鑰,并且把中間人自己的公鑰冒充服務(wù)器的公鑰傳給了客戶端。
之后客戶端就會用中間人的公鑰來加密自己生成的密鑰。然后把被加密的密鑰再傳給服務(wù)器,這個時候中間人又把密鑰給截取了,中間人用自己的私鑰對這把被加密的密鑰進行解密,解密后中間人就可以獲得這把密鑰了,這你沒想到吧!
最后中間人再對這把密鑰用剛才服務(wù)器的公鑰進行加密,再發(fā)給服務(wù)器。如圖:

數(shù)字證書上場
在剛才的講解中,我們知道了,之所以非對稱加密會不安全,是因為客戶端不知道這把公鑰是不是服務(wù)器的,因此,我們需要找到一種策略來證明這把公鑰就是服務(wù)器的,而不是別人冒充的。
解決這個問題的方式就是使用數(shù)字證書,具體是這樣的:
我們需要找到一個擁有公信力、大家都認可的認證中心(CA)。
服務(wù)器在給客戶端傳輸公鑰的過程中,會把公鑰以及服務(wù)器的個人信息通過Hash算法生成信息摘要。如圖:
為了防止信息摘要被人調(diào)換,服務(wù)器還會用CA提供的私鑰對信息摘要進行加密來形成數(shù)字簽名。如圖:
并且,最后還會把原來沒Hash算法之前的個人信息以及公鑰和數(shù)字簽名合并在一起,形成數(shù)字證書。如圖:
當(dāng)客戶端拿到這份數(shù)字證書之后,就會用CA提供的公鑰來對數(shù)字證書里面的數(shù)字簽名進行解密來得到信息摘要,然后對數(shù)字證書里服務(wù)器的公鑰以及個人信息進行Hash得到另外一份信息摘要。最后把兩份信息摘要進行對比,如果一樣,則證明這個人是服務(wù)器,否則那就不是。如圖:
其實,某些服務(wù)器一開始就向認證中心申請了這些證書了(有沒有看過沒有證書的網(wǎng)站在地址欄會被標(biāo)出警告?),而客戶端是,也會內(nèi)置這些證書。如圖:
當(dāng)客戶端收到服務(wù)器傳輸過來的數(shù)據(jù)數(shù)字證書時,就會在內(nèi)置的證書列表里,查看是否有解開該數(shù)字證書的公鑰,如果有則...,如果沒有則....