一篇文章講述清楚SSL握手協(xié)議詳細(xì)流程
概述
SSL(Secure Socket Layer)安全套接字協(xié)議是運(yùn)行在應(yīng)用層和TCP層之間的安全機(jī)制。保證上層應(yīng)用數(shù)據(jù)傳輸?shù)谋C苄?、完整性以及傳輸雙發(fā)身份的合法性。
- 傳輸加密性:握手協(xié)議定義會(huì)話密鑰后,所有傳輸?shù)膱?bào)文被會(huì)話密鑰加密。
- 消息的完整性:傳輸?shù)膱?bào)文中增加MAC(消息認(rèn)證碼),用于檢測完整性。
- 身份驗(yàn)證:客戶端認(rèn)證(可選),服務(wù)端認(rèn)證(強(qiáng)制)
SSL協(xié)議包括:握手協(xié)議(Handshake protocol)、SSLpassword變化協(xié)議(SSL change cipher spec protocol)、警報(bào)協(xié)議(Alert protocol)、記錄協(xié)議(Record protocol)。
握手協(xié)議是SSL連接通信的第一個(gè)子協(xié)議也是最復(fù)雜的協(xié)議。

SSL分層結(jié)構(gòu)
SSL握手協(xié)議
通過握手過程,客戶端與服務(wù)端之間協(xié)商會(huì)話參數(shù)(包括相互驗(yàn)證、協(xié)商加密和MAC算法、生成會(huì)話密鑰等)。

SSL握手協(xié)議過程
第一階段:建立安全能力
客戶端-client_hello:
- 客戶端可以支持的SSL最高版本號;
- 客戶端生成的32字節(jié)的隨機(jī)數(shù);
- 會(huì)話標(biāo)識符ID;
- 客戶端可以支持的密碼套件列表;
- 客戶端可以支持的壓縮方法列表。
服務(wù)端-server_hello:
- SSL版本號,取收到的客戶端SSL版本和服務(wù)端支持的最高版本中的較低者;
- 服務(wù)端生成的32字節(jié)的隨機(jī)數(shù);
- 會(huì)話標(biāo)識符ID;
- 從收到的客戶端密碼套件列表中選擇一個(gè)密碼套件(包含密鑰交換算法、對稱加密算法、摘要算法);
- 從收到的客戶端壓縮方法列表中選擇一種壓縮方法。
第二階段:服務(wù)端驗(yàn)證和密鑰交換
- 服務(wù)端-certificate:
含有公鑰信息的服務(wù)端數(shù)字證書或到CA的完整證書鏈。
服務(wù)端-server_key_exchange:
- 可選,根據(jù)密鑰協(xié)商算法而定,如果傳送給客戶端的服務(wù)端證書數(shù)據(jù)不足以按照第一階段選定的密鑰交換算法協(xié)商密鑰,該步驟不足密鑰協(xié)商元素。
服務(wù)端-certificate_request:
- 可選,請求驗(yàn)證客戶端證書信息,單向數(shù)據(jù)認(rèn)證(只認(rèn)證服務(wù)端)無此步驟。
服務(wù)端-server_hello_done:
- 通知客戶端版本號和加密套件協(xié)商結(jié)束。
第三階段:客戶端驗(yàn)證和密鑰交換
客戶端-certificate:
- 可選,客戶端數(shù)字證書,雙向數(shù)據(jù)認(rèn)證中服務(wù)端要求驗(yàn)證客戶端身份合法性。
客戶端-client_key_exchange:
- 客戶端交換密鑰,視密鑰交換算法而定,密鑰協(xié)商參數(shù)或pre-master key(服務(wù)端公鑰加密)。
客戶端-certificate_verify:
- 可選,客戶端將已交互的握手消息、會(huì)話密鑰的摘要值用客戶端私鑰加密發(fā)送給服務(wù)端。
第四階段:完成
客戶端-change_cipher_spec:
- 改變密碼格式信息,告訴服務(wù)端之后的報(bào)文消息用會(huì)話密鑰加密。
客戶端-finished:
- 向服務(wù)端宣布握手協(xié)議完成。
服務(wù)端-change_cipher_spec:
- 改變密碼格式信息,告訴客戶端之后的報(bào)文消息用會(huì)話密鑰加密。
服務(wù)端-finished:
- 向客戶端宣布握手協(xié)議完成。