https與TLS/SSL 握手協議、record protocol簡介

爬蜥發表於2019-05-04

https即 HTTP Secure,HTTP的通訊介面部分用SSL和TLS協議代替,並非是一種新的協議。

https與TLS/SSL 握手協議、record protocol簡介

TLS協議是在SSL3.0的基礎上開發的協議,以下統一用TLS協議來說明

http的問題

  • 通訊使用明文,內容被竊聽後存在安全問題
  • 不驗證通訊方的身份,可能遭到偽裝
  • 無法驗證報文的完整性,內容可能遭到篡改

http問題解決思路

明文不行,考慮先加密再傳輸呢?比如我傳輸過程中使用一種加密演算法,在瀏覽器端自己加密和解密,服務端也提供對應的策略來加密和解密。前端程式碼基本屬於完全暴露在所有人的面前,這種自己實現加密和解密的機制都會被別人知曉(祕鑰都會被看到),毫無安全性可言,另外如果每個人都要這麼搞一套,那就是重複造輪子,時間成本巨大,而且還不一定能做到很安全。

當然還包括效能、相容性等等問題。

通訊加密祕鑰的安全性問題

祕鑰肯定不能硬編碼寫到程式碼中,一種解決方式是在每次通訊的過程中先生成祕鑰,然後的資訊再用這個祕鑰進行加密通訊,但是初次傳輸過程中,仍然會出現明文傳輸祕鑰的問題,一旦被竊聽,後續所有的加密都都白費

初次祕鑰傳輸的問題

密碼學中的非對稱加密可以解決這種場景,非對稱加密擁有兩個祕鑰:公鑰和私鑰。公鑰可以解開私鑰加密的內容,私鑰可以解開公鑰加密的內容,那麼只要私鑰不洩密,通過公鑰加密的內容就算被擷取,現有的技術手段,是很難通過擷取的內容和公鑰得到原有的內容

公鑰能否信任

如果獲取的公鑰是竊聽人的公鑰,而不是真正服務提供方的公鑰,那麼後續的通訊加密都是使用的竊聽人的公鑰,竊聽人也自然使用自己的私鑰可以進行解密。因此獲取的公鑰必須是能夠信任的。
解決方式是把公鑰放到數字證書中,這個證書由受信任的第三方機構進行頒發,並通過三方的私鑰進行加密。客戶端發起請求首先會向服務端請求三方的證書,客戶端通過三方的公鑰進行解密後,就安全拿到了服務端的公鑰。

第三方的公鑰本身則是由瀏覽器和作業系統自己去維護

證書被替換的風險

竊聽人也可以自己去申請個證書,放上自己的公鑰,這樣客戶端同樣也可以通過三方的公鑰解密,但是解密出來的卻是竊聽人的公鑰。 解決方式是使用數字簽名,證書上涵蓋如何根據證書來生成數字簽名的方法,與通過第三方機構的公鑰解析到數字簽名想比較,驗證數字簽名是否一樣,一樣則表明證書確是要訪問的服務的。

比如證書上會寫所代表的網站,校驗的時候加上訪問的網站,就可以得到對應的資訊

https的通訊過程

https是建立在TLS協議之上的,它的通訊過程也是以TLS為基礎。首先進行"握手",通過之後再進行通訊

TLS握手協議概述

https與TLS/SSL 握手協議、record protocol簡介

  1. 客戶端傳送 ClientHello 資訊,包含

    • 一個隨機數
    • 客戶端所支援的協議版本
    • 客戶端支援的對稱加密演算法
    • key_share(表明使用Diffie-Hellman) 或者是 pre_shared_key 或者這兩者都有
  2. 服務端收到 ClientHello 之後,返回一個 ServerHello 資訊,包含:

    • 協議的版本,比如TLS1.3
    • 一個隨機數
    • 使用的加密演算法
    • 如果決定使用 (EC)DHE key,那麼會包含 "key_share" ;如果使用 PSK key,就會包含 "pre_shared_key"
  3. 服務端傳送證書

    如果客戶端也需要驗證,會再傳送一個要證書的請求給客戶端

  4. 服務端傳送 Server Hello Done 給客戶端,表示Server Hello結束

    如果客戶端收到了證書請求,會先傳送客戶端證書

  5. 客戶端對伺服器的證書進行校驗,沒通過則傳送警告給使用者,確認是否繼續,通過則返回 Pre master secret(這也是客戶端產生的一個隨機數),這個 Pre master secret 本身會使用證書中的公鑰進行加密

  6. 客戶端傳送 Change Cipher Spec 報文,表示後續通訊都會採用雙方商定的加密方法和祕鑰傳送。

  7. 客戶端會根據之前傳遞的隨機數(2個)以及 Pre master secret 這三個隨機數生成一個master_ key,然後從master_key中提取會話用的祕鑰,用它加密一段內容,涵蓋在這裡客戶端傳送Finished報文中,表示客戶端握手階段結束同時也用來校驗加密通道

  8. 伺服器傳送 Change Cipher Spec ,表示服務端也切換到位

  9. 服務端拿到公鑰加密後的 Pre master secret 後,通過私鑰解密,使用與客戶端相同的方法,以及步驟7中的3個隨機數,生成會話用的祕鑰,使用這個加密祕鑰傳送一個Finished報文給客戶端,驗證加密通道,同時服務端握手結束

客戶端和服務端都能對Finished資訊正常解密且訊息被驗證,說明通道建立,後續通過上面產生的會話祕鑰對資料進行加密傳輸

非對稱加密與對稱加密的混合使用

握手過程中,有一個隨機數是使用非對稱祕鑰加密後傳輸的,傳輸成功之後,二者生成的最後一個會話祕鑰用來通話,這是因為非對稱祕鑰加密和解密處理速度相對對稱祕鑰要慢,因此僅在握手階段使用非對稱祕鑰傳遞,通訊的時候使用握手階段生成的會話祕鑰進行加密

3個隨機數

在握手的階段首先是客戶端隨機生成了一個隨機數,這是明文傳輸的,接著服務端返回了一個隨機數,也是明文傳輸的,最後客戶端使用了一個pre_master_key通過非對稱加密的方式加密傳輸的,為什麼用到了3個隨機數再經過計算得到一個master_key,然後才提取會話key?

首先說一下 pre_master_key,在握手的過程中,會先約定好到底使用按個 Cipher Suit,比如約定使用RSA或者是(EC)DH suites 【(elliptic curve) Diffie-Hellman】,RSA會傳送一個隨機的48位元組的 pre_master_key給服務端,但是 (EC)DH卻不是,它產生的可能比48位元組要長,也有可能要短,而且分佈並不均衡。雖然通過RSA或者是(EC)DH是保證了pre_master_key本身的保密性,但是根據情況的不同,產生的祕鑰格長度(格式)不一致,而多數情況下,保持一樣長度的祕鑰會有很好的結果,比如一樣的長度允許將祕鑰交換端與加密端區分開來(打個比方,不能根據長度猜到到底是用的那個非對稱演算法),某種程度上來說也就具備更好的隨機性。因而最好處理下pre_master_key保證最終輸出的key的一致性

另外從安全性考慮,pre_master_key一旦使用後需要刪掉

而對於產生pre_master_key的演算法對於rsa來說每次是隨機的,但是對於dh,包括ecdh演算法(不考慮匿名dh和瞬時dh),就只有hello訊息中的兩個隨機數因子了。但是ssl協議本身並不信任每個主機都能產生完全隨機的數字,如果隨機數不隨機,被猜出來就不合適了,因此選用3個隨機數來達到更好的隨機效果

隨機帶來的好處一個是當前的通訊不容易被才出來,另外每次都會不一樣,就是說就算當前的被才出來了,歷史上的也無法解出正確的密文(也叫前向保護)。
最終通過PRF演算法計算出一個固定長度為48位元組的master_key,從中再提取出對應的會話key,提取規則如下:

 client_write_MAC_key[SecurityParameters.mac_key_length]
      server_write_MAC_key[SecurityParameters.mac_key_length]
      client_write_key[SecurityParameters.enc_key_length]  //會話key
      server_write_key[SecurityParameters.enc_key_length] //會話key
      client_write_IV[SecurityParameters.fixed_iv_length]
      server_write_IV[SecurityParameters.fixed_iv_length]
複製程式碼

TLS的資料傳送 - Record Protocol

record protocol負責資料的傳送,它會把資料分割成可處理的幾塊(每塊2的14方位元組或者更少),然後進行壓縮,新增MAC(用於校驗資料的完整性),加密,然後扔給底層的協議去處理;接收方則是進行資料的解密,校驗,解壓縮和重新聚合,再傳送給上層的協議

HTTPS能夠被信任的前提

  • 瀏覽器正確的實現了HTTPS且作業系統中安裝了正確且受信任的證書頒發機構(想想盜版的作業系統==)
  • 證書頒發機構僅信任合法的網站
  • 被訪問的網站提供了有效的證書,即這個證書是由作業系統信任的證書機構簽發的
  • 證書正確的驗證了被訪問的網站
  • 協議的加密層能夠有效的提供認證和高強度的加密

引用

rfc1.2中關於record protocol部分
rfc1.2中關於master_key計算與會話key提取
Diffie-Hellman運作
3個隨機數的意義-來自csdn dog250
pre_master_key討論
master_key,session_key,pre_master_key的解釋
數字簽名簡介
也許這樣理解https更容易
討論http加密資料和使用https詳情戳這裡
SSL/TLS原理詳解
HTTPS被信任
圖解HTTP

相關文章