概述
超文本傳輸安全協(xié)議(HyperText Transfer Protocol Secure,縮寫:HTTPS)是一種通過計(jì)算機(jī)網(wǎng)絡(luò)進(jìn)行安全通信的傳輸協(xié)議。HTTPS經(jīng)由HTTP進(jìn)行通信,利用SSL/TLS來加密數(shù)據(jù)包。其主要目的,是提供對網(wǎng)站服務(wù)器的身份認(rèn)證,保護(hù)交換資料的隱私與完整性。
了解HTTPS,有助于我們定位和解決日常遇到的網(wǎng)路問題,對HTTPS流程的了解程度,也在一定程度上反映了一個(gè)開發(fā)人員的網(wǎng)絡(luò)知識基本功。
加密與簽名
Hash
「Hash算法」也被稱為散列算法?!窰ash算法」沒有一個(gè)固定的公式,只要符合散列思想的算法都可以被稱為是「Hash算法」。
通常無法通過數(shù)據(jù)的hash值還原出原始數(shù)據(jù),不同數(shù)據(jù)的hash值不同,所以可以用「Hash算法」來校驗(yàn)完整性,檢測數(shù)據(jù)是否完整或者是否有更改。
對稱加密
加密與解密使用同樣的密鑰。
對稱加密效率較高,被廣泛應(yīng)用于各種加密協(xié)議,然而在通訊前需要將密鑰發(fā)送給對方,容易導(dǎo)致密鑰泄漏。
非對稱加密
非對稱加密使用了一對密鑰:公鑰和私鑰。私鑰只能由一方保管,不能外泄,而公鑰則可以發(fā)給任何請求者。通過公鑰加密的數(shù)據(jù)只能由私鑰解開。
相比對稱加密而言,非對稱加密是十分安全的,但是加密和解密效率卻沒有對稱加密高。
數(shù)據(jù)簽名
數(shù)據(jù)簽名可以理解為:利用非對稱加密中的私鑰對「數(shù)據(jù)的 Hash 值」進(jìn)行加密后的數(shù)據(jù)。
簽名的驗(yàn)證者使用公鑰對數(shù)據(jù)簽名進(jìn)行解密,并將解密結(jié)果與自己計(jì)算出的數(shù)據(jù)的 Hash 值進(jìn)行比對,結(jié)果相同則證明數(shù)據(jù)完整、簽名有效,否則,則認(rèn)為數(shù)據(jù)無效。
在非對稱加密中,公鑰也能解開私鑰加密的數(shù)據(jù),然而由于公鑰是公開的,所以不能使用私鑰加密數(shù)據(jù)公鑰解密的方式通訊,私鑰加密被用作對數(shù)據(jù)進(jìn)行數(shù)字簽名,公鑰來驗(yàn)證簽名。
- 加密過程:公鑰加密,私鑰解密;
- 數(shù)字簽名:私鑰加密,公鑰解密;
數(shù)字證書
數(shù)字證書用來證明公鑰擁有者的身份。
數(shù)字證書中包含:擁有者的公鑰、擁有者名稱、證書頒發(fā)者信息、證書信息簽名及有效期等
1、數(shù)字簽名用來驗(yàn)證證書的是否有效,防止證書信息被篡改
2、證書頒發(fā)者指向證書頒發(fā)者的數(shù)字證書,同樣需要驗(yàn)證,這也是為什么客戶端需要下載可信任證書或者安裝根證書的原因。
SSL/TSL
HTTPS 是基于 HTTP , 在 HTTP 下面提供了一個(gè)傳輸級的密碼安全層。
握手圖示
1) ClientHello
- Client 首先發(fā)送本地的 TLS 版本、支持的加密算法套件,并且生成一個(gè)隨機(jī)數(shù) R1 。
2)Server Hello
- Server 端確認(rèn) TLS 版本號。從 Client 端支持的加密套件中選取一個(gè),并生成一個(gè)隨機(jī)數(shù) R2 一起發(fā)送給 Client。
- Server 向 Client 發(fā)動(dòng)自己的CA證書(包含公鑰)、證書簽名。
3) 證書校驗(yàn)
- Client 判斷證書簽名與CA證書是否合法有效
- Client 生成隨機(jī)數(shù) Pre-Master ,并使用第二步中的公鑰對 Pre-Master 進(jìn)行加密,將加密后的 Pre-Master 送給服務(wù)器
這一步結(jié)束后,Client 與 Server 就都有 R1、R2、Pre-Master 了,兩端便可以使用這 3 個(gè)隨機(jī)數(shù)獨(dú)立生成對稱加密會話密鑰了,避免了對稱加密密鑰的傳輸,同時(shí)可以根據(jù)會話密鑰生成 6 個(gè)密鑰(P1~P6)用作后續(xù)身份驗(yàn)證
4) Client 握手結(jié)束通知
- Client 使用 P1 將之前的握手信息的 hash 值加密并發(fā)送給 Server
- Client 發(fā)送握手結(jié)束消息
5)Server 握手結(jié)束通知
- Server 計(jì)算之前的握手信息的 hash 值,并與 P1 解密客戶端發(fā)送的握手信息的 hash 對比校驗(yàn)
- 驗(yàn)證通過后,使用 P2 將之前的握手信息的 hash 值加密并發(fā)送給 Client
6) Client 開始HTTPS通訊
- Client 計(jì)算之前的握手信息的 hash 值,并與 P2 解密 Server 發(fā)送的握手信息的 hash 對比校驗(yàn)
- 驗(yàn)證通過后,開始發(fā)起 HTTPS 請求。
拓展
Charles抓包原理
當(dāng)使用 Charles 抓包時(shí),對服務(wù)器來說 Charles 就是客戶端,對客戶端來說 Charles 就是服務(wù)器。
首先,客戶端需要信任 Charles 自建的證書。在此基礎(chǔ)上客戶端與 Charles 完成 HTTPS 握手,Charles 與服務(wù)器完成 HTTPS 握手。在通訊時(shí),Charles 使用自己的私鑰解密客戶端的數(shù)據(jù),然后將數(shù)據(jù)再使用服務(wù)的公鑰加密轉(zhuǎn)發(fā)給服務(wù)器,以此完成代理功能。