HTTPS詳解

寫在前面

參考
https連接的前幾毫秒發生了什麼
HTTP與HTTPS的區別


HTTPS概念

HTTPS = HTTP + TLS
使用TLS對數據進行加密,但是數據傳輸依舊使用的是TCP。因此HTTPS作用有二:一是保護數據安全,二是通過證書驗證網站的真實性。
HTTPS主要解決的問題是中間人攻擊,中間人攻擊一是可以竊取連接過程中的數據並篡改,二是可以欺騙客戶端將數據包發往中間人處。
有了HTTPS可以很好地解決這個問題:可以通過證書驗證網站的可信度並且對數據進行加密防止被篡改。


HTTP與HTTPS的區別

  1. https需要證書,可以自己製作或者購買。自己製作的沒有得到驗證將會跳出彈窗請求用戶允許。
  2. http數據是明文傳輸的,https則是加密傳輸。
  3. http端口爲80,https爲443。

HTTPS工作原理

https的連接有幾個過程,下面一一說明。

客戶端發起HTTPS請求

瀏覽器會給服務器發送一個包,主要有以下信息:

  • TLS版本:主要說明客戶端使用TLS的版本號

  • 隨機字符串: 用於之後的密鑰對生成

  • sessionId: 會話id,第一次連接時爲0。之後可以通過這個sessionId進行重新連接而不需要進行握手階段。

  • 瀏覽器支持的所有加密方式: 發送給服務器讓其選擇一個加密方式,之後按照這個加密方式給數據進行加密。

  • 域名信息: 雖然握手階段是在傳輸層的,但是獲取相應證書需要發送域名信息。

服務端迴應(Server Hello)

這個包會發送到客戶端,裏面的內容和上面客戶端發送包的內容差不多。

  • sessionId: 服務端發送給客戶端設置其sessionId。

  • 隨機字符串: 用於之後的密鑰生成。

  • 服務端選擇的加密方式: 上面有提到客戶端會發送一系列加密方式給服務端選擇,服務端會將其選擇返回給服務端。

服務端發送證書

隨後服務端會發送證書給客戶端,證書不一定是一份,而且很有可能是多份。每一份證書和上級證書都有依賴關係,這樣只需要驗證最上級證書的可靠性就可以保證下級證書的可靠性。
證書有以下內容:

  • 簽名:表示證書的依賴關係。如果驗證了簽名正確,那麼就可以驗證下級證書的正確性。簽名是服務端用密鑰與tbsCertificate加密得到的一個字符串。
  • 簽名算法
  • tbsCertificate(to be signed Certificate): 包含申請證書時的國家、地區、城市、證書支持的域名、申請時間以及過期時間等。最重要的是證書的公鑰

這裏主要說一下簽名的用處,簽名主要是用來檢驗證書是否被篡改過的。
主要的方式是 1. 客戶端會使用穿過來的公鑰對簽名進行解密,得到一個hash值。2. 計算tbsCertificate的DER編碼值的hash值。 3. 對比二者的hash值,若相同表示沒有被篡改過。

進行密鑰交換

上面說過服務器會選擇一個加密方式比如

Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)

其中這表示服務器選中的密鑰交換加密方式爲RSA數據傳輸加密方式爲AES檢驗數據是否合法的算法爲SHA256.
密鑰交換的過程是這樣的:

  1. 服務端傳來一個包包含它的公鑰。
  2. 客戶端使用上面服務端傳來的隨機值和這個公鑰進行加密,生成自己的密鑰對。
  3. 發送自己的公鑰給服務端。

RSA:

(1)乙方生成兩把密鑰(公鑰和私鑰)。公鑰是公開的,任何人都可以獲得,私鑰則是保密的。
(2)甲方獲取乙方的公鑰,然後用它對信息加密。
(3)乙方得到加密後的信息,用私鑰解密。

所以此時雙方都擁有對方的公鑰,可以使用這個進行加密,對方再用私鑰進行解密。

進行數據傳輸

交換完密鑰後,服務端會發送一個明文包給客戶端表示可以其已經準備好傳輸了,客戶端也會發送一個這樣的包表示自己準備好了。然後客戶端就可以開始進行數據傳輸了。


缺點

說了這麼多,難道HTTPS沒有缺點嗎?

  1. 建立https需要花費時間(~0.3s)
  2. 數據需要加密和解密,佔用更多的cpu
  3. 數據加密後比原信息更大,佔用更多的帶寬
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章