1. 程式人生 > 實用技巧 >HTTP和HTTPS協議及工作原理分析

HTTP和HTTPS協議及工作原理分析

HTTP協議概念

HTTP協議(HyperText Transfer Protocol,超文字傳輸協議,屬於應用層)是用於從伺服器傳輸超內容到本地瀏覽器的傳送協議。是一個無狀態的協議

想了解http,就需要了解TCP,IP協議。因為http是基於TCP,IP層上面的。如下圖所示:

整張圖應該從下邊向上看,假設別人想發一條資訊給我的電腦。首先是通過網路把資訊傳導到的電腦,但不能說我的電腦對於所有的資訊都接受,我會判斷資訊,之後在處理資訊,這些就是七層模型做的事情。一步一步分開來看 ,並用打電話這一建立的例子來對應:

  1. 物理層 包括物理連網媒介,實際上就是佈線、光纖、網絡卡和其它用來把兩臺網路通訊裝置連線在一起的東西。它規定了啟用、維持、關閉通訊端點之間的機械特性、電氣特性、功能特性以及過程特性。(這就相當於電信公司的訊號發射塔,接收訊號而已)
  2. 資料鏈路層 資料鏈路層主要作用是控制網路層與物理層之間的通訊。它保證了資料在不可靠的物理線路上進行可靠的傳遞。它把從網路層接收到的資料分割成特定的可被物理層傳輸的幀,保證了傳輸的可靠性。(相當於發射塔讓接受的訊號更穩定,方便下一層的解讀)
  3. 網路層 很多人經常混淆2層和3層的相關問題,簡單來說,如果你在談論一個與IP地址、路由協議或地址解析協議(ARP)相關的問題,那麼這就是第三層的問題。  網路層負責對子網間的資料包進行路由選擇,它通過綜合考慮傳送優先權、網路擁塞程度、服務質量以及可選路由的花費來決定從一個網路中兩個節點的最佳路徑。另外,它還可以實現擁塞控制、網際互連等功能 (相當於我們打一個長途電話,當前連線的發射站不能直接傳遞給另一使用者,需要先傳遞給附近的發射站)
    到這裡為止,其實資訊還沒有傳遞到我們的電腦,可以理解為資訊在路由網路間傳遞。
  4. 傳輸層 是OSI模型中最重要的一層,它是兩臺計算機經過網路進行資料通訊時,第一個端到端的層次,起到緩衝作用。當網路層的服務質量不能滿足要求時,它將提高服務,以滿足高層的要求;而當網路層服務質量較好時,它只需進行很少的工作。另外,它還要處理端到端的差錯控制和流量控制等問題,最終為會話提供可靠的,無誤的資料傳輸。(相當於我們找到了最後的訊號站,可以直接傳送訊號給通話者,但是這層會做一些資料的整合等工作)
  5. 會話層 會話層負責在網路中的兩節點之間建立和維持通訊,並保持會話獲得同步,它還決定通訊是否被中斷以及通訊中斷時決定從何處重新發送。
  6. 表示層 表示層的作用是管理資料的解密與加密,如常見的系統口令處理,當你的賬戶資料在傳送前被加密,在網路的另一端,表示層將對接收到的資料解密。另外,表示層還需對圖片和檔案格式資訊進行解碼和編碼。 (相當於發射塔給手機發送一些壓縮的資訊,我們手機接收到後解碼)
  7. 應用層   簡單來說,應用層就是為作業系統或網路應用程式提供訪問網路服務的介面,包括檔案傳輸、檔案管理以及電子郵件等的資訊處理。  應用層協議的代表包括:Telnet、FTP、HTTP、SNMP等。 (這就是真正的收到資訊,相當於我們聽到了對方的聲音,這次對話完成了)

總結起來就是:

  • 資訊發出(www)

  1. --->發射塔收到不穩定資訊流(物理層)
  2. ---> 發射塔整理資訊流(鏈路層)
  3. ---> 發射塔轉給離接收人更近的發射塔(網路層IP)
  4. ---> 發射塔向接收人傳送資訊(傳輸層TCP)
  5. ---> 通話建立(會話層)
  6. ---> 解碼資訊(表示層)
  7. ---> 發出聲音給接收人(應用層HTTP)
  • 看到資訊

對於HTTP網路應用,我們在網路層用的是IP,在傳輸層用的是TCP。
IP: internet protocal。顧名思義,網路協議。他能確保計算機之間在網路上互相通訊,但是他不檢查訊息是否以傳送次序到達而沒有損壞,因此,我們需要上一層來檢驗訊息。於是有了TCP層
TCP: 保證資訊正確次序,內容不變。同時引入埠分發給不同的服務。同時分割資料為更小的ip包,到達時重組。
HTTP: 當資訊解讀好,我們傳給HTTP層,即為應用層。超文字傳輸協議(HTTP,HyperText Transfer Protocol)是網際網路上應用最為廣泛的一種網路協議。所有的WWW檔案都必須遵守這個標準。設計HTTP最初的目的是為了提供一種釋出和接收HTML頁面的方法。

以上是對支撐HTTP的網路七層的概括,我們需要理解為什麼要在http層下面有那麼多層,每一層的目的是什麼。

明白了這些之後,問題來了,這七層是怎麼知道自己應該怎麼解讀資料,而不是說TCP層解讀HTTP層。這裡面就是網路資料的封裝和傳遞了:

從這個圖中,我們可以看到每一層的資料都會被一個這層的頭資訊包裹。
之後我們在接收到資訊時再一層一層讀取資訊

講完http,我們會發現,我們傳遞的資訊在網路上經過那麼多物理層的傳輸,保不準會被別人截獲,而我們卻一點也不知道。於是我們想到要加密我們傳輸的資料。因為只有http層資訊是我們要的,所以在這一層下面加入一層來加密資訊。這一層就是SSL層,同時我們如果想傳給ssl層,我們用埠443.
ssl層簡稱安全套階層,主要就是加密解密。
一開始我們會說,我們就讓伺服器給我們一個公鑰,每次用他來解密不就行了。但是這種辦法不可以,因為別人同樣可以截獲你的公鑰,畢竟公鑰也是在網路上傳遞的。
於是我們就要想一種辦法,讓我們的公鑰也被加密,並且這個加密方式是在伺服器或者我們電腦上進行的,這樣才安全

HTTPS協議

HTTPS(全稱:Hypertext Transfer Protocol over Secure Socket Layer),簡單來講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL。其所用的埠號是443。

SSL:(Secure Socket Layer,安全套接字層),通過使用證書認證來確保客戶端和網站伺服器之間的通訊資料是加密安全的。SSL協議位於TCP/IP協議與各種應用層協議之間。

TLS:TLS(Transport Layer Security,傳輸層安全協議),用於兩個應用程式之間提供保密性和資料完整性。SSL和TLS的主要區別?

TLS的主要目標是使SSL更安全,並使協議的規範更精確和完善。

說到HTTPS肯定少不了加解密演算法,我們來了解下相關內容

有兩種基本的加解密演算法型別:

1、對稱加密(symmetrcic encryption):金鑰只有一個,加密解密為同一個密碼,且加解密速度快,典型的對稱加密演算法有DES、AES,RC5,3DES等;例如我們建立一個帶密碼(口令)的加密壓縮包。當你下次要把這個壓縮檔案解開的時候,你需要輸入【同樣的】密碼。在這個例子中,密碼/口令就如同剛才說的“金鑰”。

對稱加密主要問題是共享祕鑰,除你的計算機(客戶端)知道另外一臺計算機(伺服器)的私鑰祕鑰,否則無法對通訊流進行加密解密。解決這個問題的方案是非對稱加密

2、非對稱加密:使用兩個祕鑰:公共祕鑰和私有祕鑰。私有祕鑰由一方密碼儲存(一般是伺服器儲存),另一方任何人都可以獲得公共祕鑰。一般來說指:加密時使用公鑰,解密時使用私鑰。

這種金鑰成對出現(且根據公鑰無法推知私鑰,根據私鑰也無法推知公鑰),加密解密使用不同金鑰(公鑰加密需要私鑰解密,私鑰加密需要公鑰解密),相對對稱加密速度較慢,典型的非對稱加密演算法有RSA、DSA等。


如圖:

總結及答疑

① 證書驗證階段

  1. 瀏覽器發起 HTTPS 請求
  2. 服務端返回CA證書(包含公鑰)
  3. 客戶端驗證證書是否合法,如果不合法則提示告警

② 資料傳輸階段

  1. 當證書驗證合法後,在本地生成隨機數
  2. 通過公鑰加密隨機數,並把加密後的隨機數傳輸到服務端
  3. 服務端通過私鑰對隨機數進行解密
  4. 服務端通過客戶端傳入的隨機數構造對稱加密演算法,對返回結果內容進行加密後傳輸

為什麼資料傳輸是用對稱加密?

非對稱加密的加解密效率是非常低的,而在https 的應用場景中通常客戶端端與服務端之間存在大量的ajax互動,非對稱加密的效率是無法接受的;

另外,在 HTTPS 的場景中只有服務端儲存了私鑰,一對公私鑰只能實現單向的加解密,所以 HTTPS 中內容傳輸加密採取的是對稱加密,而不是非對稱加密。

為什麼需要 CA 認證機構頒發證書?

HTTP 協議被認為不安全是因為傳輸過程容易被監聽、偽造伺服器,而 HTTPS 協議主要解決的便是網路傳輸的安全性問題。

首先我們假設不存在認證機構,任何人都可以製作證書,這帶來的安全風險便是經典的“中間人攻擊”問題。
“中間人攻擊”的具體過程如下:


過程原理:

  1. 本地請求被劫持(如DNS劫持等),所有請求均傳送到中間人的伺服器
  2. 中間人伺服器返回中間人自己的證書
  3. 客戶端建立隨機數,通過中間人證書的公鑰對隨機數加密後傳送給中間人,然後憑隨機數構造對稱加密對傳輸內容進行加密傳輸
  4. 中間人因為擁有客戶端的隨機數,可以通過對稱加密演算法進行內容解密
  5. 中間人以客戶端的請求內容再向正規網站發起請求
  6. 因為中間人與伺服器的通訊過程是合法的,正規網站通過建立的安全通道返回加密後的資料
  7. 中間人憑藉與正規網站建立的對稱加密演算法對內容進行解密
  8. 中間人通過與客戶端建立的對稱加密演算法對正規內容返回的資料進行加密傳輸
  9. 客戶端通過與中間人建立的對稱加密演算法對返回結果資料進行解密

由於缺少對證書的驗證,所以客戶端雖然發起的是 HTTPS 請求,但客戶端完全不知道自己的網路已被攔截,傳輸內容被中間人全部竊取。

中間人攻擊:總結起來一句話就是客戶端不知道CA證書是不是合法的,誰都可以冒充合法的伺服器,從而獲取到真實的客戶端生成的內容及隨機數相關的值,然後中間人再利用獲取到這些值去和真實的伺服器進行https請求(這個過程是合法的,因為中間人這個伺服器拿的真實的客戶端資料,模模擬實的客戶端請求)。

瀏覽器如何驗證證書的合法性?

  1. 驗證證書上的域名、有效期等資訊是否正確。
  2. 判斷證書來源是否合法。每份簽發證書都可以根據驗證鏈查詢到對應的根證書,作業系統、瀏覽器會在本地儲存權威機構的根證書,利用本地根證書可以對對應機構簽發證書完成來源驗證;
  3. 判斷證書是否被篡改。需要與 CA 伺服器進行校驗;
  4. 判斷證書是否已吊銷。通過CRL(Certificate Revocation List 證書登出列表)和 OCSP(Online Certificate Status Protocol 線上證書狀態協議)實現,其中 OCSP 可用於第3步中以減少與 CA 伺服器的互動,提高驗證效率

只有認證機構可以生成證書嗎?

從技術上角度來看誰都可以生成證書,只要有證書就可以完成網站的 HTTPS 傳輸。但是瀏覽器會提示風險。

用了 HTTPS 會被抓包嗎?

會,但是得是使用者授權了同意了訪問該網站,只要是使用者主動授權訪問風險網站,都可能造成資料被中間人抓包