1. 程式人生 > >SSL協議詳解

SSL協議詳解

1  概述

基於全球資訊網的電子商務和網上銀行等新興應用,極大地方便了人們的日常生活,受到人們的青睞。由於這些應用都需要在網路上進行線上交易,它們對網路通訊的安全性提出了更高的要求。傳統的全球資訊網協議HTTP不具備安全機制——採用明文的形式傳輸資料、不能驗證通訊雙方的身份、無法防止傳輸的資料被篡改等,導致HTTP無法滿足電子商務和網上銀行等應用的安全性要求。

Netscape公司提出的安全協議SSL,利用資料加密、身份驗證和訊息完整性驗證機制,為網路上資料的傳輸提供安全性保證。SSL可以為HTTP提供安全連線,從而很大程度上改善了全球資訊網的安全性問題。

SSL具有如下優點:

l              提供較高的安全性保證。SSL利用資料加密、身份驗證和訊息完整性驗證機制,保證網路上資料傳輸的安全性。

l              支援各種應用層協議。雖然SSL設計的初衷是為了解決全球資訊網安全性問題,但是由於SSL位於應用層和傳輸層之間,它可以為任何基於TCP等可靠連線的應用層協議提供安全性保證。

l              部署簡單。目前SSL已經成為網路中用來鑑別網站和網頁瀏覽者身份,在瀏覽器使用者及Web伺服器之間進行加密通訊的全球化標準。SSL協議已被整合到大部分的瀏覽器中,如IE、Netscape、Firefox等。這就意味著幾乎任意一臺裝有瀏覽器的計算機都支援SSL連線,不需要安裝額外的客戶端軟體。

SSL協議實現的安全機制包括:

l              資料傳輸的機密性:利用對稱金鑰演算法對傳輸的資料進行加密。

l              身份驗證機制:基於證書利用數字簽名方法對伺服器和客戶端進行身份驗證,其中客戶端的身份驗證是可選的。

l              訊息完整性驗證:訊息傳輸過程中使用MAC演算法來檢驗訊息的完整性。

2.1  資料傳輸的機密性

網路上傳輸的資料很容易被非法使用者竊取,SSL採用在通訊雙方之間建立加密通道的方法保證資料傳輸的機密性。

所謂加密通道,是指傳送方在傳送資料前,使用加密演算法和加密金鑰對資料進行加密,然後將資料傳送給對方;接收方接收到資料後,利用解密演算法和解密金鑰從密文中獲取明文。沒有解密金鑰的第三方,無法將密文恢復為明文,從而保證資料傳輸的機密性。

加解密演算法分為兩類:

l              對稱金鑰演算法:資料加密和解密時使用相同的金鑰。

l              非對稱金鑰演算法:資料加密和解密時使用不同的金鑰,一個是公開的公鑰,一個是由使用者祕密儲存的私鑰。利用公鑰(或私鑰)加密的資料只能用相應的私鑰(或公鑰)才能解密。

與非對稱金鑰演算法相比,對稱金鑰演算法具有計算速度快的優點,通常用於對大量資訊進行加密(如對所有報文加密);而非對稱金鑰演算法,一般用於數字簽名和對較少的資訊進行加密。

SSL加密通道上的資料加解密使用對稱金鑰演算法,目前主要支援的演算法有DES、3DES、AES等,這些演算法都可以有效地防止互動資料被竊聽。

對稱金鑰演算法要求解密金鑰和加密金鑰完全一致。因此,利用對稱金鑰演算法加密傳輸資料之前,需要在通訊兩端部署相同的金鑰。對稱金鑰的部署方法請參見“2.4  利用非對稱金鑰演算法保證金鑰本身的安全”。

2.2  身份驗證機制

電子商務和網上銀行等應用中必須保證要登入的Web伺服器是真實的,以免重要資訊被非法竊取。SSL利用數字簽名來驗證通訊對端的身份。

非對稱金鑰演算法可以用來實現數字簽名。由於通過私鑰加密後的資料只能利用對應的公鑰進行解密,因此根據解密是否成功,就可以判斷髮送者的身份,如同傳送者對資料進行了“簽名”。例如,Alice使用自己的私鑰對一段固定的資訊加密後發給Bob,Bob利用Alice的公鑰解密,如果解密結果與固定資訊相同,那麼就能夠確認資訊的傳送者為Alice,這個過程就稱為數字簽名

SSL客戶端必須驗證SSL伺服器的身份,SSL伺服器是否驗證SSL客戶端的身份,則由SSL伺服器決定。SSL客戶端和SSL伺服器的身份驗證過程,請參見“3.2  SSL握手過程”。

使用數字簽名驗證身份時,需要確保被驗證者的公鑰是真實的,否則,非法使用者可能會冒充被驗證者與驗證者通訊。如圖1所示,Cindy冒充Bob,將自己的公鑰發給Alice,並利用自己的私鑰計算出簽名傳送給Alice,Alice利用“Bob”的公鑰(實際上為Cindy的公鑰)成功驗證該簽名,則Alice認為Bob的身份驗證成功,而實際上與Alice通訊的是冒充Bob的Cindy。SSL利用PKI提供的機制保證公鑰的真實性,詳細介紹請參見“2.5  利用PKI保證公鑰的真實性”。


圖1 偽造公鑰

為了避免網路中傳輸的資料被非法篡改,SSL利用基於MD5或SHA的MAC演算法來保證訊息的完整性

MAC演算法是在金鑰參與下的資料摘要演算法,能將金鑰和任意長度的資料轉換為固定長度的資料。利用MAC演算法驗證訊息完整性的過程如圖2所示。傳送者在金鑰的參與下,利用MAC演算法計算出訊息的MAC值,並將其加在訊息之後傳送給接收者。接收者利用同樣的金鑰和MAC演算法計算出訊息的MAC值,並與接收到的MAC值比較。如果二者相同,則報文沒有改變;否則,報文在傳輸過程中被修改,接收者將丟棄該報文。


圖2 MAC演算法示意圖

MAC演算法具有如下特徵,使其能夠用來驗證訊息的完整性:

l              訊息的任何改變,都會引起輸出的固定長度資料產生變化。通過比較MAC值,可以保證接收者能夠發現訊息的改變。

l              MAC演算法需要金鑰的參與,因此沒有金鑰的非法使用者在改變訊息的內容後,無法新增正確的MAC值,從而保證非法使用者無法隨意修改訊息內容。

MAC演算法要求通訊雙方具有相同的金鑰,否則MAC值驗證將會失敗。因此,利用MAC演算法驗證訊息完整性之前,需要在通訊兩端部署相同的金鑰。MAC金鑰的部署方法請參見“2.4  利用非對稱金鑰演算法保證金鑰本身的安全”。

2.4  利用非對稱金鑰演算法保證金鑰本身的安全

對稱金鑰演算法和MAC演算法要求通訊雙方具有相同的金鑰,否則解密或MAC值驗證將失敗。因此,要建立加密通道或驗證訊息完整性,必須先在通訊雙方部署一致的金鑰。

SSL利用非對稱金鑰演算法加密金鑰的方法實現金鑰交換,保證第三方無法獲取該金鑰。如圖3所示,SSL客戶端(如Web瀏覽器)利用SSL伺服器(如Web伺服器)的公鑰加密金鑰,將加密後的金鑰傳送給SSL伺服器,只有擁有對應私鑰的SSL伺服器才能從密文中獲取原始的金鑰。SSL通常採用RSA演算法加密傳輸金鑰


l      實際上,SSL客戶端傳送給SSL伺服器的金鑰不能直接用來加密資料或計算MAC值,該金鑰是用來計算對稱金鑰和MAC金鑰的資訊,稱為premaster secret。SSL客戶端和SSL伺服器利用premaster secret計算出相同的主金鑰(master secret),再利用master secret生成用於對稱金鑰演算法、MAC演算法等的金鑰。premaster secret是計算對稱金鑰、MAC演算法金鑰的關鍵。

l      用來實現金鑰交換的演算法稱為金鑰交換演算法。非對稱金鑰演算法RSA用於金鑰交換時,也可以稱之為金鑰交換演算法。

利用非對稱金鑰演算法加密金鑰之前,傳送者需要獲取接收者的公鑰,並保證該公鑰確實屬於接收者,否則,金鑰可能會被非法使用者竊取。如圖1所示,Cindy冒充Bob,將自己的公鑰發給Alice,Alice利用Cindy的公鑰加密傳送給Bob的資料,Bob由於沒有對應的私鑰無法解密該資料,而Cindy擷取資料後,可以利用自己的私鑰解密該資料。SSL利用PKI提供的機制保證公鑰的真實性,詳細介紹請參見“2.5  利用PKI保證公鑰的真實性”。

PKI通過數字證書來發布使用者的公鑰,並提供了驗證公鑰真實性的機制。數字證書(簡稱證書)是一個包含使用者的公鑰及其身份資訊的檔案,證明了使用者與公鑰的關聯。數字證書由權威機構——CA簽發,並由CA保證數字證書的真實性。

SSL客戶端把金鑰加密傳遞給SSL伺服器之前,SSL伺服器需要將從CA獲取的證書傳送給SSL客戶端,SSL客戶端通過PKI判斷該證書的真實性。如果該證書確實屬於SSL伺服器,則利用該證書中的公鑰加密金鑰,傳送給SSL伺服器。

驗證SSL伺服器/SSL客戶端的身份之前,SSL伺服器/SSL客戶端需要將從CA獲取的證書傳送給對端,對端通過PKI判斷該證書的真實性。如果該證書確實屬於SSL伺服器/SSL客戶端,則對端利用該證書中的公鑰驗證SSL伺服器/SSL客戶端的身份。

3  協議工作過程


圖4 SSL協議分層

如圖4所示,SSL位於應用層和傳輸層之間,它可以為任何基於TCP等可靠連線的應用層協議提供安全性保證。SSL協議本身分為兩層:

l              上層為SSL握手協議(SSL handshake protocol)、SSL密碼變化協議(SSL change cipher spec protocol)和SSL警告協議(SSL alert protocol);

l              底層為SSL記錄協議(SSL record protocol)。

其中:

l              SSL握手協議:是SSL協議非常重要的組成部分,用來協商通訊過程中使用的加密套件(加密演算法、金鑰交換演算法和MAC演算法等)、在伺服器和客戶端之間安全地交換金鑰、實現伺服器和客戶端的身份驗證。

l              SSL密碼變化協議:客戶端和伺服器端通過密碼變化協議通知對端,隨後的報文都將使用新協商的加密套件和金鑰進行保護和傳輸。

l              SSL警告協議:用來向通訊對端報告告警資訊,訊息中包含告警的嚴重級別和描述。

l              SSL記錄協議:主要負責對上層的資料(SSL握手協議、SSL密碼變化協議、SSL警告協議和應用層協議報文)進行分塊、計算並新增MAC值、加密,並把處理後的記錄塊傳輸給對端。

SSL通過握手過程在客戶端和伺服器之間協商會話引數,並建立會話。會話包含的主要引數有會話ID、對方的證書、加密套件(金鑰交換演算法、資料加密演算法和MAC演算法等)以及主金鑰(master secret)。通過SSL會話傳輸的資料,都將採用該會話的主金鑰和加密套件進行加密、計算MAC等處理。

不同情況下,SSL握手過程存在差異。下面將分別描述以下三種情況下的握手過程:

l              只驗證伺服器的SSL握手過程

l              驗證伺服器和客戶端的SSL握手過程

l              恢復原有會話的SSL握手過程


如圖5所示,只需要驗證SSL伺服器身份,不需要驗證SSL客戶端身份時,SSL的握手過程為:

(1)        SSL客戶端通過Client Hello訊息將它支援的SSL版本、加密演算法、金鑰交換演算法、MAC演算法等資訊傳送給SSL伺服器。

(2)        SSL伺服器確定本次通訊採用的SSL版本和加密套件,並通過Server Hello訊息通知給SSL客戶端。如果SSL伺服器允許SSL客戶端在以後的通訊中重用本次會話,則SSL伺服器會為本次會話分配會話ID,並通過Server Hello訊息傳送給SSL客戶端。

(3)        SSL伺服器將攜帶自己公鑰資訊的數字證書通過Certificate訊息傳送給SSL客戶端。

(4)        SSL伺服器傳送Server Hello Done訊息,通知SSL客戶端版本和加密套件協商結束,開始進行金鑰交換。

(5)        SSL客戶端驗證SSL伺服器的證書合法後,利用證書中的公鑰加密SSL客戶端隨機生成的premaster secret,並通過Client Key Exchange訊息傳送給SSL伺服器。

(6)        SSL客戶端傳送Change Cipher Spec訊息,通知SSL伺服器後續報文將採用協商好的金鑰和加密套件進行加密和MAC計算。

(7)        SSL客戶端計算已互動的握手訊息(除Change Cipher Spec訊息外所有已互動的訊息)的Hash值,利用協商好的金鑰和加密套件處理Hash值(計算並新增MAC值、加密等),並通過Finished訊息傳送給SSL伺服器。SSL伺服器利用同樣的方法計算已互動的握手訊息的Hash值,並與Finished訊息的解密結果比較,如果二者相同,且MAC值驗證成功,則證明金鑰和加密套件協商成功。

(8)        同樣地,SSL伺服器傳送Change Cipher Spec訊息,通知SSL客戶端後續報文將採用協商好的金鑰和加密套件進行加密和MAC計算。

(9)        SSL伺服器計算已互動的握手訊息的Hash值,利用協商好的金鑰和加密套件處理Hash值(計算並新增MAC值、加密等),並通過Finished訊息傳送給SSL客戶端。SSL客戶端利用同樣的方法計算已互動的握手訊息的Hash值,並與Finished訊息的解密結果比較,如果二者相同,且MAC值驗證成功,則證明金鑰和加密套件協商成功。

SSL客戶端接收到SSL伺服器傳送的Finished訊息後,如果解密成功,則可以判斷SSL伺服器是數字證書的擁有者,即SSL伺服器身份驗證成功,因為只有擁有私鑰的SSL伺服器才能從Client Key Exchange訊息中解密得到premaster secret,從而間接地實現了SSL客戶端對SSL伺服器的身份驗證。

&  說明:

l      Change Cipher Spec訊息屬於SSL密碼變化協議,其他握手過程互動的訊息均屬於SSL握手協議,統稱為SSL握手訊息。

l      計算Hash值,指的是利用Hash演算法(MD5或SHA)將任意長度的資料轉換為固定長度的資料。


SSL客戶端的身份驗證是可選的,由SSL伺服器決定是否驗證SSL客戶端的身份。如圖6中藍色部分標識的內容所示,如果SSL伺服器驗證SSL客戶端身份,則SSL伺服器和SSL客戶端除了互動“3.2.1  只驗證伺服器的SSL握手過程”中的訊息協商金鑰和加密套件外,還需要進行以下操作:

(1)        SSL伺服器傳送Certificate Request訊息,請求SSL客戶端將其證書傳送給SSL伺服器。

(2)        SSL客戶端通過Certificate訊息將攜帶自己公鑰的證書傳送給SSL伺服器。SSL伺服器驗證該證書的合法性。

(3)        SSL客戶端計算已互動的握手訊息、主金鑰的Hash值,利用自己的私鑰對其進行加密,並通過Certificate Verify訊息傳送給SSL伺服器。

(4)        SSL伺服器計算已互動的握手訊息、主金鑰的Hash值,利用SSL客戶端證書中的公鑰解密Certificate Verify訊息,並將解密結果與計算出的Hash值比較。如果二者相同,則SSL客戶端身份驗證成功。


圖7 恢復原有會話的SSL握手過程

協商會話引數、建立會話的過程中,需要使用非對稱金鑰演算法來加密金鑰、驗證通訊對端的身份,計算量較大,佔用了大量的系統資源。為了簡化SSL握手過程,SSL允許重用已經協商過的會話,具體過程為:

(1)        SSL客戶端傳送Client Hello訊息,訊息中的會話ID設定為計劃重用的會話的ID。

(2)        SSL伺服器如果允許重用該會話,則通過在Server Hello訊息中設定相同的會話ID來應答。這樣,SSL客戶端和SSL伺服器就可以利用原有會話的金鑰和加密套件,不必重新協商。

(3)        SSL客戶端傳送Change Cipher Spec訊息,通知SSL伺服器後續報文將採用原有會話的金鑰和加密套件進行加密和MAC計算。

(4)        SSL客戶端計算已互動的握手訊息的Hash值,利用原有會話的金鑰和加密套件處理Hash值,並通過Finished訊息傳送給SSL伺服器,以便SSL伺服器判斷金鑰和加密套件是否正確。

(5)        同樣地,SSL伺服器傳送Change Cipher Spec訊息,通知SSL客戶端後續報文將採用原有會話的金鑰和加密套件進行加密和MAC計算。

(6)        SSL伺服器計算已互動的握手訊息的Hash值,利用原有會話的金鑰和加密套件處理Hash值,並通過Finished訊息傳送給SSL客戶端,以便SSL客戶端判斷金鑰和加密套件是否正確。

4  典型組網應用

HTTPS是基於SSL安全連線的HTTP協議。HTTPS通過SSL提供的資料加密、身份驗證和訊息完整性驗證等安全機制,為Web訪問提供了安全性保證,廣泛應用於網上銀行、電子商務等領域。

圖8為HTTPS在網上銀行中的應用。某銀行為了方便客戶,提供了網上銀行業務,客戶可以通過訪問銀行的Web伺服器進行帳戶查詢、轉帳等。通過在客戶和銀行的Web伺服器之間建立SSL連線,可以保證客戶的資訊不被非法竊取。


SSL VPN是以SSL為基礎的VPN技術,利用SSL提供的安全機制,為使用者遠端訪問公司內部網路提供了安全保證。如圖9所示,SSL VPN通過在遠端接入使用者和SSL VPN閘道器之間建立SSL安全連線,允許使用者通過各種Web瀏覽器,各種網路接入方式,在任何地方遠端訪問企業網路資源,並能夠保證企業網路的安全,保護企業內部資訊不被竊取。


5  參考文獻

l              draft-freier-ssl-version3-02:The SSL Protocol Version 3.0


---------------------------------------------------------------------------------------------------------------------------------------------------------------------

背景介紹   

  最近在看《密碼學與網路安全》相關的書籍,這篇文章主要詳細介紹一下著名的網路安全協議SSL。

  在開始SSl介紹之前,先給大家介紹幾個密碼學的概念和相關的知識。

  1、密碼學的相關概念

  • 密碼學(cryptography):目的是通過將資訊編碼使其不可讀,從而達到安全性。
  • 明文(plain text):傳送人、接受人和任何訪問訊息的人都能理解的訊息。
  • 密文(cipher text):明文訊息經過某種編碼後,得到密文訊息。
  • 加密(encryption):將明文訊息變成密文訊息。
  • 解密(decryption):將密文訊息變成明文訊息。
  • 演算法:取一個輸入文字,產生一個輸出文字。
  • 加密演算法:傳送方進行加密的演算法。
  • 解密演算法:接收方進行解密的演算法。
  • 金鑰(key):只有傳送方和接收方理解的訊息
  • 對稱金鑰加密(Symmetric Key Cryptography):加密與解密使用相同金鑰。
  • 非對稱金鑰加密(Asymmetric Key Cryptography):加密與解密使用不同金鑰。

  2、相關的加密演算法介紹

  DES演算法即資料加密標準,也稱為資料加密演算法。加密過程如下:


  在SSL中會用到分組DES、三重DES演算法等加密演算法對資料進行加密。當然可以選用其他非DES加密演算法,視情況而定,後面會詳細介紹。

  3、金鑰交換演算法

  使用對稱加密演算法時,金鑰交換是個大難題,所以Diffie和Hellman提出了著名的Diffie-Hellman金鑰交換演算法。

  Diffie-Hellman金鑰交換演算法原理:

(1)Alice與Bob確定兩個大素數n和g,這兩個數不用保密
(2)Alice選擇另一個大隨機數x,並計算A如下:A=gx mod n
(3)Alice將A發給Bob
(4)Bob選擇另一個大隨機數y,並計算B如下:B=gy mod n
(5)Bob將B發給Alice
(6)計算祕密金鑰K1如下:K1=Bx mod n
(7)計算祕密金鑰K2如下:K2=Ay mod n
K1=K2,因此Alice和Bob可以用其進行加解密 

  RSA加密演算法是基於這樣的數學事實:兩個大素數相乘容易,而對得到的乘積求因子則很難。加密過程如下:

(1)選擇兩個大素數P、Q
(2)計算N=P*Q
(3)選擇一個公鑰(加密金鑰)E,使其不是(P-1)與(Q-1)的因子
(4)選擇私鑰(解密金鑰)D,滿足如下條件:
          (D*E) mod (P-1)(Q-1)=1
(5)加密時,明文PT計算密文CT如下:
          CT=PTE mod N
(6)解密時,從密文CT計算明文PT如下:
          PT=CTDmodN 這也是SSL中會用一種金鑰交換演算法。 

  3、雜湊演算法: 

  主要用於驗證資料的完整性,即保證時訊息在傳送之後和接收之前沒有被篡改對於SSL中使用到的雜湊演算法有MD5、SHA-1。

  4、數字證書:

  數字證書其實就是一個小的計算機檔案,其作用類似於我們的身份證、護照,用於證明身份,在SSL中,使用數字證書來證明自己的身份,而不是偽造的。

  5、簡單的總結:

  在SSL中會使用金鑰交換演算法交換金鑰;使用金鑰對資料進行加密;使用雜湊演算法對資料的完整性進行驗證,使用數字證書證明自己的身份。好了,下面開始介紹SSL協議。

  SSL介紹:

  安全套接字(Secure Socket Layer,SSL)協議是Web瀏覽器與Web伺服器之間安全交換資訊的協議,提供兩個基本的安全服務:鑑別與保密。

  SSL是Netscape於1994年開發的,後來成為了世界上最著名的web安全機制,所有主要的瀏覽器都支援SSL協議。

  目前有三個版本:2、3、3.1,最常用的是第3版,是1995年釋出的。

  SSL協議的三個特性

  ① 保密:在握手協議中定義了會話金鑰後,所有的訊息都被加密。

  ② 鑑別:可選的客戶端認證,和強制的伺服器端認證。

  ③ 完整性:傳送的訊息包括訊息完整性檢查(使用MAC,即Message Authentication Code 訊息認證碼演算法,是含有金鑰雜湊函式演算法)。

  SSL的位置

  SSL介於應用層和TCP層之間。應用層資料不再直接傳遞給傳輸層,而是傳遞給SSL層,SSL層對從應用層收到的資料進行加密,並增加自己的SSL頭。


  SSL的工作原理

  握手協議(Handshake protocol)

  記錄協議(Record protocol)

  警報協議(Alert protocol)

  1、握手協議

  握手協議是客戶機和伺服器用SSL連線通訊時使用的第一個子協議,握手協議包括客戶機與伺服器之間的一系列訊息。SSL中最複雜的協議就是握手協議。該協議允許伺服器和客戶機相互驗證,協商加密和MAC演算法以及保密金鑰,用來保護在SSL記錄中傳送的資料。握手協議是在應用程式的資料傳輸之前使用的。

  每個握手協議包含以下3個欄位

  (1)Type:表示10種訊息型別之一

  (2)Length:表示訊息長度位元組數

  (3)Content:與訊息相關的引數

圖. SSL Protocol Stack

圖.SSL Record Format


圖.SSL Record Protocol Payload


圖. 握手協議的4個階段


  1.1 建立安全能力

  SSL握手的第一階段啟動邏輯連線,建立這個連線的安全能力。首先客戶機向伺服器發出client hello訊息並等待伺服器響應,隨後伺服器向客戶機返回server hello訊息,對client hello訊息中的資訊進行確認。

  Client hello訊息包括Version,Random,Session id,Cipher suite,Compression method等資訊。


  ClientHello 客戶傳送CilentHello資訊,包含如下內容:

  (1)客戶端可以支援的SSL最高版本號

  (2)一個用於生成主祕密的32位元組的隨機數。(等會介紹主祕密是什麼)

  (3)一個確定會話的會話ID。

  (4)一個客戶端可以支援的密碼套件列表。

  密碼套件格式:每個套件都以“SSL”開頭,緊跟著的是金鑰交換演算法。用“With”這個詞把金鑰交換演算法、加密演算法、雜湊演算法分開,例如:SSL_DHE_RSA_WITH_DES_CBC_SHA, 表示把DHE_RSA(帶有RSA數字簽名的暫時Diffie-HellMan)定義為金鑰交換演算法;把DES_CBC定義為加密演算法;把SHA定義為雜湊演算法。

  (5)一個客戶端可以支援的壓縮演算法列表。

   ServerHello伺服器用ServerHello資訊應答客戶,包括下列內容

  (1)一個SSL版本號。取客戶端支援的最高版本號和服務端支援的最高版本號中的較低者。

  (2)一個用於生成主祕密的32位元組的隨機數。(客戶端一個、服務端一個)

  (3)會話ID

  (4)從客戶端的密碼套件列表中選擇的一個密碼套件

  (5)從客戶端的壓縮方法的列表中選擇的壓縮方法

  這個階段之後,客戶端服務端知道了下列內容:

  (1)SSL版本

  (2)金鑰交換、資訊驗證和加密演算法

  (3)壓縮方法

  (4)有關金鑰生成的兩個隨機數。

  1.2 伺服器鑑別與金鑰交換

  伺服器啟動SSL握手第2階段,是本階段所有訊息的唯一發送方,客戶機是所有訊息的唯一接收方。該階段分為4步:

  (a)證書:伺服器將數字證書和到根CA整個鏈發給客戶端,使客戶端能用伺服器證書中的伺服器公鑰認證伺服器。

  (b)伺服器金鑰交換(可選):這裡視金鑰交換演算法而定

  (c)證書請求:服務端可能會要求客戶自身進行驗證。

  (d)伺服器握手完成:第二階段的結束,第三階段開始的訊號


  這裡重點介紹一下服務端的驗證和金鑰交換。這個階段的前面的(a)證書 和(b)伺服器金鑰交換是基於金鑰交換方法的。而在SSL中金鑰交換演算法有6種:無效(沒有金鑰交換)、RSA、匿名Diffie-Hellman、暫時Diffie-Hellman、固定Diffie-Hellman、Fortezza。

  在階段1過程客戶端與服務端協商的過程中已經確定使哪種金鑰交換演算法。

  如果協商過程中確定使用RSA交換金鑰,那麼過程如下圖:


  這個方法中,伺服器在它的第一個資訊中,傳送了RSA加密/解密公鑰證書。不過,因為預備主祕密是由客戶端在下一個階段生成併發送的,所以第二個資訊是空的。注意,公鑰證書會進行從伺服器到客戶端的驗證。當伺服器收到預備主祕密時,它使用私鑰進行解密。服務端擁有私鑰是一個證據,可以證明伺服器是一個它在第一個資訊傳送的公鑰證書中要求的實體。

  其他的幾種金鑰交換演算法這裡就不介紹了。可以參考Behrouz A.Forouzan著的《密碼學與網路安全》。

   1.3 客戶機鑑別與金鑰交換:


  客戶機啟動SSL握手第3階段,是本階段所有訊息的唯一發送方,伺服器是所有訊息的唯一接收方。該階段分為3步:

  (a)證書(可選):為了對伺服器證明自身,客戶要傳送一個證書資訊,這是可選的,在IIS中可以配置強制客戶端證書認證。

  (b)客戶機金鑰交換(Pre-master-secret):這裡客戶端將預備主金鑰傳送給服務端,注意這裡會使用服務端的公鑰進行加密。

  (c)證書驗證(可選),對預備祕密和隨機數進行簽名,證明擁有(a)證書的公鑰。

  下面也重點介紹一下RSA方式的客戶端驗證和金鑰交換。


  這種情況,除非伺服器在階段II明確請求,否則沒有證書資訊。客戶端金鑰交換方法包括階段II收到的由RSA公鑰加密的預備主金鑰。

  階段III之後,客戶要有伺服器進行驗證,客戶和伺服器都知道預備主金鑰。

  1.4 完成


  客戶機啟動SSL握手第4階段,使伺服器結束。該階段分為4步,前2個訊息來自客戶機,後2個訊息來自伺服器。

  1.5 金鑰生成的過程

  這樣握手協議完成,下面看下什麼是預備主金鑰,主金鑰是怎麼生成的。為了保證資訊的完整性和機密性,SSL需要有六個加密祕密:四個金鑰和兩個IV。為了資訊的可信性,客戶端需要一個金鑰(HMAC),為了加密要有一個金鑰,為了分組加密要一個IV,服務也是如此。SSL需要的金鑰是單向的,不同於那些在其他方向的金鑰。如果在一個方向上有攻擊,這種攻擊在其他方向是沒影響的。生成過程如下:




  2、記錄協議 

  記錄協議在客戶機和伺服器握手成功後使用,即客戶機和伺服器鑑別對方和確定安全資訊交換使用的演算法後,進入SSL記錄協議,記錄協議向SSL連線提供兩個服務:

  (1)保密性:使用握手協議定義的祕密金鑰實現

  (2)完整性:握手協議定義了MAC,用於保證訊息完整性

  記錄協議的過程:


  3、警報協議

  客戶機和伺服器發現錯誤時,向對方傳送一個警報訊息。如果是致命錯誤,則演算法立即關閉SSL連線,雙方還會先刪除相關的會話號,祕密和金鑰。每個警報訊息共2個位元組,第1個位元組表示錯誤型別,如果是警報,則值為1,如果是致命錯誤,則值為2;第2個字節制定實際錯誤型別。

  總結

  SSL中,使用握手協議協商加密和MAC演算法以及保密金鑰 ,使用握手協議對交換的資料進行加密和簽名,使用警報協議定義資料傳輸過程中,出現問題如何去解決。

  整個過程比較複雜,如果大家有不理解和我敘述不周的地方,歡迎大家指正出來!

在網路資料傳輸的過程中,經常採用RSA和AES混合加密的方式:
服務端生成RSA金鑰對,將其中的RSA公鑰傳遞給客戶端,然後用RSA金鑰對AES金鑰加密,傳遞給客戶端,客戶端用RSA公鑰解密後,得到AES金鑰,最後使用AES金鑰跟服務端互通資料。