1. 程式人生 > 其它 >HTTPS加密(SSL)

HTTPS加密(SSL)

HTTPS加密(SSL)

基本原理

1.客戶端向服務端傳送https請求,即輸入網址後,連結到伺服器的443埠

2.在服務端(如果採用https協議的話)就必須要有一套數字證書,這個證書其實就是一對公鑰和私鑰。

3.客戶端請求完後,服務端會向客戶端傳送一個證書,也就是一個公鑰,這裡稱作公鑰A,裡面還包含許多其他東西,如頒發的機構,過期時間等。

4.客戶端解析證書,這部分工作由SSL/SLS實現,如果認證成功了,就會在客戶端自己這生成一個隨機數,然後用公鑰A,對隨機數進行加密,這個加密後的結果只有服務端可以解密。

5.客戶端收到這個加密資訊後可以用自己的私鑰解密,得到隨機數,目的就是讓只有客戶端服務端知道這個隨機數,隨後就用這個隨機數進行對稱加密

6.然後客戶端將內容和私鑰(隨機數)通過某種演算法混合在一起後,這樣只有知道私鑰才能獲取內容,而只有客戶端和服務端知道這個私鑰

7.客戶端收到資訊後,解密得到內容。

SSL/TLS


HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,也就是說HTTPS其實有兩部分構成,一部分是http另一部分是SSL/TLS,就是在http上面加上了一層處理加密資訊的模組。

SSL/TLS握手過程

客戶端發出請求

客戶端向伺服器端發出加密請求,提供資訊如下

(1) 支援的協議版本,比如TLS 1.0版。

(2) 一個客戶端生成的隨機數,稍後用於生成"對話金鑰"。

(3) 支援的加密方法,比如RSA公鑰加密。

(4) 支援的壓縮方法。

ClientHello抓包示例

Ramdom表示客戶端生成的隨機數

Session ID:如果該客戶端第一次連線到伺服器,則這個欄位為空;如果不為空說明在這之前連線過伺服器,通過驗證之後,伺服器會用這個Session ID 去對映對稱金鑰,這種情況下不需要ssl握手

Cipher Suites :加密套件,指客戶端支援的加密方式

Compression:壓縮方法,為了減少頻寬可以進行壓縮。

服務端迴應

服務端收到客戶端請求後,迴應資訊

(1) Version: 確認使用的加密通訊協議版本,比如TLS 1.0版本。如果瀏覽器與伺服器支援的版本不一致,伺服器關閉加密通訊。

(2) Random:一個伺服器生成的隨機數,前4個位元組表示伺服器的Unix紀元時間,後面加上28位元組的隨機數,稍後用於生成"對話金鑰"。

(3) Cipher Suite:確認使用的加密方法

(4) Session ID:用於和Server hello 一起傳送到客戶端,客戶端可以把這個欄位寫入自己的session id裡面,下次連線的時候,就不用ssl握手了

Server Hello抓包示例

Certificate抓包示例

由伺服器向客戶端傳送X.509證書

證書裡面包含公鑰,公鑰用來給客戶端用來驗證的時候加密使用

ServerDone抓包示例

該訊息表示伺服器已經將所有資訊傳送完畢,接下來等待客戶端的訊息。

客戶端迴應

客戶端收到服務端迴應後,首先要驗證服務端給過來的數字證書,如果證書不是可信機構頒佈、或者證書中的域名與實際域名一致、或者證書已經過期,就會向訪問者顯示一個警告,由其選擇是否還要繼續通訊。

如果證書沒有問題,客戶端就會從證書中取出伺服器的公鑰。

Client Key Exchange抓包示例

(1) 根據之前從伺服器端收到的隨機數,按照不同的金鑰交換演算法,算出一個pre-master,傳送給伺服器,伺服器端收到pre-master算出main master。

(2) 編碼改變通知,表示隨後的資訊都將用雙方商定的加密方法和金鑰傳送。

(3) 客戶端握手結束通知,表示客戶端的握手階段已經結束。這一項同時也是前面傳送的所有內容的hash值,用來供伺服器校驗。

服務端最後迴應

服務端收到隨機數後,計算生成本次回話所有的“會話金鑰”,然後傳送下列資訊

(1)編碼改變通知,表示隨後的資訊都將用雙方商定的加密方法和金鑰傳送。

(2)伺服器握手結束通知,表示伺服器的握手階段已經結束。這一項同時也是前面傳送的所有內容的hash值,用來供客戶端校驗。

應用資料傳輸

在所有的握手階段都完成之後,就可以開始傳送應用資料了。應用資料在傳輸之前,首先要附加上MAC secret,然後再對這個資料包使用write encryption key進行加密。在服務端收到密文之後,使用Client write encryption key進行解密,客戶端收到服務端的資料之後使用Server write encryption key進行解密,然後使用各自的write MAC key對資料的完整性包括是否被串改進行驗證。

參考文件:https://cshihong.github.io/2019/05/09/SSL%E5%8D%8F%E8%AE%AE%E8%AF%A6%E8%A7%A3/

https://xz.aliyun.com/t/2531

SSL剝離(SSL Strip)

在日常上網過程,我們更傾向於直接使用www.example.com去訪問網站,不去新增http/https協議頭

瀏覽器會預設新增http:// 頭部,如果這時候這個example網站是使用Https協議

則會發送302重定向狀態碼一個HTTPS的跳轉網址

然後瀏覽器重新請求,因為過程中存在一次不安全http請求,所以存在漏洞

攻擊者干預了 HTTP 到安全 HTTPS 協議的重定向,並攔截了使用者到伺服器的請求。 然後,攻擊者將繼續在自己和伺服器之間建立 HTTPS 連線,並與使用者建立不安全的 HTTP 連線,充當它們之間的 “橋樑”。

參考文件:https://learnku.com/security/t/42552

什麼是HSTS?

HSTS(Http Strict Transport Security)是一種web安全協議

作用在於在本地強制客戶端(如瀏覽器)使用HTTPS與伺服器建立連線

它的基本機制是在伺服器返回的響應中,加上一個特殊的頭部,指示瀏覽器對於此網站,強制使用 HTTPS 進行訪問

Strict-Transport-Security: max-age=31536000; includeSubdomains; preload

https://juejin.im/post/6844904128146046983 一文帶你瞭解中間人攻擊和HSTS