HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全為目標(biāo)的 HTTP 通道,簡(jiǎn)單講是 HTTP 的安全版。HTTPS 就是將 HTTP 協(xié)議數(shù)據(jù)包放到 SSL/TSL 層加密后,在 TCP/IP 層組成 IP 數(shù)據(jù)報(bào)去傳輸,以此保證傳輸數(shù)據(jù)的安全。SSL/TLS 處于 TCP 協(xié)議之上,HTTP(或者其它 TCP 協(xié)議,如 SMTP、IMAP) 協(xié)議之下,在 《HTTPS 權(quán)威指南》一書(shū)中將它歸為表示層。
網(wǎng)景(NetScape)公司在 1994 年開(kāi)發(fā)了 SSL 協(xié)議(Secure Sockets Layer) 1.0 版,但是直到 1996 年 SSL3.0 版本問(wèn)世,才得到大規(guī)模應(yīng)用。TLS(Transport Layer Security) 是 SSL 的升級(jí)版,目前主流瀏覽器都已經(jīng)實(shí)現(xiàn)了 TLS1.2 的支持。
2. TLS 握手
SSL/TLS 協(xié)議的基本思路是:
- 客戶端向服務(wù)器索要并驗(yàn)證公鑰
- 雙方協(xié)商生成“對(duì)話秘鑰”
- 雙方采用“對(duì)話秘鑰”進(jìn)行加密通信
生成“對(duì)話秘鑰”的過(guò)程就是“握手”,握手是TLS協(xié)議中最精密復(fù)雜的部分。在這個(gè)過(guò)程中,通信雙方協(xié)商連接參數(shù),并且完成身份驗(yàn)證。一次完整的握手通常包含如下流程:
下面結(jié)合 WireShark 抓包分析上圖中每一步傳遞的信息。WireShark 的使用方法在此不做介紹,如果不了解,可以通過(guò) 一站式學(xué)習(xí) Wireshark學(xué)習(xí)它的基本用法。抓包步驟:
- 打開(kāi) Wireshark
- 在瀏覽器中打開(kāi) 百度,拿到 ip 地址,我是通過(guò) chrome 的一個(gè)插件取得 ip 地址的。
- 在 Wireshark 中過(guò)濾出百度的數(shù)據(jù)包。
2.1 Client Hello
這條消息將客戶端的功能和首選項(xiàng)傳送給服務(wù)器。
- version: 協(xié)議版本。
- Random: 隨機(jī)數(shù),在握手時(shí),客戶端和服務(wù)器都會(huì)提供隨機(jī)數(shù)。這種隨機(jī)性對(duì)每次握手都是獨(dú)一無(wú)二的,在 身份驗(yàn)證中起著舉足輕重的作用。它可以防止重放攻擊,并確認(rèn)初始數(shù)據(jù)交換的完整性。
- Session: 第一次連接時(shí),session ID 是空的,表示客戶端不希望恢復(fù)某個(gè)已存在的會(huì)話,在后面的連接中,服務(wù)器可以借助會(huì)話 ID 在自己的緩存在找到對(duì)應(yīng)的會(huì)話狀態(tài)。
- Cipher Suites: 密碼套件,此列表中包含了客戶端支持所有密碼套件,我的瀏覽器支持 14 個(gè)。
- Compression Methods: 壓縮方法
- Extensions: 擴(kuò)展會(huì)攜帶額外數(shù)據(jù)
2.2 Sever Hello
Server Hello消息的意義是將服務(wù)器選擇的連接參數(shù)傳送回客戶端。消息的結(jié)構(gòu)與 Client Hello 相似,只是每個(gè)字段只包含一個(gè)選項(xiàng)。
2.3 Certificate
Certificate 消息用于攜帶服務(wù)器 X.509 證書(shū)鏈,圖中有兩個(gè)證書(shū),第一個(gè)是域名為:baidu.com 的證書(shū),第二個(gè)是 CA 證書(shū),用于驗(yàn)證第一個(gè)證書(shū)的正確性。那如何驗(yàn)證第二個(gè) CA 證書(shū)是否被篡改過(guò)呢?那就要使用瀏覽器內(nèi)置的根證書(shū)去驗(yàn)證它了。
2.4 Server Key Exchange
ServerKeyExchange消息的目的是攜帶密鑰交換的額外數(shù)據(jù)。消息內(nèi)容對(duì)于不同的協(xié)商算法套件都會(huì)存在差異。這里傳回了 Diffie-Hellman 密鑰交換算法的參數(shù),如果是使用 RSA 加密算,這一步服務(wù)器會(huì)傳一個(gè)隨機(jī)數(shù)給客戶端。
2.5 Server Hello Done
ServerHelloDone消息表明服務(wù)器已經(jīng)將所有預(yù)計(jì)的握手消息發(fā)送完畢。在此之后,服務(wù)器會(huì) 等待客戶端發(fā)送消息。
2.6 Client Key Exchange
ClientKeyExchange消息攜帶客戶端為密鑰交換提供的所有信息。這里向服務(wù)器傳送了 Diffie-Hellman 算法的另一個(gè)參數(shù)。如果使用了 RSA 加密算法,客戶端會(huì)使用服務(wù)器的公鑰加密一個(gè)隨機(jī)數(shù)傳給服務(wù)器,服務(wù)器收到后使用私鑰解密。
2.7 Change Cipher Spec
ChangeCipherSpec 消息表明發(fā)送端已取得用以生成連接參數(shù)的足夠信息,已經(jīng)生成加密秘鑰,并且將切換到加密模式。客戶端和服務(wù)器在條件成熟時(shí)都會(huì)發(fā)送這個(gè)消息。這條消息有時(shí)會(huì)與 Client Key Exchange 消息一起發(fā)出,如上圖所示。
2.8 Finished
Finished 消息意味著握手已經(jīng)完成。消息內(nèi)容將加密,以便雙方可以安全地交換驗(yàn)證整個(gè)握 手完整性所需的數(shù)據(jù)。
3. 數(shù)字證書(shū)
解決什么問(wèn)題?
客戶端與服務(wù)器握手過(guò)程中,服務(wù)器向客戶端傳遞公鑰,客戶端如何判斷這個(gè)公鑰是可信賴的,不是別人偽造的呢?就是通過(guò)數(shù)字證書(shū)。
數(shù)字證書(shū)是一個(gè)包含公鑰、訂閱人相關(guān)信息以及證書(shū)頒發(fā)者數(shù)字簽名的數(shù)字文件,也就是一個(gè)讓我們可以交換、存儲(chǔ)和使用公鑰的殼。
數(shù)字證書(shū)通常包含如下結(jié)構(gòu):
- 版本: 有 0、1、2 三個(gè)編號(hào),分別表示版本 1、2、3,現(xiàn)在大部分證書(shū)都采用版本 3 的格式。
- 序列號(hào):每個(gè) CA 用來(lái)唯一標(biāo)識(shí)其所簽發(fā)的證書(shū)
- 簽名算法:這個(gè)字段指明證書(shū)簽名所用的算法,需要放到證書(shū)里面,這樣才能被證書(shū)簽名保護(hù)。
- 有效期:證書(shū)的有效期包括開(kāi)始日期和結(jié)束日期,在這段時(shí)間內(nèi)證書(shū)是有效的。
- 公鑰:包括公鑰的加密算法、公鑰本身、公鑰的簽名。
光有證書(shū)還不夠,證書(shū)無(wú)法證明自己是可信賴的。好比你要證明自己是個(gè)好人,自己說(shuō)自己是好人是沒(méi)用的,需要到派出所開(kāi)一個(gè) “無(wú)犯罪記錄” 的證明,因?yàn)榕沙鏊菣?quán)威機(jī)構(gòu),它可以證明你是好人。服務(wù)器需要提供證書(shū)鏈,證書(shū)鏈中包含中間 CA 證書(shū),中間 CA 證書(shū)可以驗(yàn)證服務(wù)器證書(shū)的有效性。那誰(shuí)來(lái)證明 CA 證書(shū)的有效性呢?瀏覽器中已經(jīng)內(nèi)置了一些根 CA 證書(shū),中間 CA 證書(shū)由根 CA 證書(shū)簽發(fā),根 CA 證書(shū)可以驗(yàn)證 中間 CA 證書(shū)的有效性。
2.3 節(jié)圖中百度服務(wù)器發(fā)來(lái)的證書(shū)鏈中包含了一個(gè)域名為 baidu.com
的實(shí)體證書(shū)以及簽發(fā)改實(shí)體證書(shū)的中間 CA 證書(shū)。