HTTP 與 HTTPS 協議分析

萬維網客戶程序與萬維網服務器程序之間的交互遵照嚴格的協議,這就是超文本傳輸協議 HTTP(HyperText Transfer Protocol)。HTTP 是一個應用層協議,它使用 TCP 鏈接進行可靠的傳送。算法

安全套接字層 SSL(Secure Socket Layer) 和運輸層安全 TLS(Transport Layer Security)是如今普遍使用的兩個安全協議,做用在端系統應用層的 HTTP 和運輸層之間,在 TCP 之上創建起一個安全通道,爲經過 TCP 傳輸的應用層數據提供安全保障。安全

超文本傳輸安全協議 HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)在 HTTP 的基礎上加入 SSL 層,經過傳輸加密和身份認證保證了傳輸過程的安全性。服務器

本次實驗使用 Wireshark 報文分析軟件,分別經過分析 HTTP 和 HTTPS 協議的交互過程和報文內容,研究兩者的工做原理及異同之處。session

HTTP 協議分析

HTTP 協議使用了面向鏈接的 TCP 協議做爲運輸層協議,保證了數據的可靠傳輸。具體來講,HTTP 協議首先要和服務器創建 TCP 鏈接,這須要使用三報文握手。當創建 TCP 鏈接的三報文握手的前兩部分完成後,萬維網客戶就把 HTTP 請求報文,做爲創建 TCP 鏈接的三報文握手中的第三個報文的數據,發送給萬維網服務器。服務器收到 HTTP 請求報文後,就把所請求的文檔做爲響應報文返回給客戶。dom

創建 TCP 鏈接

咱們首先經過實驗驗證創建鏈接的過程。這裏咱們選擇一個使用 HTTP 協議的網站「C語言中文網」( http://c.biancheng.net/ )進行訪問,而後在 Wireshark 軟件中過濾出涉及該網站 IP 地址的報文。tcp

1

從圖中能夠清楚地看到創建 TCP 鏈接的三個報文:客戶端發出的鏈接請求報文中 SYN=1,服務器發出的確認報文中 SYN=1 且 ACK=1,最後客戶端發出的確認報文中 ACK=1。網站

分析 HTTP 報文

TCP 鏈接創建成功後,客戶端就會發送 HTTP 請求報文,服務器收到後也發回了響應報文,以下圖所示。ui

2

能夠看到,請求報文中包含方法、URL、版本等字段,而響應報文中包含狀態碼、實體主體等字段。加密

值得注意的是,報文中傳輸的數據都是以明文顯示的。爲了更加清楚地說明這一點,咱們能夠在該網站上註冊一個帳號並登陸,而後分析與登陸操做相關的報文。.net

3

咱們找到提交登陸表單的報文,這條報文使用了 POST 方法,將用戶登陸所需的認證信息發送給服務器。能夠清楚地看到,報文中包含明文的 username 和 password 字段,顯然這是不安全的。

HTTPS 協議分析

爲了解決上述問題,使傳輸的過程更加安全,HTTPS 利用 SSL 層對會話進行加密,並提供身份認證和消息認證等安全服務。具體來講,在創建 TCP 鏈接以後,客戶端與服務器先進行握手協議,完成加密算法的協商和會話密鑰的傳遞,而後進行安全數據傳輸。

下面經過分析訪問 HTTPS 網站時的報文截獲狀況,重點研究握手的過程。這裏以百度( https://www.baidu.com/ )爲例。

4

從圖中能夠大體總結出握手的基本流程:

  1. 客戶端 -> 服務器:Client Hello
  2. 客戶端 <- 服務器:Server Hello
  3. 客戶端 <- 服務器:Certificate
  4. 客戶端 <- 服務器:Server Key Exchange, Server Hello Done
  5. 客戶端 -> 服務器:Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
  6. 客戶端 <- 服務器:Change Cipher Spec, Encrypted Handshake Message

下面咱們詳細分析每一步中報文的具體內容。

1. Client Hello

Client Hello 用於首次鏈接服務器時,或響應服務器發送的 Hello Request,或主動發送,以便從新協商鏈接中的安全參數。報文中攜帶了 TLS 協議版本號(Version)、一個隨機數(Random)、客戶端支持的加密套件(Cipher Suites)、壓縮算法(Compression Methods)等。

5

2. Server Hello

該類型的消息用於響應 Client Hello 消息。若是服務器找到一組能夠接受的算法套件時,則回覆此消息,不然響應握手失敗的警報。這裏服務器返回協商的信息,肯定了使用哪一種加密套件和壓縮方法等。此外,服務器也生成了一個隨機數。

6

3. Certificate

該消息緊跟在 Server Hello 消息後,用於向客戶端下發證書。能夠看到證書的類型是 X.509v3。

7

4. Server Key Exchange, Server Hello Done

此消息在 Certificate 消息後當即發送,包含 Diffie-Hellman 算法的相關參數,以及服務器使用該祕鑰交換算法所計算出來的公鑰。此外,服務器爲了證實此消息是真實可靠的,須要使用本身證書的私鑰,並從 Client Hello 中提供的擴展 signature_algorithms 裏選擇合適的摘要和簽名算法,對參數進行簽名。

傳遞完這些參數以後,服務器發送 Server Hello Done,表示已經把支持祕鑰交換的消息發送完成,而後等待客戶端響應。

8

5. Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message

客戶端根據上一步服務器傳來的公鑰,生成預主密鑰(pre-master key),而後經過 Client Key Exchange 將其傳給服務器。服務器用本身的私鑰解出這個預主密鑰的信息,獲得第三個隨機數。到目前爲止,客戶端和服務器都擁有了三個隨機數。因而兩邊根據這三個隨機數以及 D-H 算法的相關參數生成一個會話密鑰(session key),後續就使用這個密鑰進行通訊。

Change Cipher Spec 用於通知服務器後續的通信數據將在新協商的祕鑰規範保護下交換。

Encrypted Handshake Message 是客戶端將前面的握手消息生成摘要再用協商好的祕鑰加密獲得的,這是客戶端發出的第一條加密消息。服務端接收後會用祕鑰解密,能解出來講明前面協商出來的祕鑰是一致的。

9

6. Change Cipher Spec, Encrypted Handshake Message

同上,若是服務器經過 D-H 算法可以解密摘要,那麼應該告知客戶端協商的會話密鑰是一致的。

10

至此,握手的過程就算結束了,這之後的數據都會經過創建好的加密信道進行傳輸。

11

能夠看到,Application Data 報文中的數據都是通過加密的,在必定程度上保證了通訊的安全。

HTTP 與 HTTPS 的區別

  • HTTP 以明文傳輸,安全性較差;HTTPS 的傳輸過程是加密的,安全性較好。
  • HTTP 使用 80 端口;HTTPS 使用 443 端口。
  • HTTP 使用 TCP 三次握手創建鏈接,客戶端和服務器須要交換 3 個包;HTTPS 除了 TCP 的 3 個包,還要加上 SSL 握手須要的 9 個包,因此一共是 12 個包。正由於此,HTTPS 比 HTTP 須要更大的開銷,頁面響應速度也相對慢一些。
  • 使用 HTTPS 協議須要向數字證書認證機構 CA(Certificate Authority)申請證書。通常免費證書較少,於是須要必定費用。
相關文章
相關標籤/搜索