HTTPS是互聯(lián)網(wǎng) web 大勢(shì)所趨。各大網(wǎng)站都已陸續(xù)部署了HTTPS,這篇文章我們來(lái)探討什么是HTTPS以及為什么要部署HTTPS。
這篇文章收錄在《Said - 從HTTP到HTTPS》系列:
- 從 HTTP 到 HTTPS - 什么是 HTTPS
- 從 HTTP 到 HTTPS - IIS如何部署 HTTPS
- 從 HTTP 到 HTTPS - 網(wǎng)站部署 HTTPS 中需要做的事情
HTTP
當(dāng)你在瀏覽器輸入一個(gè)網(wǎng)址 (例如 http://59kt.cn)的時(shí)候,瀏覽器發(fā)起一個(gè) HTTP 請(qǐng)求,帶著請(qǐng)求信息 (參見(jiàn)HTTP Headers),連接到服務(wù)器,把請(qǐng)求信息遞給服務(wù)器,服務(wù)器收到信息之后,解析相關(guān)的信息,然后進(jìn)行處理,再返回瀏覽器請(qǐng)求的數(shù)據(jù)。
簡(jiǎn)單來(lái)說(shuō)是這么一個(gè)流程:
- 小明跟瀏覽器爸爸說(shuō)我想要去中關(guān)村某個(gè)店家拿一些東西 (發(fā)起請(qǐng)求)
- 瀏覽器爸爸就把小明要的東西記在一張清單上 (生成HTTP協(xié)議)
- 然后 瀏覽器爸爸派出一個(gè)線程小弟,噌噌噌跑到中關(guān)村的店里,把清單遞給店家,說(shuō)小明要這些東西 (進(jìn)行傳輸)
- 店家讓線程小弟稍等,然后去屋子里面拿小明的這些東西 (服務(wù)器收到請(qǐng)求)
- 店家把東西拿出來(lái)后,并且也打印了一份清單,讓線程小弟帶著清單和東西一起拿回去 (服務(wù)器處理請(qǐng)求完畢)
- 然后 線程小弟回到瀏覽器爸爸那邊,把服務(wù)器給的清單和物品交給瀏覽器爸爸,瀏覽器爸爸根據(jù)清單核對(duì)物品 (瀏覽器處理響應(yīng))
- 然后把物品打包交給了 小明(瀏覽器渲染并呈現(xiàn)界面)
看圖說(shuō)話:
這其中有個(gè)問(wèn)題,瀏覽器爸爸和服務(wù)器都沒(méi)有驗(yàn)證清單信息的有效性和對(duì)方的身份。萬(wàn)一有人在中間把線程小哥攔下來(lái),暴揍一頓,然后把物品清單給換了怎么辦?或者有人把線程小哥在半路上暴揍一頓,拿了清單換了另外一個(gè)小哥怎么辦?
這是個(gè)很嚴(yán)肅的問(wèn)題:假如服務(wù)器要把一些東西鎖在柜子里,需要小明給密碼才可以打開(kāi)柜子。然后小明把密碼寫在清單上讓瀏覽器爸爸交給服務(wù)器。這時(shí)候,如果這張清單被人攔截下來(lái),不就得到了小明的密碼?
簡(jiǎn)單來(lái)說(shuō),傳輸?shù)男畔⒅邪脩裘艽a,被攔截了怎么辦?
HTTPS
正因?yàn)镠TTP請(qǐng)求有這些安全性的問(wèn)題,所以HTTPS誕生了,致力于解決了這些安全性問(wèn)題,我們進(jìn)行一下對(duì)比:
安全性 | HTTP | HTTPS |
---|---|---|
竊聽(tīng)風(fēng)險(xiǎn) | 傳遞的信息是明文的,可能會(huì)被有心人攔截下來(lái)竊聽(tīng) | 信息加密傳播 |
篡改風(fēng)險(xiǎn) | 傳遞的信息可能會(huì)被篡改 | 信息校驗(yàn),一旦被篡改立刻就會(huì)被發(fā)現(xiàn) |
偽裝風(fēng)險(xiǎn) | 沒(méi)有驗(yàn)證通信另外一頭對(duì)方的身份,可能遭遇偽裝 | 身份校驗(yàn) |
那么HTTPS是如何做到更安全的呢?
簡(jiǎn)單來(lái)說(shuō),HTTPS 即是在 HTTP 下加入了一層 SSL 加密,所以被稱為HTTPS。具體的加密過(guò)程則是公匙加密法:
- 客戶端向服務(wù)器索要公匙,然后使用公匙加密信息
- 服務(wù)器收到加密后的信息,用自己的私匙解密
公匙密碼和算法都是公開(kāi)的,而私匙則是保密的。加密使用的公匙和解碼使用的密匙都是不相同的,因此這是一個(gè) 非對(duì)稱加密算法。
數(shù)字證書
提及 HTTPS ,就會(huì)聽(tīng)到大家說(shuō)需要證書才能部署,那么什么是證書呢?
因?yàn)榛ヂ?lián)網(wǎng)不安全,公匙也是信息的一部分,也是會(huì)有被篡改的風(fēng)險(xiǎn)的。所以引入了互聯(lián)網(wǎng)權(quán)威機(jī)構(gòu) - CA 機(jī)構(gòu),又稱為證書授權(quán) (Certificate Authority) 機(jī)構(gòu),瀏覽器會(huì)內(nèi)置這些"受信任的根證書頒發(fā)機(jī)構(gòu)" (即 CA)。
服務(wù)端向權(quán)威的身份鑒定 CA 機(jī)構(gòu)申請(qǐng)數(shù)字證書,CA 機(jī)構(gòu)驗(yàn)證了網(wǎng)站之后,會(huì)把網(wǎng)站錄入到內(nèi)部列表,采用 Hash 把服務(wù)端的一些相關(guān)信息生成摘要,然后 CA 機(jī)構(gòu)用自己的私匙,把服務(wù)端的公匙和相關(guān)信息一起加密,然后給申請(qǐng)證書的服務(wù)端頒發(fā)數(shù)字證書,用于其他客戶端 (比如瀏覽器) 認(rèn)證這個(gè)網(wǎng)站的公匙。
客戶端通過(guò)服務(wù)端下發(fā)的證書,找到對(duì)應(yīng)的 CA,然后向 CA 驗(yàn)證這個(gè)證書是否有效,CA 驗(yàn)證通過(guò)之后,下發(fā)服務(wù)端的公匙。
因?yàn)?CA 是權(quán)威并且可信的,所以客戶端 (瀏覽器) 信任 CA,而 CA 又信任經(jīng)過(guò)認(rèn)證的服務(wù)端 ,所以客戶端 (瀏覽器) 也信任這個(gè)服務(wù)端,這就是信任鏈 (Chain Of Trust)。
而 CA 頒發(fā)的數(shù)字證書,一般包含這些信息:
簡(jiǎn)單來(lái)說(shuō):為了保證公匙是安全的,所以通過(guò)數(shù)字證書驗(yàn)證公匙。
加密通信
一條完整的HTTPS請(qǐng)求應(yīng)該是這樣的:
- 客戶端 (瀏覽器) 發(fā)起 HTTP 請(qǐng)求,請(qǐng)求連接服務(wù)端,發(fā)送支持的加密通信協(xié)議 (和版本),并且生成一個(gè)隨機(jī)數(shù),后續(xù)用于生成"對(duì)話密鑰"。
- 服務(wù)端確認(rèn)加密通信協(xié)議 (和版本),同時(shí)也生成一個(gè)隨機(jī)數(shù),后續(xù)用于生成"對(duì)話密匙",并且將 CA 頒發(fā)的數(shù)字證書,一起發(fā)送給客戶端。
- 客戶端收到數(shù)字證書后,檢測(cè)內(nèi)置的"受信任的根證書頒發(fā)機(jī)構(gòu)",查看解開(kāi)數(shù)字證書的公匙是否在。
- 如果解開(kāi)數(shù)字證書的公匙存在,則使用它解開(kāi)數(shù)字證書,得到正確的服務(wù)器公匙,同時(shí)再次生成一個(gè)隨機(jī)數(shù),用于服務(wù)器公匙加密,并發(fā)送給服務(wù)器。
- 此時(shí)本地和服務(wù)器同時(shí)將三個(gè)隨機(jī)數(shù),根據(jù)約定的加密方法進(jìn)行加密,各自生成本次會(huì)話的所使用的同一把 "會(huì)話密匙" 。
- 到這里,認(rèn)證階段已經(jīng)完畢,數(shù)據(jù)傳輸從 非對(duì)稱加密換成了對(duì)稱加密(因?yàn)榭紤]到性能),接下來(lái)所有的數(shù)據(jù)傳輸都是使用HTTP協(xié)議進(jìn)行傳輸,只不過(guò)使用了 "會(huì)話密匙" 來(lái)加密內(nèi)容。
見(jiàn)下圖:
參考和引用
- HTTPS 工作原理
- 阮一峰 - 數(shù)字簽名是什么
- 阮一峰 - SSL/TLS協(xié)議運(yùn)行機(jī)制的概述