HTTPS和TLS/SSL的關系
HTTP和TLS/SSL的協(xié)議組合在一起就是HTTPS烦衣,HTTPS=HTTP+TLS/SSL,就是說HTTPS擁有HTTP的所有特征掩浙,并且使用TLS/SSL協(xié)議進行安全保護花吟。
密碼學的四個目標
機密性:傳輸?shù)臄?shù)據(jù)必須是加密的,通過密鑰才能解密
完整性:傳輸?shù)臄?shù)據(jù)必須是完整的厨姚,沒有被篡改的
身份驗證:發(fā)送方和接收方互相確認身份
不可抵賴:例:A向B借錢寫了欠條衅澈,然后不承認此欠條是自己寫的
TLS/SSL協(xié)議在網(wǎng)絡層協(xié)議中的定位
TLS/SSL協(xié)議位于應用層協(xié)議和TCP之間,構建在TCP之上谬墙,由TCP協(xié)議保證數(shù)據(jù)傳輸?shù)目煽啃越癫迹魏螖?shù)據(jù)到達TCP之前,都經(jīng)過TLS/SSL協(xié)議的加密
TLS/SSL協(xié)議背后保證密碼學目標的算法
加密算法和HMAC算法:
公開密鑰加密算法的缺點就是運算慢芭梯,HTTP傳輸?shù)臄?shù)據(jù)非常大险耀,大部分web中很少使用公開密鑰算法加解密。一般采用對稱加密算法如:AES玖喘、DES甩牺。MAC算法使用較多的是HMAC,如HMAC-SHA-1累奈、HMAC-SHA-256
密鑰協(xié)商算法
在HTTPS中贬派,一般采用RSA或者DH算法協(xié)商預備主密鑰
1)RSA算法流程如下:
客戶端發(fā)起請求,服務端發(fā)送RSA密鑰對公鑰給客戶端澎媒,
客戶端隨機生成預備主密鑰搞乏,通過RAS公鑰加密發(fā)送給服務端,
服務端正確解密預備主密鑰
2)DH算法:
客戶端發(fā)起請求
服務端生成RSA密鑰對戒努,發(fā)送公鑰給客戶端
服務端生成DH參數(shù)和服務端DH密鑰對请敦,用RAS私鑰簽名DH參數(shù)和服務端DH公鑰,最后將簽名值储玫、DH參數(shù)侍筛、服務端DH公鑰發(fā)送給客戶端
客戶端通過服務端的RSA公鑰驗證簽名,獲取到服務端DH參數(shù)和服務端DH公鑰
客戶端通過DH參數(shù)生成客戶端的DH密鑰對撒穷,將客戶端的DH公鑰發(fā)送給服務端
客戶端通過DH私鑰和服務端DH公鑰計算出預備主密鑰
服務端通過接收到的客戶端DH公鑰匣椰,結合服務端DH私鑰計算出預備主密鑰
例:
發(fā)送方Alice,接收方Bob端礼,雙方共享DH參數(shù)(p,g)禽笑,DH參數(shù)(p,g)公開
Alice的私鑰a(其實a不是數(shù)字證書的私鑰入录,叫secret,就是為本次協(xié)商密鑰產(chǎn)生的)
Bob的私鑰b(同理佳镜,b也不是數(shù)字證書的私鑰僚稿,也是secret)
Alice和Bob約定使用一個模 p = 23和g = 5(g是23的原根)
Alice選擇一個保密的整數(shù) a = 4作為私鑰,計算出公鑰 A = g^a mod p邀杏,將公鑰A發(fā)送給Bob贫奠;
A = 54 mod 23 = 4
Bob選在一個保密的整數(shù) b = 3,計算出公鑰 B = g^b mod p望蜡,將公鑰B發(fā)送給Alice唤崭;
B = 53 mod 23 = 10
Alice 計算出共享密鑰 s = B^a mod p
s = 104 mod 23 = 18
Bob 計算共享密鑰 s = A^b mod p
s = 43 mod 23 = 18
Alice和Bob現(xiàn)在就共享一個密鑰(s = 18)
A^b mod p = (ga)b mod p = (gb)a mod p = B^a mod p
(ga mod p)b mod p = (gb mod p)a mod p(算法證明略)
前向安全性
RSA密鑰協(xié)商,協(xié)商完成后一段時間內密鑰是不變的脖律,攻擊者可以先保存這些加密信息谢肾,以后如果密鑰泄密,這段通信密文就會被解密小泉。
DH靜態(tài)密鑰協(xié)商類似芦疏,只有動態(tài)DH密鑰協(xié)商能夠保證前向安全性,因為密鑰是每次重新生成的微姊。
中間人攻擊
通過RSA或者DH密鑰協(xié)商算法酸茴,服務器需要提供一對密鑰,可以使RSA密鑰對或者是ECDSA密鑰對兢交,看似無懈可擊薪捍,卻存在著致命的問題,那就是中間人攻擊配喳。
中間人攻擊就是服務端存底給客戶端的公鑰可能被攻擊者替換酪穿。
PKI
首先明確一點,PKI不是TLS/SSL協(xié)議的一部分晴裹,但是在HTTPS中被济,必須有PKI技術才能保證安全,簡單來說涧团,PKI技術能夠保證客戶端接收到的服務端公鑰只磷,確實是服務端的公鑰,而不是中間人泌绣。
PKI技術的核心是證書喳瓣,證書簽發(fā)流程如下:
證書校驗
需要先明白的兩點:
1、瀏覽器內置了根證書
2赞别、根證書是絕對信任證書
國家發(fā)放身份證,學校發(fā)放畢業(yè)證配乓,類似根證書直接簽發(fā)某網(wǎng)站的CA證書仿滔,學校委托第三方發(fā)放畢業(yè)證惠毁,類似根證書簽發(fā)CA機構證書,由CA機構簽發(fā)某網(wǎng)站的CA證書崎页,根證書只有一個鞠绰,負責所有CA證書的簽發(fā)顯然不切實際,故CA證書一般都是CA機構簽發(fā)的飒焦,兩者場景不同蜈膨。
根證書直接簽發(fā)的CA證書,瀏覽器通過內置的根證書公鑰牺荠,校驗由根證書私鑰簽發(fā)的CA證書即可完成校驗翁巍。
不是根證書簽發(fā)的CA證書,證書中附帶有證書簽發(fā)機構鏈休雌,如上圖某網(wǎng)站的CA證書灶壶,證書中包含簽發(fā)CA機構,CA機構再簽發(fā)二級CA機構杈曲,二級CA機構簽發(fā)某網(wǎng)站的CA證書驰凛,校驗時,先使用二級CA機構的證書校驗此CA證書是由對應的CA機構頒發(fā)担扑,再使用上一級CA機構的證書校驗二級CA機構證書恰响,以此校驗,直到根證書涌献。
瀏覽器內置根證書和中間CA機構證書斯议,若無CA機構證書鞍爱,或此CA機構不再被信任,則校驗失敗。
HTTPS總結
HTTPS主要由兩層構成喘批,分別是握手層和加密層,握手層位于加密層的上層邦鲫,握手層提供加密層需要的信息(密鑰塊)例获,對于一個HTTPS請求來說,HTTP消息沒有完成握手之前印叁,是不會傳遞到加密層的被冒,一旦握手成功,最終應用層的所有HTTP消息交由加密層進行加密轮蜕。
握手:
1)認證
客戶端和服務端進行密鑰交換之前昨悼,必須通過證書校驗各自的身份,否則就存在中間人攻擊跃洛。認證的核心是PKI技術率触,PKI技術的核心是證書,證書校驗的核心是公開密鑰加密算法汇竭,此算法的核心是離散對數(shù)問題目前無法被破解葱蝗。
2)密碼套件協(xié)商
客戶端和服務端需要協(xié)商出雙方都認可的密碼套件穴张,密碼套件決定了本次連接使用的加密算法、HMAC算法两曼、密鑰協(xié)商算法等各類算法皂甘。
為什么要進行密鑰協(xié)商
客戶端的運營環(huán)境是無法預知的,有各種各樣的操作系統(tǒng)悼凑,操作系統(tǒng)版本偿枕,瀏覽器,瀏覽器版本户辫,比如某些客戶端不支持HMAC-SHA256算法渐夸,在這種情況下,客戶端和服務端需要協(xié)商雙方都支持的HMAC算法寸莫。
什么是密碼套件
一個完整的密碼套件舉例:
TLS_DH_RSA_WITH_AES_CBC_128_SHA
RSA:身份驗證算法捺萌,表示證書中包含的服務器公鑰是RSA公鑰。
DH:表示密鑰協(xié)商算法膘茎。
AES_CBC_128:表示加密算法桃纯,用于保證機密性,本例中使用的是AES對稱加密算法披坏,加密模式是CBC模式态坦,密鑰長度是128位(bit)。
SHA:表示HMAC算法棒拂,用于保證消息完整性伞梯,本例中是HMAC_SHA1算法。
3)密鑰協(xié)商
理解密碼套件后帚屉,密鑰協(xié)商相對就簡單了谜诫,密碼套件決定客戶端和服務端使用何種算法進行密鑰協(xié)商。
為了保證消息的前向安全性攻旦,目前使用最多的密鑰協(xié)商算法就是DHE算法和ECDHE算法喻旷,這兩個算法和服務器的密鑰對關系不大,牢屋,服務器私鑰即使泄漏且预,也不會造成太大的損失。
4)消息完整性校驗
為了避免消息篡改烙无,握手過程中需要一種機制避免消息篡改锋谐,客戶端和服務端協(xié)商出密鑰塊后,代表可以對消息進行機密性和完整性保護了截酷,但首先保護的消息不是應用層消息涮拗,而是握手消息。
- 客戶端將發(fā)送和接收到的所有握手消息組合在一起啊,然后計算出摘要握手層使用密鑰塊對消息進行機密性和完整性保護多搀,然后發(fā)送給服務端
- 服務端接收到驗證消息后歧蕉。使用加密塊解密出消息摘要
- 服務端自行計算發(fā)送和接收的所有消息的消息摘要,比對客戶端的摘要值康铭,比對一致說明握手消息沒有被篡改。
加密:
相比于握手層赌髓,加密層處理相對就簡單了从藤,握手層協(xié)商出加密層需要的算法和算法對應的密鑰,加密層接下來進行加密運算和完整性保護锁蠕。
參數(shù)資料:
- 《深入淺出HTTPS》
- HTTPS詳解:https://segmentfault.com/a/1190000011675421