使用wireshark觀察SSL/TLS握手過程--雙向認證/單向認證


2014年11月11日 17:04:23                                        閱讀數 50741                                                                                                

個人分類:                                                                數據加密                                                                                                

SSL/TLS握手過程可以分成兩種類型:

1)SSL/TLS 雙向認證,就是雙方都會互相認證,也就是兩者之間將會交換證書。
2)SSL/TLS 單向認證,客戶端會認證服務器端身份,而服務器端不會去對客戶端身份進行驗證。

我們知道,握手過程實際上就是通信雙方協商交換一個用於對稱加密的密鑰的過程,而且握手過程是明文的。
這個過程實際上產生三個隨機數:client random, server random, pre-master secret. 參考圖解SSL/TLS協議 .

前兩個隨機數都是明文傳送的,只有pre-master secret是加密的(RSA或者DH)。
一般生成證書的時候,簽名算法可以選擇RSA或者DSA算法。
如果server使用RSA證書,RSA即可以用作簽名也可以用作不對稱加密,pre-master secret就是用server的RSA證書中包含的公鑰加密的。
如果server使用DSA證書,DSA只能用作簽名,所以還需要使用DH算法來交換密鑰。

以下是其流程圖(摘自rfc5246),括號中的步驟是可選的。
如果是單向認證,那麼藍色字體部分是不需要的。
4 server_key_exchange這一步只有在選擇了某些密鑰交換算法例如DH算法的時候才需要。


Client

Server

1 Client Hello

2 Server Hello
3 certificate
4 (server_key_exchange)
5 (certificate_request)
6 server_hello_done

7 (certificate)
8 client_key_exchange
9 (certifiate_verify)
10 change_cypher_spec
----finished----


11 change_cypher_spec
----finished----


下面使用wireshark抓取握手過程的報文。server/client使用JAVA7/JSSE編碼

server證書籤名算法RSA-雙向認證

可見包括了除了4以外的所有步驟。因爲採取了RSA算法,所以步驟4是不需要的。

(一) 首先,客戶端向服務器提供以下信息

client_hello
(1)支持的協議版本,比如TLS 1.0
(2)支持的加密算法(Cipher Specs)
(3)客戶端生成的隨機數1(Challenge),稍後用於生成"對話密鑰"。

(二)服務器回答給客戶端以下信息

server_hello
(1) 確認使用的協議版本
(2) 服務器生成的隨機數2,稍後用於生成"對話密鑰"
(3) session id
(4) 確認使用的加密算法
certificate
服務器證書
server_key_exchange
如果是DH算法,這裏發送服務器使用的DH參數。RSA算法不需要這一步。
certificate_request
要求客戶端提供證書,包括
(1) 客戶端可以提供的證書類型
(2)服務器接受的證書distinguished name列表,可以是root CA或者subordinate CA。如果服務器配置了trust keystore, 這裏會列出所有在trust keystore中的證書的distinguished name。
server_hello_done
server hello結束

(三)客戶端發送給服務器

certificate
客戶端證書
client_key_exchange
包含pre-master secret。客戶端生成第三個隨機數。如果是採用RSA算法,會生成一個48字節隨機數,然後用server的公鑰加密之後再放入報文中;如果是DH算法,這裏發送的就是客戶端的DH參數,之後服務器和客戶端根據DH算法,各自計算出相同的pre-master secret。
certificate_verify
發送使用客戶端證書給到這一步爲止收到和發送的所有握手消息簽名結果。
change_cipher_spec
客戶端通知服務器開始使用加密方式發送報文。客戶端使用上面的3個隨機數client random, server random, pre-master secret, 計算出48字節的master secret, 這個就是對稱加密算法的密鑰。
finished
客戶端發送第一個加密報文。使用HMAC算法計算收到和發送的所有握手消息的摘要,然後通過RFC5246中定義的一個僞函數PRF計算出結果,加密後發送。

(四) 服務器發送給客戶端
服務器端發送change_cipher_specfinished消息。到這裏握手結束。


server證書籤名算法DSA-雙向認證

下面是一個server證書採用DSA算法的握手過程。由於採用了DH算法交換密鑰,多了server_key_exchange這一步。

 

server證書籤名算法RSA-單向認證

和雙向認證相比,server端少了certificate_request,client端少了certificate 和 certificate_verify

                                   



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