在上篇文章HTTPS詳解一中校套,我已經(jīng)為大家介紹了 HTTPS 的詳細(xì)原理和通信流程集灌,但總感覺(jué)少了點(diǎn)什么推汽,應(yīng)該是少了對(duì)安全層的針對(duì)性介紹绽乔,那么這篇文章就算是對(duì)HTTPS 詳解一的補(bǔ)充吧弧蝇。還記得這張圖吧。
顯然折砸,HTTPS 相比 HTTP最大的不同就是多了一層 SSL (Secure Sockets Layer 安全套接層)或 TLS (Transport Layer Security 安全傳輸層協(xié)議)看疗。有了這個(gè)安全層,就確保了互聯(lián)網(wǎng)上通信雙方的通信安全睦授,那么這個(gè)安全層是怎么工作的两芳,SSL / TLS 握手過(guò)程又是怎樣的呢?本文將對(duì)這些問(wèn)題一一解答去枷。
1怖辆、SSL / TLS 以及 SSL / TLS 握手的概念
SSL 和 TLS 協(xié)議可以為通信雙方提供識(shí)別和認(rèn)證通道,從而保證通信的機(jī)密性和數(shù)據(jù)完整性删顶。TLS 協(xié)議是從Netscape SSL 3.0協(xié)議演變而來(lái)的竖螃,不過(guò)這兩種協(xié)議并不兼容,SSL 已經(jīng)被 TLS 取代逗余,所以下文就以 TLS 指代安全層特咆。 TLS 握手是啟動(dòng) HTTPS 通信的過(guò)程,類似于 TCP 建立連接時(shí)的三次握手录粱。 在 TLS 握手的過(guò)程中腻格,通信雙方交換消息以相互驗(yàn)證,相互確認(rèn)啥繁,并確立它們所要使用的加密算法以及會(huì)話密鑰 (用于對(duì)稱加密的密鑰)∑烀觯可以說(shuō)酬核,TLS 握手是 HTTPS 通信的基礎(chǔ)部分。
2宪睹、TLS 握手過(guò)程中發(fā)生了什么
我們已經(jīng)知道 TLS 握手的目的是建立安全連接愁茁,那么通信雙方在這個(gè)過(guò)程中究竟干了什么呢?下面就是答案:
- 商定雙方通信所使用的的 TLS 版本 (例如 TLS1.0, 1.2, 1.3等等)亭病;
- 確定雙方所要使用的密碼組合鹅很;
- 客戶端通過(guò)服務(wù)器的公鑰和數(shù)字證書 (上篇文章已有介紹)上的數(shù)字簽名驗(yàn)證服務(wù)端的身份;
- 生成會(huì)話密鑰罪帖,該密鑰將用于握手結(jié)束后的對(duì)稱加密促煮。
3邮屁、TLS 握手詳細(xì)過(guò)程
下面來(lái)看 TLS 握手的詳細(xì)過(guò)程:
- "client hello"消息:客戶端通過(guò)發(fā)送"client hello"消息向服務(wù)器發(fā)起握手請(qǐng)求,該消息包含了客戶端所支持的 TLS 版本和密碼組合以供服務(wù)器進(jìn)行選擇菠齿,還有一個(gè)"client random"隨機(jī)字符串佑吝。
- "server hello"消息:服務(wù)器發(fā)送"server hello"消息對(duì)客戶端進(jìn)行回應(yīng),該消息包含了數(shù)字證書绳匀,服務(wù)器選擇的密碼組合和"server random"隨機(jī)字符串芋忿。
-
驗(yàn)證:客戶端對(duì)服務(wù)器發(fā)來(lái)的證書進(jìn)行驗(yàn)證,確保對(duì)方的合法身份疾棵,驗(yàn)證過(guò)程可以細(xì)化為以下幾個(gè)步驟:
- 檢查數(shù)字簽名
- 驗(yàn)證證書鏈 (這個(gè)概念下面會(huì)進(jìn)行說(shuō)明)
- 檢查證書的有效期
- 檢查證書的撤回狀態(tài) (撤回代表證書已失效)
- "premaster secret"字符串:客戶端向服務(wù)器發(fā)送另一個(gè)隨機(jī)字符串"premaster secret (預(yù)主密鑰)"戈钢,這個(gè)字符串是經(jīng)過(guò)服務(wù)器的公鑰加密過(guò)的,只有對(duì)應(yīng)的私鑰才能解密是尔。
- 使用私鑰:服務(wù)器使用私鑰解密"premaster secret"殉了。
- 生成共享密鑰:客戶端和服務(wù)器均使用 client random,server random 和 premaster secret拟枚,并通過(guò)相同的算法生成相同的共享密鑰 KEY薪铜。
- 客戶端就緒:客戶端發(fā)送經(jīng)過(guò)共享密鑰 KEY加密過(guò)的"finished"信號(hào)。
- 服務(wù)器就緒:服務(wù)器發(fā)送經(jīng)過(guò)共享密鑰 KEY加密過(guò)的"finished"信號(hào)恩溅。
- 達(dá)成安全通信:握手完成隔箍,雙方使用對(duì)稱加密進(jìn)行安全通信。
4暴匠、TLS 握手過(guò)程中的一些重要概念
-
數(shù)字證書 (digital certificate):在非對(duì)稱加密通信過(guò)程中鞍恢,服務(wù)器需要將公鑰發(fā)送給客戶端傻粘,在這一過(guò)程中每窖,公鑰很可能會(huì)被第三方攔截并替換,然后這個(gè)第三方就可以冒充服務(wù)器與客戶端進(jìn)行通信弦悉,這就是傳說(shuō)中的“中間人攻擊”(man in the middle attack)窒典。解決此問(wèn)題的方法是通過(guò)受信任的第三方交換公鑰,具體做法就是服務(wù)器不直接向客戶端發(fā)送公鑰稽莉,而是要求受信任的第三方瀑志,也就是證書認(rèn)證機(jī)構(gòu) (Certificate Authority, 簡(jiǎn)稱 CA)將公鑰合并到數(shù)字證書中,然后服務(wù)器會(huì)把公鑰連同證書一起發(fā)送給客戶端污秆,私鑰則由服務(wù)器自己保存以確保安全劈猪。數(shù)字證書一般包含以下內(nèi)容:
證書所有者的公鑰
證書所有者的專有名稱
證書頒發(fā)機(jī)構(gòu)的專有名稱
證書的有效起始日期
證書的過(guò)期日期
證書數(shù)據(jù)格式的版本號(hào)
-
序列號(hào),這是證書頒發(fā)機(jī)構(gòu)為該證書分配的唯一標(biāo)識(shí)符
... ...
-
數(shù)字簽名 (digital signature):這個(gè)概念很好理解良拼,其實(shí)跟人的手寫簽名類似战得,是為了確保數(shù)據(jù)發(fā)送者的合法身份,也可以確保數(shù)據(jù)內(nèi)容未遭到篡改庸推,保證數(shù)據(jù)完整性常侦。與手寫簽名不同的是浇冰,數(shù)字簽名會(huì)隨著文本數(shù)據(jù)的變化而變化。具體到數(shù)字證書的應(yīng)用場(chǎng)景聋亡,數(shù)字簽名的生成和驗(yàn)證流程如下:
- 服務(wù)器對(duì)證書內(nèi)容進(jìn)行信息摘要計(jì)算 (常用算法有 SHA-256等)肘习,得到摘要信息,再用私鑰把摘要信息加密坡倔,就得到了數(shù)字簽名
- 服務(wù)器把數(shù)字證書連同數(shù)字簽名一起發(fā)送給客戶端
- 客戶端用公鑰解密數(shù)字簽名漂佩,得到摘要信息
- 客戶端用相同的信息摘要算法重新計(jì)算證書摘要信息,然后對(duì)這兩個(gè)摘要信息進(jìn)行比對(duì)罪塔,如果相同仅仆,則說(shuō)明證書未被篡改,否則證書驗(yàn)證失敗
證書鏈 (certificate chain):證書鏈垢袱,也稱為證書路徑墓拜,是用于認(rèn)證實(shí)體合法身份的證書列表,具體到 HTTPS 通信中请契,就是為了驗(yàn)證服務(wù)器的合法身份咳榜。之所以使用證書鏈,是為了保證根證書 (root CA certificate)的安全爽锥,中間層可以看做根證書的代理涌韩,起到了緩沖的作用,如下圖所示氯夷,這里還以 B 站證書為例:
證書鏈從根證書開(kāi)始臣樱,并且證書鏈中的每一級(jí)證書所標(biāo)識(shí)的實(shí)體都要為其下一級(jí)證書簽名,而根證書自身則由證書頒發(fā)機(jī)構(gòu)簽名腮考」秃粒客戶端在驗(yàn)證證書鏈時(shí),必須對(duì)鏈中所有證書的數(shù)字簽名進(jìn)行驗(yàn)證踩蔚,直到達(dá)到根證書為止棚放。
-
密碼規(guī)范和密碼組合 (CipherSpecs 和 CipherSuites):通信雙方在安全連接中所使用的算法必須符合密碼安全協(xié)議的規(guī)定,CipherSpecs 和 CipherSuites 正好定義了合法的密碼算法組合馅闽。CipherSpecs 用于認(rèn)證加密算法和信息摘要算法的組合飘蚯,通信雙方必須同意這個(gè)密碼規(guī)范才能進(jìn)行通信。而 CipherSuites 則定義了 SSL / TLS 安全連接中所使用的加密算法的組合福也,該組合包含三種不同的算法:
- 握手期間所使用的的密鑰交換和認(rèn)證算法 (最常用的是 RSA 算法)
- 加密算法 (用于握手完成后的對(duì)稱加密局骤,常用的有 AES、3DES等)
- 信息摘要算法 (常用的有 SHA-256暴凑、SHA-1 和 MD5 等)
4峦甩、總結(jié)
本文對(duì) SSL / TLS 握手過(guò)程進(jìn)行了詳細(xì)的解析,也對(duì)握手過(guò)程中的幾個(gè)重要概念進(jìn)行了補(bǔ)充說(shuō)明搬设。想繼續(xù)深入了解的小伙伴可以去參考一下 CloudFlare 和 IBM 的官網(wǎng)穴店,這兩個(gè)網(wǎng)站也是本文內(nèi)容的主要來(lái)源撕捍。多逛逛英文網(wǎng)站,不僅可以漲姿勢(shì)泣洞,獲取權(quán)威信息忧风,還能順帶提升一波英語(yǔ)水平,一舉兩得球凰,豈不美哉狮腿,希望小伙伴們也能盡快養(yǎng)成這樣的好習(xí)慣。HTTPS 詳解部分到此結(jié)束呕诉,咱們下篇文章再見(jiàn)缘厢。