概述
SSL(Secure Socket Layer)安全套接字協議是運行在應用層和TCP層之間的安全機制。保證上層應用數據傳輸的保密性、完整性以及傳輸雙發身份的合法性。
- 傳輸加密性:握手協議定義會話密鑰后,所有傳輸的報文被會話密鑰加密。
- 消息的完整性:傳輸的報文中增加mac(消息認證碼),用于檢測完整性。
- 身份驗證:客戶端認證(可選),服務端認證(強制)
SSL協議包括:握手協議(Handshake protocol)、SSLpassword變化協議(SSL change cipher spec protocol)、警報協議(Alert protocol)、記錄協議(Record protocol)。
握手協議是SSL連接通信的第一個子協議也是最復雜的協議。
SSL分層結構
SSL握手協議
通過握手過程,客戶端與服務端之間協商會話參數(包括相互驗證、協商加密和MAC算法、生成會話密鑰等)。
SSL握手協議過程
第一階段:建立安全能力
客戶端-client_hello:
- 客戶端可以支持的SSL最高版本號;
- 客戶端生成的32字節的隨機數;
- 會話標識符ID;
- 客戶端可以支持的密碼套件列表;
- 客戶端可以支持的壓縮方法列表。
服務端-server_hello:
- SSL版本號,取收到的客戶端SSL版本和服務端支持的最高版本中的較低者;
- 服務端生成的32字節的隨機數;
- 會話標識符ID;
- 從收到的客戶端密碼套件列表中選擇一個密碼套件(包含密鑰交換算法、對稱加密算法、摘要算法);
- 從收到的客戶端壓縮方法列表中選擇一種壓縮方法。
第二階段:服務端驗證和密鑰交換
服務端-certificate:
- 含有公鑰信息的服務端數字證書或到CA的完整證書鏈。
服務端-server_key_exchange:
- 可選,根據密鑰協商算法而定,如果傳送給客戶端的服務端證書數據不足以按照第一階段選定的密鑰交換算法協商密鑰,該步驟不足密鑰協商元素。
服務端-certificate_request:
- 可選,請求驗證客戶端證書信息,單向數據認證(只認證服務端)無此步驟。
服務端-server_hello_done:
- 通知客戶端版本號和加密套件協商結束。
第三階段:客戶端驗證和密鑰交換
客戶端-certificate:
- 可選,客戶端數字證書,雙向數據認證中服務端要求驗證客戶端身份合法性。
客戶端-client_key_exchange:
- 客戶端交換密鑰,視密鑰交換算法而定,密鑰協商參數或pre-master key(服務端公鑰加密)。
客戶端-certificate_verify:
- 可選,客戶端將已交互的握手消息、會話密鑰的摘要值用客戶端私鑰加密發送給服務端。
第四階段:完成
客戶端-change_cipher_spec:
- 改變密碼格式信息,告訴服務端之后的報文消息用會話密鑰加密。
客戶端-finished:
- 向服務端宣布握手協議完成。
服務端-change_cipher_spec:
- 改變密碼格式信息,告訴客戶端之后的報文消息用會話密鑰加密。
服務端-finished:
- 向客戶端宣布握手協議完成。