一、概述
在下面的章節,我們要搞明白以下幾個問題:
- 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的大體流程就完成了,本文並未對特別細節的地方做描述,只是希望能夠將自己的理解形成通俗易懂的文字,供大家參考。明白了工作原理,要研究細節部分就很容易了。
===