SSL握手過程

1、SSL握手有三個目的:
1. 客戶端與服務器須要就一組用於保護數據的算法達成一致
2. 它們須要確立一組由那些算法所使用的加密密鑰
3. 握手還能夠選擇對客戶端進行認證html

2、SSL握手過程:
1. 客戶端將它所支持的算法列表和一個用做產生密鑰的隨機數發送給服務器;
2. 服務器從算法列表中選擇一種加密算法,並將它和一份包含服務器公用密鑰的證書發送給客戶端;該證書還包含了用於認證目的的服務器標識,服務器同時還提供了一個用做產生密鑰的隨機數
3. 客戶端對服務器的證書進行驗證(有關驗證證書,能夠參考數字簽名),並抽取服務器的公用密鑰;而後,再產生一個稱做pre_master_secret的隨機密碼串,並使用服務器的公用密鑰對其進行加密(參考非對稱加/解密),並將加密後的信息發送給服務器;
4. 客戶端與服務器端根據pre_master_secret以及客戶端與服務器的隨機數值獨立計算出加密和MAC密鑰(參考DH密鑰交換算法)。
5. 客戶端將全部握手消息的MAC值發送給服務器;
6. 服務器將全部握手消息的MAC值發送給客戶端。

    第5與第6步用以防止握手自己遭受篡改。設想一個攻擊者想要控制客戶端與服務器所使用的算法。客戶端提供多種算法的狀況至關常見,某些強度弱而某些強度強,以便可以與僅支持弱強度算法的服務器進行通訊。攻擊者能夠刪除客戶端在第1步所提供的全部高強度算法,因而就迫使服務器選擇一種弱強度的算法。第5步與第6步的MAC交換就能阻止這種攻擊,由於客戶端的MAC是根據原始消息計算得出的,而服務器的MAC是根據攻擊者修改過的消息計算得出的,這樣通過檢查就會發現不匹配。因爲客戶端與服務器所提供的隨機數爲密鑰產生過程的輸入,因此握手不會受到重放攻擊的影響。這些消息是首個在新的加密算法與密鑰下加密的消息。 算法

    剛纔所描述的每一步都須要經過一條或多條握手消息來實現。在此先簡要地描述哪些消息與哪幾步相對應,而後詳細描述每條消息的內容。下圖描述了各條消息:

    第1步對應一條單一的握手消息,ClientHello.
    第2步對應一系列SSL握手消息,服務器發送的第一條消息爲ServerHello,其中包含了它所選擇的算法,接着再在Certificate消息中發送其證書。最後,服務器發送ServerHelloDone消息以表示這一握手階段的完成。須要ServerHelloDone的緣由是一些更爲複雜的握手變種還要在Certifacate以後發送其餘一些消息。當客戶端接收到ServerHelloDone消息時,它就知道不會再有其餘相似的消息過來了,因而就能夠繼續它這一方的握手。
    第3步對應ClientKeyExchange消息。
    第5與第6步對應Finished消息。該消息是第一條使用剛剛磋商過的算法加以保護的消息。爲了防止握手過程遭到篡改,該消息的內容是前一階段全部握手消息的MAC值。然而,因爲Finished消息是以磋商好的算法加以保護的,因此也要與新磋商的MAC密鑰—起計算消息自己的MAc值。
    注意,上圖中省略了兩條ChangeCipherSpec消息。 服務器

3、SSL記錄協議:
    在SSL中,實際的數據傳輸是使用SSL記錄協議來實現的。SSL記錄協議是經過將數據流分割成一系列的片斷並加以傳輸來工做的,其中對每一個片斷單獨進行保護和傳輸。在接收方,對每條記錄單獨進行解密和驗證。這種方案使得數據一經準備好就能夠從鏈接的一端傳送到另外一端,並在接收到的即刻加以處理。
    在傳輸片斷以前,必須防止其遭到攻擊。能夠經過計算數據的MAC來提供完整性保護。MAC與片斷一塊兒進行傳輸,並由接收實現加以驗證。將MAC附加到片斷的尾部,並對數據與MAC整合在一塊兒的內容進行加密,以造成通過加密的負載(Payload)。最後給負載裝上頭信息。頭信息與通過加密的負載的連結稱做記錄(record),記錄就是實際傳輸的內容。下圖描述了傳輸過程:
app

3.1 記錄頭消息:
    記錄頭信息的工做就是爲接收實現(receiving implementation)提供對記錄進行解釋所必需的信息。在實際應用中,它是指三種信息:內容類型、長度和SSL版本。長度字段可讓接收方知道他要從線路上這取多少字節才能對消息進行處理,版本號只是一項確保每一方使用所磋商的版本的冗餘性檢查。內容類型字段表示消息類型。 加密

3.2 SSL記錄類型
    SSL支持四種內容類型:application_data、alert、handshake和change_cipher_spec。
使用SSL的軟件發送和接收的全部數據都是以application_data類型來發送的,其餘三種內容類型用於對通訊進行管理,如完成握手和報告錯誤等。
    內容類型alert主要用於報告各類類型的錯誤。大多數alert(警示)用於報告握手中出現的問題,但也有一些指示在對記錄試圖進行解密或認證時發生的錯誤,alert消息的其餘用途是指示鏈接將要關閉。
    內容類型handshake用於承載握手消息。即使是最初造成鏈接的握手消息也是經過記錄層以handshake類型的記錄來承載的。因爲加密密鑰還未確立,這些初始的消息並未通過加密或認證,可是其餘處理過程是同樣的。有可能在現有的鏈接上初始化一次新的握手,在這種狀況下,新的握手記錄就像其餘的數據同樣,要通過加密和認證。
    change_cipher_spec消息表示記錄加密及認證的改變。一旦握手商定了一組新的密鑰,就發送change_cipher_spec來指示此刻將啓用新的密鑰。 spa

4、各類消息協同工做:
    正如咱們所看到的,SSL是一種分層協議,它以一個記錄層以及記錄層上承裁的個同消息類型組成。而該記錄層又會由某種可靠的傳輸協議如TCP來承載。下圖描述了該協以的結構:
htm

5、一次SSL鏈接的完整過程:



摘錄自《SSL與TLS》 blog

做者:Silent Void 
出處:http://happyhippy.cnblogs.com/ ip

相關文章
相關標籤/搜索