TLS握手協議

  SSL/TLS基礎html

  SSL(Secure Sockets Layer 安全套接層),及其繼任者-傳輸層安全(Transport Layer Security, TLS)是爲網絡通訊提供安全及數據完整性的一種安全協議。TLS與SSL在傳輸層對網絡鏈接進行加密。SSL技術最初是由瀏覽器開發商Netscape公司率先倡導的,開發過SSL3.0以前的版本。目前主導權已轉移到IETF(Internet Engineering Task Force, Internet工程任務組)的手中。算法

  IETF以SSL3.0爲基準,後又制定了TLS1.0、TLS1.一、TLS1.2。TLS以SSL爲原型開發的協議,有時會統一稱該協議爲SSL。當前主流版本是SSL3.0和TLS1.0。windows

SSL/TLS協議的基本過程:瀏覽器

  • 客戶端向服務端索要並驗證公鑰
  • 雙方協商生成"對話密鑰"
  • 雙方採用"對話密鑰"進行加密通訊

  前兩步又被稱爲"握手階段"(handshake)。握手階段涉及四次通訊,值得注意的是,"握手階段"的全部通訊都是明文的。安全

  

  • 客戶端發出請求(ClientHello)

首先,客戶端(一般是瀏覽器)先向服務器發出加密通訊的請求,這被叫作ClientHello請求。在這個過程當中,客戶端主要向服務器提供如下信息。服務器

  (1). 支持的協議版本,好比TLS1.0.網絡

  (2). 一個客戶端生成的隨機數,稍後用於生成對話密鑰post

  (3). 支持的加密算法網站

  (4). 支持的壓縮算法編碼

這裏須要注意的是,客戶端發送的信息之中不包括服務器的域名。也就是說,理論上服務器只能包含一個網站,不然會分不清應該向客戶端提供哪個網站的數字證書。這就是爲何一般一臺服務器只能有一張數字證書的緣由。 

  • 服務器迴應(SeverHello)

服務器收到客戶端請求後,向客戶端發出迴應,這叫作ServerHello。服務器的迴應包含如下內容:

  (1). 確認使用的加密通訊協議版本,好比TLS 1.0。若是瀏覽器與服務器支持的版本不一致,服務器關閉加密通訊。

  (2). 一個服務器生成的隨機數,稍後用於生成"對話密鑰"。

  (3). 確認使用的加密算法,好比RSA公鑰加密。

  (4). 服務器證書。

除了上面的信息,若是服務器要確認客戶端的身份,就會再包含一項請求,要求客戶端提供"客戶端證書"。好比,金融機構每每只容許認證客戶連入本身的網絡,就會向正式客戶提供USB密鑰,裏面就包含了一張客戶端證書。

  • 客戶端迴應

客戶端收到服務器迴應後,首先驗證服務器證書。若是證書不是可信任機構頒發、或者證書中的域名與實際域名不一致、或者證書已過時,就會向訪問者顯示一個警告,由訪問者自行選擇是否還要繼續通訊。

若是證書沒有問題,客戶端就會從證書中取出服務器的公鑰。而後,向服務器發送下面三項信息:

    (1). 一個隨機數。用於服務器公鑰加密,防止被竊聽

    (2). 編碼改動通知,表示隨後的信息都將用雙方商定的加密算法和密鑰發送

    (3). 客戶端握手結束通知,表示客戶端的握手階段已經結束。這一項同時也是前面發送的全部內容的hash值,用來供服務器校驗

第一項中的隨機數,是整個握手階段出現的第三個隨機數,又稱爲"pre-master key"。有了它之後,客戶端和服務器就同時有了三個隨機數,接着雙方就用事先商定的加密方法,各自生成本次會話所用的同一把"會話密鑰"。

對於握手階段的三個隨機數來生成會話密鑰,可參考dog250的解釋:

       不論是客戶端仍是服務器,都須要隨機數,這樣生成的密鑰纔不會每次都同樣。因爲SSL協議中證書是靜態的,所以十分有必要引入一種隨機因素來保證協商出來的密鑰的隨機性。

       對於RSA密鑰交換算法來講,pre-master-key自己就是一個隨機數,再加上hello消息中的隨機,三個隨機數經過一個密鑰導出器最終導出一個對稱密鑰。

       pre master的存在在於SSL協議不信任每一個主機都能產生徹底隨機的隨機數,若是隨機數不隨機,那麼pre master secret就有可能被猜出來,那麼僅適用pre master secret做爲密鑰就不合適了,所以必須引入新的隨機因素,那麼客戶端和服務器加上pre master secret三個隨機數一同生成的密鑰就不容易被猜出了,一個僞隨機可能徹底不隨機,但是是三個僞隨機就十分接近隨機了,每增長一個自由度,隨機性增長的可不是一。

  • 服務器最後迴應

服務器收到客戶端的第三個隨機數pre-master key以後,計算生成本次會話所用的"會話密鑰"。而後,向客戶端最後發送以下消息:

  (1). 編碼改變通知,表示隨後的信息都將用雙方商定的加密方法和密鑰發送。

  (2). 服務器握手結束通知,表示服務器的握手階段已經結束。這一項同時也是前面發送的全部內容的hash值,用來供客戶端校驗。

至此,整個TLS握手階段所有結束,接下來,客戶端與服務器進入加密通訊,就徹底使用普通的HTTP協議,只不過用"會話密鑰"加密內容。

 

更多信息,請參考:

微軟文檔

The Transport Layer Security (TLS) Protocol v1.2

SSL/TLS協議運行機制的概述 

The First Few Milliseconds of an HTTPS Connection

相關文章
相關標籤/搜索