相信你們對於HTTPS協議都不陌生,可是應該存在如下疑問:算法
HTTP協議是一個應用層協議,一般運行在TCP協議之上。它是一個明文協議
,客戶端發起請求,服務端給出響應的響應。瀏覽器
因爲網絡並非可信任的,HTTP協議的明文特性會存在如下風險:安全
通常的網站可能沒什麼影響,可是若是是銀行這種網站呢?服務器
好在國內的銀行在HTTP協議時代針對IE開發了ActiveX插件來保證安全性,這一點算是值得點讚了。網絡
既然HTTP協議是明文協議,若是對數據進行加密以後是否就能保證安全性了呢?性能
在回答這個問題以前,咱們先看看比較常見的兩種加密算法。網站
常見的有對稱加密算法和非對稱加密算法。加密
對稱加密操作系統
加密和解密使用同一個密鑰。加解密效率比非對稱加密高。可是密鑰一旦泄露,通訊就不安全了插件
非對稱加密
存在密鑰對,公鑰加密私鑰解密或者私鑰加密公鑰解密,沒法經過公鑰反推私鑰,也沒法經過私鑰反推公鑰。
通常狀況下,使用非對稱加密來傳輸通訊所用的密鑰,通訊過程當中採用對稱加密,能夠解決對稱加密的安全問題以及非對稱加密的性能問題。
這麼一看彷佛沒有問題,畢竟黑客沒法破解非對稱加密的的內容,可是瀏覽器是如何獲得公鑰的?
有如下兩種辦法:
因爲瀏覽器使用了僞造的公鑰進行通訊,因此通訊過程是不可靠的
只要保證瀏覽器獲得的公鑰是目標網站的公鑰便可保證通訊安全,那麼問題來了,如何在不可靠的網絡上安全的傳輸公鑰呢?
這就是HTTPS協議須要解決的問題
HTTPS協議涉及到的知識不少,本文只關注密鑰安全交換部分,這也是HTTPS協議的精華。
HTTPS協議引入了CA和數字證書的概念。
包含簽發機構、有效期、申請人公鑰、證書全部者、證書籤名算法、證書指紋以及指紋算法等信息。
數字證書籤發機構,權威CA是受操做系統信任的,安裝操做系統就會內置。
用Hash算法對數據進行計算獲得Hash值,利用私鑰對該Hash加密獲得簽名。
只有匹配的公鑰才能解密出簽名,來保證簽名是本人私鑰簽發的
瀏覽器是如何驗證網站的有效性的呢?
黑客冒充CA給了一個假證書給瀏覽器
瀏覽器經過CA名稱從操做系統取出CA公鑰時對數字簽名進行解密,發現解密失敗,證實這個CA簽名用的私鑰和操做系統內置的不是一對,就發現了僞造
黑客篡改了證書中的網站公鑰
證書中的網站公鑰能夠被篡改,可是數字簽名是CA私鑰計算出來的,黑客沒法計算數字簽名,瀏覽器用內置的CA公鑰對數字簽名解密時就會發現指紋不匹配了,這也發現了僞造
黑客也能正常獲取網站公鑰
的確,黑客本身經過瀏覽器訪問網站時也能獲得公鑰,這個公鑰跟正經常使用戶的公鑰是一致的。可是每一個客戶端和服務器通訊使用的對稱密鑰都是臨時生成且隨機的,黑客只能知道本身的隨機密鑰,可是不知道其餘的隨機密鑰
綜上,瀏覽器經過操做系統內置權威CA公鑰的方式解決了網站公鑰下發問題。
HTTPS從協議上解決了HTTP時代的中間人攻擊問題,可是HTTPS在用戶主動信任了僞造證書的時候也會發生中間人攻擊(好比早期的12306須要手動信任證書),HTTPS中間人攻擊流程以下:
以上就是HTTPS中間人攻擊的原理,這也就是HTTPS抓包爲何要信任證書的緣由。