[安全] HTTPS的理解

風間悠香發表於2020-05-27

一、概述

在下面的章節,我們要搞明白以下幾個問題:

  • HTTP和HTTPS的區別,為什麼要使用HTTPS
  • HTTPS如何解決加密問題
  • HTTPS如何避免中間人攻擊
  • CA證書是什麼
  • CA證書是如何申請和頒發的
  • HTTPS的整體流程

二、HTTP和HTTPS的區別

HTTP是什麼:

首先,我們知道HTTP的全名是超文字傳輸協議,主要是用來供客戶端(一般為瀏覽器)與伺服器之間傳遞WEB資料的一種應用層協議。

而原始的HTTP協議只規定了傳輸資料包的格式以及互相之間協商好的欄位,這些格式和欄位是客戶端與伺服器都能理解的內容。

但是HTTP協議的整個應用層資料包(TCP報文的payload),所有的內容都是明文的。

也就是說,當我們從傳輸路徑中某個位置使用抓包工具或其他手段擷取到這個資料包,就能輕鬆的獲取其中的請求和響應內容。

舉個例子:

A和B用一種語言對話(例如中文),當黑客C使用手段擷取的A和B的談話內容,他只需要自己會中文或找個會中文的人進行翻譯就知道A和B的談話內容了。

 

HTTPS是什麼:

我們瞭解了HTTP大概的工作原理,就知道HTTP僅僅實現了一種資料通訊的協議,但是是並不安全的。

而如何讓客戶端和伺服器之間的資料交換變得安全,那麼就需要有以下兩個措施:

1.傳輸的資料內容是加密的而非明文的

2.瀏覽器在訪問伺服器的時候,能夠驗證伺服器的身份(即我當前訪問的伺服器就是我想要訪問的伺服器,而非假冒的),避免中間人攻擊(黑客在中間假冒客戶端和伺服器,兩邊進行欺騙)

當解決了以上兩個問題,那麼HTTP就變成了一個安全的傳輸協議,即我們要學習的HTTPS協議。

舉個例子:

A找到B的時候,要求B出示一個證明身份的證件(例如身份證),確認了B的身份後。採用一種黑客無法擷取的方式(具體方式在後面詳細解釋)商議了一個密碼本,用來加密要交流的內容。這時A和B的交流內容都通過密碼本加密,C擷取到也無法解密。

 

HTTP和HTTPS的區別:

  • HTTP是不安全的,傳輸內容是明文的,不能確定伺服器的真實身份
  • HTTPS是安全的,傳輸內容是加密的,可以確定伺服器的身份

三、HTTPS的加密問題

1.加密相關的幾個概念

1)對稱加密

概念:採用單鑰密碼系統的加密方法,同一個金鑰可以同時用作資訊的加密和解密,這種加密方法稱為對稱加密,也稱為單金鑰加密。

使用一個公式來描述:

  加密:f(key,data) = X
  解密:g(key,X) = data

data為我們想要加密的內容,key就是對稱加密使用的單祕鑰,X為加密後的內容。f為加密,g為解密。

常見的對稱加密演算法有DES、3DES、AES等,目前用得比較多的是AES加密。

2)非對稱加密

概念:非對稱加密演算法需要兩個金鑰來進行加密和解密,這兩個金鑰是公開金鑰(public key,簡稱公鑰)和私有金鑰(private key,簡稱私鑰)。

使用一個公式來描述:

A-->B方向:
  加密:f(pk,data) = X
  解密:g(sk,X) = data
B-->A方向:
  加密:f(sk,data) = Y
  解密:g(pk,Y) = data    

假設A是客戶端,B是伺服器。

當A向B發資料時,A使用公鑰(pk)加密,得到加密後的資料X。

B收到X後,使用私鑰(sk)解密。

當B向A發資料時,B使用私鑰(sk)加密,得到加密後的資料Y。

A收到Y後,使用公鑰(pk)解密。

注意:所有能夠與B伺服器交換資料的客戶端都可以持有公鑰,而伺服器持有私鑰(只有服務端B有私鑰)。可以參考SSH協議中的私鑰和公鑰。

常見的非對稱加密演算法有:RSA、DSA、ECDSA等。

3)HASH雜湊

概念:HASH雜湊是把任意長度的輸入(又叫做預對映pre-image)通過雜湊演算法變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,所以不可能從雜湊值來確定唯一的輸入值。簡單的說就是一種將任意長度的訊息壓縮到某一固定長度的訊息摘要的函式。

hash雜湊有什麼作用?

我們一般使用雜湊值來比較一個檔案或一段內容是否被篡改。例如在我們使用迅雷或其他下載工具下載了一個軟體,我們想驗證是否下載完整則可以使用它的雜湊值進行比對,如果一致則下載完整,如果不一致則內容有問題。

常用的Hash雜湊演算法有:MD4、MD5、SHA1、SHA-256等。

2.只使用對稱加密的情況

我們在HTTP的基礎上讓客戶端(瀏覽器)和伺服器只使用對稱加密,如下圖所示:

 從圖中可以看出,客戶端和伺服器之間如果只使用對稱加密技術,則始終需要商議一個加密用的祕鑰(key,例如一個隨機字串)。在這個商議的過程中,黑客就可以介入進行擷取,只要黑客獲取到這個key,那麼後面的對稱加密就完全失效了。

3.只使用非對稱加密的情況

在HTTP上只使用非對稱加密的技術,如下圖所示:

 可以看到,黑客可以擷取到公鑰以及之後傳輸的資料,並可以解密伺服器發給客戶端的資料,同樣存在資料安全的問題。(這裡只討論資料加密的安全問題,中間人攻擊在後面討論)

4.同時使用對稱加密和非對稱加密的情況

既然只使用對稱加密和只使用非對稱加密都無法避免資料被黑客擷取,那麼我們可以將對稱加密和非對稱加密結合起來使用,如下圖:

從圖中可以看到,我們使用非對稱加密演算法來協商對稱加密的祕鑰key。客戶端拿到伺服器的公鑰後,產生一個隨機的key,然後使用公鑰對其進行加密,併傳送給伺服器。

由於公鑰加密的內容只有私鑰才能解密,也就是說黑客即便擷取到了公鑰,也無法獲取到key。

所以之後的資料使用key進行對稱加密是絕對安全的。

 

從以上過程我們可以看到,使用對稱加密+非對稱加密的方式可以使黑客無法通過擷取的方式來獲取資料,看似已經很安全了,但是我們還要討論一種情況,就是中間人欺騙攻擊。

5.中間人欺騙攻擊

在第4節的基礎上,可能出現以下情況,如圖:

 

黑客在中間充當一箇中間人,讓客戶端以為自己是伺服器,讓伺服器以為自己是客戶端。

他使用一套假的非對稱加密祕鑰來與客戶端進行通訊,而使用伺服器給的真的公鑰與伺服器進行通訊,從中將資料解密並重新加密,起到兩邊欺騙的效果。

 

那麼,如何防範這種中間人欺騙的攻擊呢?

那就需要伺服器能夠證明自己的身份。客戶端從伺服器拿到公鑰的同時,還要能夠確定當前通訊的伺服器的身份是正確的(從而才能確保拿到的公鑰是正確的,使用該公鑰加密,只有正確的伺服器才能解密)。

四、HTTPS如何避免中間人攻擊

為了避免中間人欺騙攻擊,需要伺服器能夠向客戶端(瀏覽器)證明自己的身份。那麼如何證明呢?

舉個例子,我們去坐飛機、坐火車,在進站的時候需要出示自己的身份證來證明自己的身份。而這個身份證不是隨便誰都可以頒發的,而是需要一個權威的機構來頒發,身份證就是我們國家的公安機關來頒發的,並且具有一定的防偽措施(暫時理解為絕對可靠的)。

那麼,伺服器的身份證是什麼呢?答案就是我們下面要討論的CA證書,而CA證書的頒發機構就相當於公安機關,他是一個網際網路行業認可的一些機構(有多家)。下面我們就來了解一下CA證書以及CA機構。

1.CA機構的根證書

CA機構可以對其他公司(伺服器所屬公司)和提供的web服務(伺服器)進行證書籤發。而為這些伺服器頒發證書需要有一個根證書。

根證書:

概念:根證書是未被簽名的公鑰證書或自簽名的證書。

什麼意思呢?即CA認證機構的ROOT證書,實際上就是CA認證機構的相關資訊加上他生成的一對非對稱加密祕鑰中的公鑰。如下圖:

這個證書中包含CA機構的一個公鑰(CPK),還有CA機構的一些明文資訊。對應的私鑰由CA機構自己妥善儲存,用於為其他公司提供的web伺服器簽發證書時加密簽名使用。

當我們認可一個CA機構時,就需要在瀏覽器中下載安裝該機構的根證書,一般瀏覽器會內建他所信任的CA機構根證書(所以一般不會手動去安裝)。

也就是說,我們的瀏覽器(客戶端)中已經有CA機構的根證書了(這個很重要,後面會使用到它),CA機構自己保留著CSK(私鑰)。

2.CA證書和申請流程

當一個公司想提供一個HTTPS的伺服器,則需要在網際網路認可的幾家CA認證機構中選擇一家來申請CA證書。

首先,我們看一下CA證書的結構(以百度為例):

首先,百度生成一對非對稱祕鑰(包含公鑰和私鑰),私鑰(SK)自己儲存,而公鑰(PK)提供給CA機構,同時提供自己公司和提供服務的相關資訊。

CA機構收到申請後,大概執行以下操作:

1)對該公司以及服務進行核實,確認是否滿足申請條件

2)將公鑰和所有其他明文資訊使用HASH演算法(例如MD5演算法)進行雜湊,得到一個雜湊值(也叫資訊摘要),這個雜湊值主要用於以後判斷資訊是否被篡改(例如公鑰被篡改,則雜湊值會改變)

3)將生產的雜湊值,使用CA機構的私鑰進行加密(CSK私鑰),得到一個數字簽名

4)將百度提供的公鑰、資訊、數字簽名形成一個CA證書,頒發給百度,放到伺服器中

3.瀏覽器從伺服器獲取證書

此時,瀏覽器在與伺服器建立HTTPS連線的時候,伺服器會將CA證書傳送給瀏覽器。

瀏覽器拿到這個CA證書後,會做如下操作:

1)先檢視CA證書中關於CA機構的資訊,然後從瀏覽器安裝的根證書中找到對應的CPK(如果沒有,則提示證書有問題)

2)使用CPK對數字簽名進行解密,得到HASH雜湊值(摘要)

3)使用與CA機構相同的HASH演算法(例如MD5)對CA證書中的PK和明文資訊進行HASH雜湊,得到自己算出來的雜湊值

4)對比解密得到的雜湊值與自己計算出來的雜湊值是否相同,如果相同則認為CA證書沒有被篡改過,如果不相同,則提示證書有問題

5)在CA證書無誤的情況下,證書中的PK(即百度的公鑰)也是合法可用的,後面就可以使用這個公鑰來加密key了(對稱加密的祕鑰,或祕鑰的一部分)

 

這裡其實已經回答瞭如何避免中間人欺騙攻擊這個問題了:

  因為如果中間人修改了CA證書中的PK或其他任何資訊,那麼客戶端計算出的HASH值一定和解密出來的HASH值不一樣(或無法解密)。

五、HTTPS的整體流程

既然已經搞清楚了CA機構、CA證書、對稱加密、非對稱加密、HASH雜湊,那麼我們將其流程竄起來就是HTTPS的工作流程了,如圖:

 

流程解析,前提是已經建立了TCP連線:

1)客戶端向伺服器傳送Client Hello,其中包含一個隨機數1(Random1),還有客戶端支援的加密方式(一個列表),如下所示:

2)伺服器返回Server Hello,包含random2隨機數,和選定的加密方式,如下所示:

 

3)伺服器傳送CA證書給客戶端,如下所示:

 

4)驗證證書合法性,即解密數字簽名,計算HASH值,然後進行對比

5)驗證通過後,客戶端生成一個random3隨機數,並連同random1和random2(之前通訊時傳送給伺服器的random1,以及伺服器傳送給客戶端的random2),計算出一個key值(就是後面進行對稱加密用的key)。

6)使用CA證書中的PK,對random3進行加密(key的一部分,並非key本身,因為黑客也可能拿到證書中的PK),併傳送給伺服器。

7)伺服器收到加密後的random3,使用SK(證書中公鑰PK對應的私鑰,在百度伺服器上儲存著)解密,得到random3。

8)同樣使用random1、random2和random3計算一個key值,計算方式是大家協商好的,所以計算出的key值和客戶端計算出的key值應該是一樣的。這個key就是對稱加密使用的祕鑰。

9)客戶端通過key對資料進行加密,傳送給伺服器,伺服器使用key解密資料。

10)伺服器通過key對資料進行加密,傳送給客戶端,客戶端使用key解密資料。

 

至此,整個HTTPS的大體流程就完成了,本文並未對特別細節的地方做描述,只是希望能夠將自己的理解形成通俗易懂的文字,供大家參考。明白了工作原理,要研究細節部分就很容易了。

===

 

相關文章