背景
Https即HTTP over TLS。為避免Http明文傳輸帶來的安全隐患,我們可以對傳輸的資料進行加密,考慮到性能問題,使用對稱加密算法。用戶端需要知道服務端使用的密鑰及加密算法,如何保證密鑰的安全傳輸呢?這裡可以使用非對稱加密算法,使用服務端的公鑰pubKey來加密傳輸密鑰key。公鑰是明文傳輸的,中間人仍然可以使用自己的公鑰加密key欺騙用戶端。
TLS使用證書進行身份認證,保證服務端是受信任的,同時證書中使用數字簽名防止被篡改。這樣保證了pubKey的安全傳輸TLS使用協商機制來選擇對稱加密使用的算法
抓包分析
- 選擇使用的網卡,設定捕捉過濾器host blog.csdn.net (也可以不設定,抓包後通過顯示過濾器檢視),開始抓取。
2. 使用curl https://blog.csdn.net/u010648018/article/details/103447167發起一次https請求
3. 可以看到,首先是tcp的三次握手,然後是tls協商加密算法與密鑰交換過程
4. Client Hello,用戶端向服務端發送一個随機數和支援的加密算法
5. Server Hello,服務端向用戶端發送随機數和選擇的加密算法(ECDHE)
- Certificate, Server Key Exchange, Server Hello Done
- Certificate 服務端向用戶端發送證書鍊。證書用于身份認證,其中包含服務端公鑰PubKey
- Server Key Exchange 根據上面具體選擇的加密算法(ECDHE)準備生成密鑰需要的一些參數(premaster)。(RSA算法沒有該步驟)
- Server Hello Done 表明服務端的Hello消息發送完畢
- Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
- Client Key Exchange 在驗證服務端發送證書可信後,生成加密算法所需的一些參數
- Change Cipher Spec 告訴服務端以後要使用選擇的加密算法加密資料
- Encrypted Handshake Message 根據之前用戶端和服務端生成的随機數、加密算法所需的一些參數生成會話密鑰key,對之前的握手消息的Hash值和Mac值進行加密,來驗證該加密密鑰是否可用。服務端以相同的方法生成會話密鑰解密該消息,校驗其中的Hash值和Mac值。
- Change Cipher Spec, Encrypted Handshake Message
- Change Cipher Spec 告訴用戶端以後要使用該加密算法來加密資料
- Encrypted Handshake Message 使用會話密鑰key加密之前的握手消息的Hash值和Mac值,發送給用戶端校驗
9. 雙方校驗完成,發送加密的應用資料