Https的全稱是Http over SSL,而SSL是在TCP協議之上的保密層,但是它也是屬於傳輸層的,如果直接傳輸Http,報文的信息安全是無法被保障的,因爲它在應用層的信息傳輸是明文傳輸的。
過程
Https傳輸建立的過程可以分爲兩個過程,信任建立的過程和連接建立的過程,如果再細分可以分爲九個步驟,分別是:
- Client Hello
- Server Hello
- 服務端向客戶端發送CA證書
- 客服端發送Pre-master Secret
- 客戶端發送消息:將使用加密通信
- 客戶端發送:Finished
- 服務器發送消息:將使用加密通信
- 服務端發送:Finished
- 連接正式建立,發送正式報文
Client Hello
客戶端首先會給服務器發送Client Hello, Client Hello中主要包含了以下這幾個消息:
- 客戶端可以使用的SSL/TLS版本
- Ciper Suites
- 服務器名稱
- 客戶端隨機數
其中Ciper Suites其實就是Ciper Suite的集合,也就是說Ciper Suites包含了一個或多個Ciper Suite,那麼Ciper Suite到底是什麼呢?其實就是對稱加密算法,非對稱加密算法和Hash算法的一個組合,下面就是一個例子
Ciper Suite:AES_RSA_SHA1
Ciper Suites就是幾個Ciper Suite的集合,像這樣:
AES_RSA_SHA1、DES_DSA_MD5、AES_RSA_MD5
Server Hello
客戶端收到服務器收到的這一系列消息之後,它會從客戶端發送的Ciper Suites中挑選出一個Ciper Suite和SSL/TLS版本,然後和自己生成的客戶端隨機數一起發送給客戶端,就是這幾個部分:
- 服務器挑選出的SSL/TLS版本
- 服務端挑選出的Ciper Suite
- 服務端隨機數
服務端CA證書驗證
服務端得向客戶端證明自己就是剛剛客戶端發送消息的那個服務器,而CA證書裏面就包含了這樣的信息,需要注意的是,服務端發送給客戶端的證書包含的信息並不只是證書本身,也包含了給它發證的簽發機構的信息。證書包含的信息大概如下:
- 本身信息
- 證書信息(域名等)
- 證書公鑰
- 證書籤名算法
- 證書籤名
- 簽發機構證書信息
- 證書信息
- 簽發機構公鑰
- 簽發機構簽名算法
- 簽發機構的簽發機構
驗證證書的過程是這樣的:
- 證書對自身的證書信息使用證書的簽名算法做一個Hash
- 利用簽發機構的公鑰去對步驟1得到的信息做一次驗證,如果驗證成功則說明CA證書本身的信息是可信賴的,但簽發機構自身還需要驗證自己是可信賴但
- 用客戶端自身的證書公鑰去對2得到的信息做驗證,驗證成功則說明證書的簽發機構是可信賴的,服務端與客戶端的信任就建立起來了,如果驗證失敗則需要進行提示,如是否信任此證書等等
有些機構,如銀行等,可能會對客戶端也做一次驗證,大致過程和服務端驗證相似
客戶端發送Pre-master Secret
Pre-master Secret是由客戶端通過自身信息算出來的,客戶端將會把Pre-master Secret使用剛剛在證書中獲得的證書公鑰加密後發送給服務器,服務器收到Pre-master後,客戶端和服務器都將協商出一個Master Secret, 因爲客戶端和服務器都擁有 客戶端隨機數、服務器隨機數、Pre-Master Secret,如圖所示
得到Master Secret之後客戶端和服務器將使用 Ciper Suite和Master Secret一起計算出客戶端密鑰和服務端密鑰以及客戶端MAC Secret和服務器MAC Secret,如圖:
做完這步之後客戶端和服務器會繼續建立通信
客戶端通知:將使用加密通信
這裏其實僅僅只是發送了一個幾字節的通知而已,客戶端告訴服務器將使用加密通信
客戶端發送Finished消息
在這裏客戶端將發送一個Finished消息,這個Finished消息實際上是對上述客戶端與服務端發送的消息的一個彙總,用來使服務器來驗證客戶端是不是剛剛建立信任的客戶端,Finished消息結果了兩步加工:
- 使用HMAC對消息進行HASH
- 使用客戶端密鑰對消息進行加密
HMAC是在獲得了客戶端MAC Secret和服務端MAC Secret後服務器和客戶端都得到的HASH算法
服務端在收到客戶端發送的Finished消息後將對消息進行驗證,步驟如下:
1. 服務端對之前所有的消息也做一個HMAC
2. 服務端對客戶端發送過來的Finished消息進行解密(因爲服務端也有客戶端密鑰)
3. 服務端對1和2得到的消息進行比對,如果一樣則說明發送消息的客戶端是之前建立起信任的客戶端,將進行之後步驟
服務器發送將使用加密通信和Finished消息
這兩個步驟其實跟前面客戶端發送加密通信和Finished消息是一樣的,所有這裏就略過了
客戶端發送正式的報文
從這個步驟開始客戶端和服務器就開始正式的通信了,從應用層看發送的報文的話只會得到這是一個應用層的消息,具體的消息只能看到類似與亂碼,與Http明文通信對比十分鮮明。
總結
可以用一張圖來概括