1. 程式人生 > >SSL握手過程例項分析

SSL握手過程例項分析

為了更好理解SSL協議的握手過程,結合例項,使用Wireshark抓包分析SSL握手過程中客戶端與伺服器間的互動過程。本例中伺服器為https://www.baidu.com/(180.97.33.108),客戶端為本機瀏覽器(192.168.0.109)。

本例項中只有客戶端驗證服務端,服務端並沒有對客戶端進行驗證,一般相互進行身份認證的情況在登入銀行系統時會用到。

0x01 第一階段

  客戶端瀏覽器向伺服器發起TCP連線請求,建立起TCP連線後,客戶端向伺服器傳送Client Hello訊息,傳送客戶端支援的最高 SSL 協議的版本號、隨機數、加密演算法列表,以及其他所需資訊。Client Hello訊息的內容如下圖所示:

這裡寫圖片描述

  通過上圖可以知道Client Hello訊息結構如下:

這裡寫圖片描述

  Cipher Suits欄位是一個列舉型別,說明了客戶端所支援演算法,每個Cipher Suit指定了一個加密組合,如下圖所示:


  伺服器收到客戶端建立SSL連線的請求後,通過傳送Server Hello訊息向客戶端傳送SSL 協議的版本號、隨機數、會話ID、加密演算法的種類以及其他相關資訊。訊息內容如下:


   通過上圖可知Server Hello訊息結構如圖所示:

Randon:由隨機種子gmt_unix_time使用偽隨機數函式(PRF)生成的32位元組隨機數。
session ID

:如果沒有建立過連線則對應值為空,不為空則說明之前建立過對應的連線並快取。
Cipher Suite:指定了服務端選定的加密組合,這裡選出的加密組合是TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,ECDHE_RSA作為金鑰交換演算法。128位的AES分組加密演算法,SHA作為訊息摘要演算法。
Compress Method:記錄層接收高層協議的資料時使用的壓縮演算法,這裡沒有使用壓縮演算法,所以是null。

0x02 第二階段

  伺服器向客戶端傳送包含其證書的Certificate訊息。證書中所攜帶伺服器的公鑰,用於加密後面訊息中預主金鑰。訊息內容如下:

這裡寫圖片描述


  從圖中可以看到,伺服器實際上傳送的是一條證書鏈,包含從伺服器證書到其根證書總共3個證書,證書所有者分別是VeriSign、Symantec和baidu。其中伺服器證書內容如下:


   從圖中可以看到證書的各欄位資訊,包括證書版本號(v3)、證書序列號(0x1ccf7afd633940916d36edd8cca483dc)、證書籤名演算法、頒發者資訊(Symantec)和證書有效期(‎2015‎年‎9‎月‎17‎日 8:00:00至‎2016‎年‎9‎月‎1‎日 7:59:59)。


  接下來還包括證書持有者(baidu.com…)、證書公鑰資訊(30 82 01 0a 02 82 01 01 00 a8 72 cf eb 76 51 bb…)、擴充套件欄位(持有者備用名稱、基本約束、金鑰用法、增強型金鑰用法、證書策略、頒發機構金鑰識別符號、CRL分發點、頒發機構資訊訪問),最後是證書的簽名演算法(SHA-256 RSA加密)和證書的簽名值(76 af 46 03 3b bd d8 9f 3e 2b 62 48 dd 8d 89 32 07 49 20 …)。






  通過以上分析可知證書結構如下圖所示:

0x03 第三階段與第四階段

  伺服器傳送完Certificate訊息後繼續傳送Server Key Exchange和Server Hello Done訊息,Server Key Exchange訊息中包含有金鑰交換演算法所需要的額外引數。Server Hello Done訊息表示伺服器已傳送完此階段的全部資訊。

這裡寫圖片描述

  客戶端傳送Client Key Exchange和Change Cipher Spec訊息,Client Key Exchange包含使用伺服器RSA公鑰加密過的隨機數Pre_Master_Secret,該引數用於後續生成主金鑰;Change Cipher Spec訊息告訴伺服器,接下來的訊息將採用新協商的加密套件和金鑰進行通訊,並通知客戶端到伺服器的握手過程結束。

這裡寫圖片描述

  接著伺服器同樣傳送Change Cipher Spe訊息通知伺服器到客戶端的握手過程結束,併發送一個加密的握手資料Encrypted Handshake Message 訊息,客戶端收到訊息解密後進行驗證,驗證通過則說明握手過程中的資料沒有被篡改過,也說明伺服器是之前交換證書的持有者。現在雙方就可以開始加密通訊。

這裡寫圖片描述