Https連接建立過程

Https的全稱是Http over SSL,而SSL是在TCP協議之上的保密層,但是它也是屬於傳輸層的,如果直接傳輸Http,報文的信息安全是無法被保障的,因爲它在應用層的信息傳輸是明文傳輸的。

過程

Https傳輸建立的過程可以分爲兩個過程,信任建立的過程和連接建立的過程,如果再細分可以分爲九個步驟,分別是:

  1. Client Hello
  2. Server Hello
  3. 服務端向客戶端發送CA證書
  4. 客服端發送Pre-master Secret
  5. 客戶端發送消息:將使用加密通信
  6. 客戶端發送:Finished
  7. 服務器發送消息:將使用加密通信
  8. 服務端發送:Finished
  9. 連接正式建立,發送正式報文

Client Hello

https1.PNG

客戶端首先會給服務器發送Client Hello, Client Hello中主要包含了以下這幾個消息:

  • 客戶端可以使用的SSL/TLS版本
  • Ciper Suites
  • 服務器名稱
  • 客戶端隨機數

其中Ciper Suites其實就是Ciper Suite的集合,也就是說Ciper Suites包含了一個或多個Ciper Suite,那麼Ciper Suite到底是什麼呢?其實就是對稱加密算法,非對稱加密算法和Hash算法的一個組合,下面就是一個例子

Ciper Suite:AES_RSA_SHA1

Ciper Suites就是幾個Ciper Suite的集合,像這樣:

AES_RSA_SHA1DES_DSA_MD5AES_RSA_MD5

Server Hello

https2.PNG

客戶端收到服務器收到的這一系列消息之後,它會從客戶端發送的Ciper Suites中挑選出一個Ciper Suite和SSL/TLS版本,然後和自己生成的客戶端隨機數一起發送給客戶端,就是這幾個部分:

  • 服務器挑選出的SSL/TLS版本
  • 服務端挑選出的Ciper Suite
  • 服務端隨機數

服務端CA證書驗證

https3.PNG

服務端得向客戶端證明自己就是剛剛客戶端發送消息的那個服務器,而CA證書裏面就包含了這樣的信息,需要注意的是,服務端發送給客戶端的證書包含的信息並不只是證書本身,也包含了給它發證的簽發機構的信息。證書包含的信息大概如下:

  • 本身信息
    • 證書信息(域名等)
    • 證書公鑰
    • 證書籤名算法
    • 證書籤名
  • 簽發機構證書信息
    • 證書信息
    • 簽發機構公鑰
    • 簽發機構簽名算法
    • 簽發機構的簽發機構

驗證證書的過程是這樣的:

  1. 證書對自身的證書信息使用證書的簽名算法做一個Hash
  2. 利用簽發機構的公鑰去對步驟1得到的信息做一次驗證,如果驗證成功則說明CA證書本身的信息是可信賴的,但簽發機構自身還需要驗證自己是可信賴但
  3. 用客戶端自身的證書公鑰去對2得到的信息做驗證,驗證成功則說明證書的簽發機構是可信賴的,服務端與客戶端的信任就建立起來了,如果驗證失敗則需要進行提示,如是否信任此證書等等

有些機構,如銀行等,可能會對客戶端也做一次驗證,大致過程和服務端驗證相似

客戶端發送Pre-master Secret

https4.PNG

Pre-master Secret是由客戶端通過自身信息算出來的,客戶端將會把Pre-master Secret使用剛剛在證書中獲得的證書公鑰加密後發送給服務器,服務器收到Pre-master後,客戶端和服務器都將協商出一個Master Secret, 因爲客戶端和服務器都擁有 客戶端隨機數、服務器隨機數、Pre-Master Secret,如圖所示

https5.PNG

得到Master Secret之後客戶端和服務器將使用 Ciper Suite和Master Secret一起計算出客戶端密鑰和服務端密鑰以及客戶端MAC Secret和服務器MAC Secret,如圖:

https6.PNG

做完這步之後客戶端和服務器會繼續建立通信

客戶端通知:將使用加密通信

這裏其實僅僅只是發送了一個幾字節的通知而已,客戶端告訴服務器將使用加密通信

https7.PNG

客戶端發送Finished消息

https8.PNG

在這裏客戶端將發送一個Finished消息,這個Finished消息實際上是對上述客戶端與服務端發送的消息的一個彙總,用來使服務器來驗證客戶端是不是剛剛建立信任的客戶端,Finished消息結果了兩步加工:

  1. 使用HMAC對消息進行HASH
  2. 使用客戶端密鑰對消息進行加密

HMAC是在獲得了客戶端MAC Secret和服務端MAC Secret後服務器和客戶端都得到的HASH算法

服務端在收到客戶端發送的Finished消息後將對消息進行驗證,步驟如下:
1. 服務端對之前所有的消息也做一個HMAC
2. 服務端對客戶端發送過來的Finished消息進行解密(因爲服務端也有客戶端密鑰)
3. 服務端對1和2得到的消息進行比對,如果一樣則說明發送消息的客戶端是之前建立起信任的客戶端,將進行之後步驟

服務器發送將使用加密通信和Finished消息

這兩個步驟其實跟前面客戶端發送加密通信和Finished消息是一樣的,所有這裏就略過了

客戶端發送正式的報文

從這個步驟開始客戶端和服務器就開始正式的通信了,從應用層看發送的報文的話只會得到這是一個應用層的消息,具體的消息只能看到類似與亂碼,與Http明文通信對比十分鮮明。

總結

可以用一張圖來概括

https9.PNG

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章