簡(jiǎn)單抓了個(gè)HTTPS包,過了一遍流程。不涉及具體技術(shù)細(xì)節(jié)。
幾項(xiàng)關(guān)鍵技術(shù)的簡(jiǎn)單說明,詳見這篇筆記:
HTTPS簡(jiǎn)單來說,就是使用SSL對(duì)HTTP報(bào)文進(jìn)行加密傳輸。
SSL(Secure Sockets Layer 安全套接層),及其繼任者傳輸層安全(Transport Layer Security,TLS)是為網(wǎng)絡(luò)通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議。TLS與SSL在傳輸層對(duì)網(wǎng)絡(luò)連接進(jìn)行加密。
一、密文解析方法:
HTTPS報(bào)文本身是加密的,wireshark也無法解析。因此需要將HTTPS生成的隨機(jī)數(shù)(premaster-secret)提供給wireshark,wireshark才能正確解讀密文。
具體配置方法(WINDOWS):
建立path變量 SSLKEYLOGFILE=c:\ssl.key
重啟firefox/chrome,訪問https網(wǎng)站會(huì)自動(dòng)生成ssl session key
在wireshark中配置:編輯-首選項(xiàng)-Protocol-SSL-(Pre)-Master-Secret log filename 設(shè)置為之前配置的ssl.key文件,即可解密抓到的SSL密文
二、準(zhǔn)備過程(DNS、TCP與302跳轉(zhuǎn)):
在電腦瀏覽器輸入
,此時(shí)請(qǐng)求的是HTTP報(bào)文。
2.1 DNS解析:獲得baidu網(wǎng)站IP地址
2.2 TCP建立連接:HTTP服務(wù)基于TCP連接,根據(jù)前述DNS解析結(jié)果建立連接。
2.3 HTTP請(qǐng)求與響應(yīng):可見,服務(wù)器響應(yīng)了一個(gè)302 Moved Temporarily 重定向報(bào)文,定向到 https://www.baidu.com,接下來進(jìn)入HTTPS報(bào)文請(qǐng)求環(huán)節(jié)。
三、SSL/TLS報(bào)文交互(即HTTPS如何通過非對(duì)稱算法得到一個(gè)對(duì)稱密鑰用于加密)
注:此處發(fā)生了一次亂序,導(dǎo)致了一次SACK確認(rèn),181與180行的先后順序顛倒了。
下圖為TLS/SSL報(bào)文交互流程示意圖。
Client Server ClientHello (empty SessionTicket extension)--------> ServerHello (empty SessionTicket extension) Certificate* ServerKeyExchange* CertificateRequest* <-------- ServerHelloDone Certificate* ClientKeyExchange CertificateVerify* [ChangeCipherSpec] Finished --------> NewSessionTicket [ChangeCipherSpec] <-------- Finished Application Data <-------> Application Data
其中ServerKeyExchange為DH算法專有(RSA算法則無)
175報(bào)文:用戶端發(fā)起Client Hello,攜帶版本信息與random數(shù)(客戶端),并在Cipher Suites中提供了所有可用的加密協(xié)議。
由于之前未建立過連接,攜帶length為0的Session id,表明期待一個(gè)SessionTicket
179,181報(bào)文:服務(wù)器端答復(fù)Server Hello,選定加密協(xié)議(本次抓包為ECDH),并傳遞自己的certificate給客戶端。
以baidu為例:其證書中最重要的兩部分內(nèi)容就是公鑰與數(shù)字簽名。其中數(shù)字簽名,即確保該certificate為真百度網(wǎng)站所提供的證書。公鑰,則用于與百度網(wǎng)址進(jìn)行RSA不對(duì)稱算法的數(shù)據(jù)交互,生成可靠密鑰。
180: 服務(wù)器端發(fā)送Server Key Exchange與Server Hello Done
Server Key Exchange發(fā)送了DH算法中的Kb值,并使用RSA簽名方式進(jìn)行了簽名確保身份。(如果使用RSA則無此報(bào)文)。
Server Hello Done則表明Server端的報(bào)文已結(jié)束。
至此,Server已經(jīng)提供了證書、公鑰、Kb,并發(fā)送Hello Done進(jìn)行確認(rèn)。如果Server端需要驗(yàn)證Client端的身份,則需在發(fā)送Hello Done前發(fā)起Certificate Request,Client端就會(huì)類似Server端一樣,發(fā)送證書以及Client公鑰(一般Client端的證書與公鑰主要通過U盾模式提供,用于安全要求較高的網(wǎng)銀等場(chǎng)景)。
184:客戶端答復(fù)Client key Exchange,Change Cipher Spec Protocol,F(xiàn)inished
Client Exchange即DH算法中的Kb(由于不驗(yàn)證Client端身份,所以Client不需要傳遞Signature)。
Change Cipher Spec代表Client已經(jīng)完成了全部協(xié)商,接下來的數(shù)據(jù)包將使用TLS進(jìn)行封裝傳輸。
Finished:最后發(fā)送finish報(bào)文表示結(jié)束。
------至此雙方已經(jīng)交互了所有的DH算法所需的參數(shù),均可計(jì)算得出對(duì)稱密鑰s。------
187:服務(wù)器端答復(fù)New Session Ticket,Change Cipher Spec Protocol,F(xiàn)inished
Session Ticket用于TLS中斷后重新接續(xù)Session
Change Cipher Spec 代表Server端告知Client接下來的報(bào)文將使用TLS加密進(jìn)行傳輸
Finished表示TLS連接建立過程結(jié)束
四、HTTPS報(bào)文傳輸
在發(fā)送Change Cipher Spec與Finished報(bào)文后,客戶端即向服務(wù)器端發(fā)送加密的HTTP over TLS 報(bào)文;
服務(wù)器端在發(fā)送Change Cipher Spec與Finished報(bào)文后,同樣使用HTTP over TLS應(yīng)答HTTP 200 OK報(bào)文。
使用前述抓包方法可以在wireshark中解開加密的字符串,看到其中的密文:HTTP 200 OK響應(yīng)報(bào)文
注:wireshark用于解密HTTPS報(bào)文的本地key,應(yīng)該是指本地生成的隨機(jī)數(shù)(RSA中的premaster隨機(jī)數(shù)或DH中的a隨機(jī)數(shù)),而非RSA公鑰/私鑰