握手協議是指客戶端和服務器之間交換的一系列訊息,
訊息格式
| 型別 | 長度 | 內容 |
|---|---|---|
| 1位元組 | 3位元組 | ≥0位元組 |
型別
表示10種訊息中的一種,所有型別如下:
| hello_request | 空 |
|---|---|
| client_hello | 建立初始的邏輯連接 |
| server_hello | 同上 |
| certificate | 一系列證書 |
| certificate_request | 請求證書 |
| certificate_verify | 證書驗證 |
| server_key_change | 服務器秘鑰交換 |
| client_key_change | 客戶端秘鑰交換 |
| server_done | 訊息結束,等待回復 |
| finished | 密碼已經變更完成 |
長度
訊息長度(位元組),
內容
階段1:建立安全功能
由客戶端發起,建立初始的邏輯連接,并為后面的階段交換所需引數,

client hello訊息內容:
- 版本號:客戶端支持的最高TLS版本,
- 亂數:32位的時間戳 + 客戶端生成的28位元組的亂數,可以為這次握手防止重放攻擊,但不作為后續密鑰的引數,
- 會話標志:分為0值和非零值,
0值:客戶端想在新會話上建立一個新連接,
非0值:在原會話上建立一個新連接, - 密碼組:按優先級降序排列的密碼演算法串列,表中每行包括2個元素:密鑰交換方法和CipherSpec(密碼說明),
- 壓縮方法:客戶端支持的所有壓縮方法的串列,
server hello訊息:
-
版本號:決定使用的版本號,
-
亂數:服務器生成的亂數(也同時生成了時間戳),
-
會話標識:
若客戶端發的是0值:則服務器生成一個新連接,發回新ID,
若客戶端是非0值:則服務器發送同樣的數值, -
密碼組:決定使用的密碼組,
-
壓縮方法:決定使用的壓縮方法,
密碼組詳情
- 交換密鑰的方法
① RSA 非對稱加密
② 固定DH
③ 瞬時DH
④ 匿名DH- cipher spec 密碼說明
① 密碼演算法(任何演算法,如RC4,DES3,IDEA等)
② MAC演算法(MD5,SHA-1)
③ 密碼型別(流 / 塊)
④ 可否出口(可 / 不可)???
⑤ 散列長度(0 / 16(MD5) / 20(SHA-1))
⑥ 密鑰材料???
⑦ IV大小(CBC分組的初始向量大小)
.
.
階段2:服務器的認證和密鑰交換
服務器承接階段1,繼續發送訊息,可能發送 對自己身份的認證,密鑰引數(哪個密鑰?)和請求客戶端表明身份等等,

certificate 訊息:
- 內容:一個或一組X.509證書(證明服務器身份,具體查看X.509部分),
- 不需要certificate訊息:使用匿名DH ,
- 若是固定DH 會在此訊息中附加服務器DH公鑰的引數(后面無需再發server key change訊息)
server_key_change 訊息:
- 不需要此訊息的情況:
① 若服務器發送了帶有固定DH的引數的certificate訊息;
② 若使用RSA密鑰交換(???),
. - 必需此訊息的情況:
① 匿名DH(兩個全域DH值 和 服務器DH公鑰),
② 瞬時DH(三個DH引數)),
③ RSA,且服務器僅用了RSA簽名密鑰,???
certificate request訊息:
- 內容:證書型別 + 簽證機構,
- 證書型別:表明公鑰演算法和它對應的用途???
RSA:僅用于簽名
DSS:僅用于簽名
固定DH的RSA:發送RSA簽名證書,其簽名僅用于認證,
固定DH的DSS:僅用于認證, - 簽證機構:可接受的簽證機構串列
server done 訊息:
-
表明服務器hello結束,等待客戶端應答,
-
無引數
.
.
階段3:客戶端的認證和密鑰交換
在收到server done后,客戶端檢驗服務器的證書合不合法,再檢驗server hello的引數能否接受,一切無誤之后,開始向服務器發送訊息,

certificate 訊息:
- 如果服務器發了certificate request,那么客戶端才會回應certificate,
若不能提供合適的證書,客戶端會發一條“無證書警告”,
client key change 訊息:
- 內容 依賴于雙方共同決定的密鑰交換型別:
① RSA:.客戶端生成的48位元組次密鑰,并用服務器certificate中的公鑰 / server key change中的臨時RSA密鑰加密,后面用它生成主密鑰,???
② 瞬時DH 和 匿名DH:發送客戶端DH公鑰引數,
③ 固定DH:由于certificate訊息中已包含DH引數,故此條訊息為空,
certificate verify 訊息:
- 提供對客戶端證書的精準認證,(只有客戶端證書具有簽名能力時才會發送)???
.
.
階段4:完成

change cipher spce 訊息(不屬于握手協議):
- 客戶端示意 變更密碼規范,并從cipher spec中復制,以掛起cipher spec,
- 于是客戶端開始以新的演算法和密鑰發送訊息
client finished 訊息:
- 客戶端發送完成訊息,
change cipher spce 訊息(不屬于握手協議):
- 在收到上面2個訊息后,服務器 變更密碼規范,也從cipher spec中復制,以掛起cipher spec,
- 于是服務器開始以新的演算法和密鑰發送訊息
server finished 訊息:
- 服務器發送完成訊息,
.
此時 握手完成,客戶端和服務器開始交換應用層資料,
.
.
.
.
.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/124942.html
標籤:其他
上一篇:楊超越第一,Python第二
下一篇:抖音靈魂出竅特效實作思路
