01 引言
成哥在Wireshark系列實(shí)戰(zhàn)案例中,分析過多種網(wǎng)絡(luò)問題,但唯獨(dú)沒有涉及到應(yīng)用層HTTPS協(xié)議的相關(guān)內(nèi)容。
今天通過wireshark捕獲HTTPS數(shù)據(jù)包,來給大家講解一下HTTPS的加解密過程。
我們先從HTTP協(xié)議說起。
02 HTTP協(xié)議
HTTP協(xié)議(超文本傳輸協(xié)議)是一種客戶端與Web服務(wù)器之間進(jìn)行應(yīng)用層通信的協(xié)議,主要用于WWW服務(wù)。
客戶端和web服務(wù)器端的之間通信為明文傳輸,數(shù)據(jù)直接交互,不存在任何安全性。如下圖所示:

通過捕獲HTTP的數(shù)據(jù)包,可以看到HTTP會(huì)話中的Cookie和各種id信息。如下圖所示:

HTTP雖然優(yōu)點(diǎn)眾多,但是其明文傳輸?shù)娜秉c(diǎn),就足以致命。從2017年開始,Chrome 瀏覽器已把采用 HTTP 協(xié)議的網(wǎng)站標(biāo)記為不安全網(wǎng)站,后續(xù)基本所有瀏覽器廠商都做了相同的標(biāo)記。
HTTP協(xié)議的不安全問題,催生了HTTPS協(xié)議的產(chǎn)生。
03 HTTPS協(xié)議
為了增強(qiáng)HTTP協(xié)議的安全性,網(wǎng)景公司設(shè)計(jì)出了能夠?qū)TTP協(xié)議進(jìn)行安全加密的傳輸方法,即在TCP/IP協(xié)議的傳輸層和應(yīng)用層之間新增了一層安全套接層。并將SSL和HTTP協(xié)議相結(jié)合,以實(shí)現(xiàn)安全的HTTP數(shù)據(jù)傳輸。這就是HTTPS協(xié)議,即"HTTP over SSL"或者"HTTP Secure"。
早期SSL是HTTPS使用的標(biāo)準(zhǔn)協(xié)議,之后IETF在SSL 3.0的基礎(chǔ)之SSL進(jìn)行標(biāo)準(zhǔn)化。形成傳輸層安全,即TLS。但它們本質(zhì)上是相同的,我們可以合稱TLS/SSL。
HTTP和HTTPS的區(qū)別如下圖所示:

從圖中可以看出,HTTP協(xié)議和HTTPS協(xié)議主要的差別就是是否存在TLS/SSL層。即HTTPS協(xié)議= HTTP協(xié)議+SSL/TLS協(xié)議,在HTTPS數(shù)據(jù)傳輸?shù)倪^程中,需要用SSL/TLS對(duì)數(shù)據(jù)進(jìn)行加密和解密,然后使用HTTP對(duì)加密后的數(shù)據(jù)進(jìn)行傳輸。
04 密鑰算法
在介紹HTTPS協(xié)議的加解密過程前,先要學(xué)一些密碼學(xué)的知識(shí)。
(1)幾個(gè)基本概念
明文:指的是未經(jīng)過加密的原始數(shù)據(jù)。
密文:通過對(duì)明文進(jìn)行加密操作后得到的數(shù)據(jù)。
密鑰:一種參數(shù),通過在加解密算法中使用該參數(shù),可對(duì)明文進(jìn)行加密,或者對(duì)密文進(jìn)行解密。同時(shí),密鑰分為對(duì)稱密鑰與非對(duì)稱密鑰兩種,分別應(yīng)用在對(duì)稱密鑰算法和非對(duì)稱密鑰算上。
(2)對(duì)稱密鑰算法
使用相同密鑰和算法進(jìn)行加解密運(yùn)算的算法叫做對(duì)稱密鑰算法。示意圖如下所示:

對(duì)稱加密的特點(diǎn)是算法公開、加密和解密速度快,適合于對(duì)大數(shù)據(jù)量進(jìn)行加密。
常見的對(duì)稱加密算法有DES、3DES、TDEA、Blowfish、RC5和IDEA。
(3)非對(duì)稱密鑰算法
非對(duì)稱密鑰算法對(duì)比對(duì)稱密鑰算法,其安全性更好。
使用對(duì)稱密鑰算法通信的雙方使用的是相同的密鑰,如果一方的密鑰遭泄露,那么整個(gè)通信就會(huì)被破解。而非對(duì)稱密鑰算法的雙方兩個(gè)不同的密鑰,即公鑰和私鑰,且二者成對(duì)出現(xiàn)。示意圖如下:

私鑰被自己保存,不能對(duì)外泄露。公鑰指的是公共的密鑰,任何人都可以獲得該密鑰。用公鑰或私鑰中的任何一個(gè)進(jìn)行加密,用另一個(gè)進(jìn)行解密。
非對(duì)稱密鑰算法的主流協(xié)議是RSA,需要給每個(gè)參與者產(chǎn)生一對(duì)密鑰。共享私鑰到服務(wù)器,嚴(yán)格保障私鑰的安全性。
(4)SSL加解密解決方案
SSL加解密過程中同時(shí)使用到對(duì)稱密鑰和非對(duì)稱密鑰。如下圖所示。
加密過程:重要文件使用對(duì)稱密鑰加密(速度快,長(zhǎng)度不增加),形成加密文件。然后使用接收方的公鑰將對(duì)稱密鑰加密,保證對(duì)稱密鑰傳輸時(shí)的安全性。然后將加密文件和加密的對(duì)稱密鑰發(fā)送給接收方。
解密過程:接收方通過私鑰將對(duì)稱密鑰解密,獲得對(duì)稱密鑰,然后對(duì)加密文件進(jìn)行解密,獲取重要文件。
05 HTTPS協(xié)議加解密過程
成哥前文說,HTTPS協(xié)議= HTTP協(xié)議+SSL/TLS協(xié)議。HTTP協(xié)議傳輸過程較為簡(jiǎn)單,這里不做介紹。我們來看看SSL/TLS協(xié)議的加解密過程。
在瀏覽器訪問騰訊網(wǎng),通過wireshark軟件捕獲到的SSL/TLS數(shù)據(jù)包如下,可以看到完整的SSL/TLS加密通信過程,如下圖所示:

對(duì)捕獲到的報(bào)文進(jìn)行整理,形成以下流程圖:

(1)客戶端首先向目標(biāo)網(wǎng)站發(fā)送HTTPS請(qǐng)求,即Client Hello。
該數(shù)據(jù)包中給出了瀏覽器的TLS版本號(hào)、隨機(jī)數(shù)、支持的加密算法等信息。如下圖所示:

(2)服務(wù)器端進(jìn)行應(yīng)答,即Server Hello。
該數(shù)據(jù)包中給出了服務(wù)器使用的TLS版本、隨機(jī)數(shù)、確認(rèn)雙方加密方法等信息。如下圖所示:

(3)服務(wù)器端給出數(shù)字證書和公鑰,即Certificate、Server Key Exchange
該數(shù)據(jù)包中給出了數(shù)字證書以及服務(wù)器公鑰,如下圖所示:

這里要特別說一下客戶端到底 如何來校驗(yàn)對(duì)方發(fā)過來的數(shù)字證書是否有效的?
我們從抓包中看到,服務(wù)器端將服務(wù)器證書、中級(jí)證書、CA證書等一并發(fā)送客戶端。如下圖所示:

(4)客戶端根據(jù)客戶端的公鑰,計(jì)算出另一個(gè)公鑰,發(fā)送回服務(wù)器端,即Client Key Exchange、Change Cipher Spec、Encrypted Handshake Message。
證書校驗(yàn)成功之后,客戶端會(huì)生成一個(gè)隨機(jī)串然后使用服務(wù)器證書的公鑰進(jìn)行加密之后發(fā)送給服務(wù)器。

(5)服務(wù)器開啟New Session Ticket.
服務(wù)器通過使用自己的私鑰解密得到這個(gè)隨機(jī)值。開始使用這個(gè)隨機(jī)值進(jìn)行對(duì)稱加密開始和客戶端進(jìn)行通信。如下圖所示:

06 總結(jié)
成哥今天主要給大家講解了HTTPS協(xié)議的處理過程,重點(diǎn)是介紹HTTPS和wireshark捕獲數(shù)據(jù)包,所以這里沒對(duì)密碼學(xué)的知識(shí)做過多的介紹。之后有機(jī)會(huì)給大家補(bǔ)上。