談談HTTPS安全認證,抓包與反抓包策略

逆月翎發表於2019-09-21

文章原創於公眾號:程式猿周先森。本平臺不定時更新,喜歡我的文章,歡迎關注我的微信公眾號。
file

協議是指計算機通訊網路中兩臺計算機之間進行通訊所必須共同遵守的規定或規則,超文字傳輸協議(HTTP)是一種通訊協議,它允許將超文字標記語言(HTML)文件從Web伺服器傳送到客戶端的瀏覽器。HTTP協議,即超文字傳輸協議是一種詳細規定了瀏覽器和全球資訊網伺服器之間互相通訊的規則,通過因特網傳送全球資訊網文件的資料傳送協議。HTTP協議是用於從全球資訊網伺服器傳輸超文字到本地瀏覽器的傳送協議。它可以使瀏覽器更加高效,使網路傳輸減少。它不僅保證計算機正確快速地傳輸超文字文件,還確定傳輸文件中的哪一部分,以及哪部分內容首先顯示(如文字先於圖形)等。眾所周知,HTTP是一個無狀態的應用層協議,由請求和響應構成,是一個標準的客戶端伺服器模型。在Internet中所有的傳輸都是通過TCP/IP進行的。HTTP協議作為TCP/IP模型中應用層的協議也不例外。HTTP協議通常承載於TCP協議之上,有時也承載於TLS或SSL協議層之上,這個時候,就成了我們常說的HTTPS。如下圖所示:file

而大家都很清楚TCP/IP共分為四層:應用層、傳輸層、網路層、資料鏈路層; 為什麼TCP/IP要分成四層呢?意思何在呢?其實主要原因是由於分層能夠解耦,動態替換層內協議,不同層各司其責: 應用層:向使用者提供應用服務時的通訊活動(ftp,dns,http) 傳輸層:網路連線中兩臺計算機的資料傳輸(tcp、udp) 網路層:處理網路上流動的資料包,通過怎樣的傳輸路徑把資料包傳送給對方(ip) 資料鏈路層:與硬體相關的網路卡、裝置驅動等等。

但是HTTP也有幾個較為顯著的缺點:

  • > 通訊使用明文,內容容易被抓包洩露
  • > 不驗證通訊方的身份,因此有可能遭遇偽裝
  • > 無法證明報文的完整性,所以有可能遭到篡改

正是由於這幾個顯著的缺點存在,所以HTTPS應運而生。https俗稱超文字傳輸安全協議。是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。HTTPS是在HTTP的基礎上加上一層安全層,用於資料加密、解密、身份認證,即

  • HTTP + 加密 + 認證 = HTTPS

說到加密,開發人員基本都不會陌生。我們平常開發中接觸形形色色的加密演算法,簡單來說分為對稱加密演算法與非對稱加密演算法以及雜湊演算法。演算法的區別在哪呢?我們可以這麼來理解三種演算法的區別:

  • 對稱加密演算法:加密和解密資料使用同一個金鑰。這種加密方式的特點是速度很快。
  • 非對稱加密演算法:資料用公鑰加密後必須用私鑰解密,資料用私鑰加密後必須用公鑰解密。這種加密方式的特點是速度慢,CPU 開銷大。
  • 雜湊演算法:沒有祕鑰,目前無法反向解密。(暴力破解除外)

我們為什麼需要加密?我們日常生活中登入密碼或者各種隱私資訊都需要進行加密儲存防止資訊洩露。那我們接下來來看看這三種演算法型別分別有什麼樣的演算法呢:

  • 對稱加密演算法:目前主流演算法有DES演算法,3DES演算法,AES演算法
  • 非對稱加密演算法:目前主流演算法有RSA演算法
  • 雜湊演算法:目前主要以MD5和SHA-1演算法為主

CA證書:CA證書CA證書內含服務端公鑰與私鑰,使用hash雜湊函式計算明文資訊的資訊摘要,然後採用CA證書內含的私鑰對資訊摘要進行加密最終生成簽名。即:證書 = 公鑰 + 簽名 +申請者和頒發者的資訊。客戶端中因為在作業系統中就預置了CA的公鑰,所以支援解密簽名。

知道了上面這些基礎知識,接下來我們一起了解HTTPS如何進行安全認證,首先主要有單向認證和雙向認證兩種認證方式:

單向認證
file從上圖可以看出,單向認證過程如下:

  • 客戶端向服務端傳送SSL協議版本號、加密演算法種類、隨機數等資訊。
  • 服務端給客戶端返回SSL協議版本號、加密演算法種類、隨機數等資訊,同時也返回伺服器端的證書,即公鑰證書
  • 客戶端使用服務端返回的資訊驗證伺服器的合法性,包括:
    1. 證書是否過期
    2. 發行伺服器證書的CA是否可靠
    3. 返回的公鑰是否能正確解開返回證書中的數字簽名
    4. 伺服器證書上的域名是否和伺服器的實際域名相匹
    5. 驗證通過後,將繼續進行通訊,否則,終止通訊
  • 客戶端向服務端傳送自己所能支援的對稱加密方案,供伺服器端進行選擇
  • 伺服器端在客戶端提供的加密方案中選擇加密程度最高的加密方式。
  • 伺服器將選擇好的加密方案通過明文方式返回給客戶端
  • 客戶端接收到服務端返回的加密方式後,使用該加密方式生成產生隨機碼,用作通訊過程中對稱加密的金鑰,使用服務端返回的公鑰進行加密,將加密後的隨機碼傳送至伺服器
  • 伺服器收到客戶端返回的加密資訊後,使用自己的私鑰進行解密,獲取對稱加密金鑰。 在接下來的會話中,伺服器和客戶端將會使用該密碼進行對稱加密,保證通訊過程中資訊的安全。

HTTPS雙向認證單向認證客戶端只需要認證服務端,而在雙向認證中服務端同樣需要對客戶端進行認證: 雙向認證具體過程如下:file

  • 客戶端向服務端傳送SSL協議版本號、加密演算法種類、隨機數等資訊。
  • 服務端給客戶端返回SSL協議版本號、加密演算法種類、隨機數等資訊,同時也返回伺服器端的證書,即公鑰證書
  • 客戶端使用服務端返回的資訊驗證伺服器的合法性,包括:
    1. 證書是否過期
    2. 發行伺服器證書的CA是否可靠
    3. 返回的公鑰是否能正確解開返回證書中的數字簽名
    4. 伺服器證書上的域名是否和伺服器的實際域名相匹配
    5. 驗證通過後,將繼續進行通訊,否則,終止通訊
  • 服務端要求客戶端傳送客戶端的證書,客戶端會將自己的證書傳送至服務端
  • 驗證客戶端的證書,通過驗證後,會獲得客戶端的公鑰
  • 客戶端向服務端傳送自己所能支援的對稱加密方案,供伺服器端進行選擇
  • 伺服器端在客戶端提供的加密方案中選擇加密程度最高的加密方式
  • 將加密方案通過使用之前獲取到的公鑰進行加密,返回給客戶端
  • 客戶端收到服務端返回的加密方案密文後,使用自己的私鑰進行解密,獲取具體加密方式,而後,產生該加密方式的隨機碼,用作加密過程中的金鑰,使用之前從服務端證書中獲取到的公鑰進行加密後,傳送給服務端
  • 服務端收到客戶端傳送的訊息後,使用自己的私鑰進行解密,獲取對稱加密的金鑰,在接下來的會話中,伺服器和客戶端將會使用該密碼進行對稱加密,保證通訊過程中資訊的安全。

但是HTTPS即使號稱超文字傳輸安全協議,也是很容易被抓包的,一般可以通過Charles、fildder等工具作為中間層,進行身份的偽裝:對客戶端偽裝成服務端,對服務端偽裝成客戶端: 截獲客戶端的HTTPS請求,偽裝成客戶端去向服務端傳送HTTPS請求 接受服務端返回,用自己的證書偽裝成服務端向客戶端傳送資料內容。

具體過程如下圖所示:file反抓包策略 那我們應該如何防止被抓包呢?可以使用SSL-Pinning技術來反抓包。因為被抓包主要是由於偽造了一個假的服務端證書給了客戶端,音粗可以同時在客戶端也儲存一份服務端的證書,就可以知道資料來源的證書是不是真實服務端來源了。SSL-pinning有兩種方式: 證書鎖定(Certificate Pinning) 公鑰鎖定(Public Key Pinning)

證書鎖定證書鎖定是SSL/TLS加密的額外保證手段。它會將伺服器的證書公鑰預先儲存在客戶端。在建立安全連線的過程中,客戶端會將預置的公鑰和接受的證書做比較。如果一致,就建立連線,否則就拒絕連線。在客戶端設定證書只允許設定指定域名的證書,而不接受作業系統或瀏覽器內建的CA根證書對應的任何證書。

公鑰鎖定 HTTP公鑰鎖定是HTTPS網站防止攻擊者CA機構錯誤簽發的證書進行中間人攻擊的一種安全機制,用於預防CA遭受入侵或其他會造成CA簽發未授權證書的情況。採用公鑰鎖定時,網站會提供已授權公鑰的雜湊列表,指示客戶端在後續通訊中只接受列表上的公鑰。提取證書中的公鑰並內建到客戶端中,通過與伺服器對比公鑰值來驗證連線的正確性。

HTTPS和HTTP的區別https協議需要到ca申請證書,一般免費證書很少,需要交費。 http是超文字傳輸協議,資訊是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。 http和https使用的是完全不同的連線方式用的埠也不一樣,前者是80,後者是443。 http的連線很簡單,是無狀態的。 HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,要比http協議安全。

HTTPS解決的問題防止第三方冒充伺服器。 防止第三方攔截通訊報文,竊取通訊中請求報文、響應報文的內容。 防止第三方攔截通訊報文,篡改報文內容。

歡迎關注我個人公眾號:程式猿周先森file

相關文章