SSL協議詳解(轉)
最近在看《密碼學與網路安全》相關的書籍,這篇文章主要詳細介紹一下著名的網路安全協議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)。
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:與訊息相關的引數
握手協議的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演算法以及保密金鑰 ,使用握手協議對交換的資料進行加密和簽名,使用警報協議定義資料傳輸過程中,出現問題如何去解決。
整個過程比較複雜,如果大家有不理解和我敘述不周的地方,歡迎大家指正出來!