Https及其安全性
Https比Http安全性?
Https是以安全為目標的Http版本,在Http上使用SSL層,進行加密傳輸(對稱和非對稱加密),還具備身份驗證的功能(下面會重點說HTTPS的雙向驗證)。當然,Https是需要配置CA證書的,一般要從某些機構購買。
為何Https依然會被擷取?
我們利用fiddler可以擷取到了客戶端與後臺的https介面的明文內容,這是一個可怕的問題。目前的一些抓包工具,fiddler、charles使用了叫做man-in-the-middle(中間人)機制:
我們看到Fiddler抓取HTTPS協議主要由以下幾步進行:
- 第一步,Fiddler截獲客戶端傳送給伺服器的HTTPS請求,Fiddler偽裝成客戶端向伺服器傳送請求進行握手。
- 第二步,伺服器發回相應,Fiddler獲取到伺服器的CA證書, 用根證書公鑰進行解密, 驗證伺服器資料簽名, 獲取到伺服器CA證書公鑰。然後Fiddler偽造自己的CA證書, 冒充伺服器證書傳遞給客戶端瀏覽器。
- 第三步,與普通過程中客戶端的操作相同,客戶端根據返回的資料進行證書校驗、生成密碼Pre_master、用Fiddler偽造的證書公鑰加密,並生成HTTPS通訊用的對稱金鑰enc_key。
- 第四步,客戶端將重要資訊傳遞給伺服器, 又被Fiddler截獲。Fiddler將截獲的密文用自己偽造證書的私鑰解開, 獲得並計算得到HTTPS通訊用的對稱金鑰enc_key。Fiddler將對稱金鑰用伺服器證書公鑰加密傳遞給伺服器。
- 第五步,與普通過程中伺服器端的操作相同,伺服器用私鑰解開後建立信任,然後再傳送加密的握手訊息給客戶端。
- 第六步,Fiddler截獲伺服器傳送的密文, 用對稱金鑰解開, 再用自己偽造證書的私鑰加密傳給客戶端。
- 第七步,客戶端拿到加密資訊後,用公鑰解開,驗證HASH。握手過程正式完成,客戶端與伺服器端就這樣建立了”信任“。
在之後的正常加密通訊過程中,Fiddler如何在伺服器與客戶端之間充當第三者呢?
伺服器—>客戶端:Fiddler接收到伺服器傳送的密文, 用對稱金鑰解開, 獲得伺服器傳送的明文。再次加密, 傳送給客戶端。
客戶端—>服務端:客戶端用對稱金鑰加密,被Fiddler截獲後,解密獲得明文。再次加密,傳送給伺服器端。由於Fiddler一直擁有通訊用對稱金鑰enc_key, 所以在整個HTTPS通訊過程中資訊對其透明。
從上面可以看到,Fiddler抓取HTTPS協議成功的關鍵是根證書(具體是什麼,可Google),這是一個信任鏈的起點,這也是Fiddler偽造的CA證書能夠獲得客戶端和伺服器端信任的關鍵。
從技術上講,證書其實包含三部分,使用者的資訊,使用者的公鑰,還有CA中心對該證書裡面的資訊的簽名,要驗證一份證書的真偽(即驗證CA中心對該證書資訊的簽名是否有效),需要用CA中心的公鑰驗證,而CA中心的公鑰存在於對這份證書進行簽名的證書內,故需要下載該證書,但使用該證書驗證又需先驗證該證書本身的真偽,故又要用簽發該證書的證書來驗證,這樣一來就構成一條證書鏈的關係,這條證書鏈在哪裡終結呢?答案就是根證書,根證書是一份特殊的證書,它的簽發者是它本身,下載根證書就表明您對該根證書以下所簽發的證書都表示信任,而技術上則是建立起一個驗證證書資訊的鏈條,證書的驗證追溯至根證書即為結束。所以說使用者在使用自己的數字證書之前必須先下載根證書。
這就解釋了問什麼擷取到了Https的資料,並且,Https在傳輸過程加密,所以到了客戶端已經不是Https傳輸加密的範圍了,這個時候其實很多人都是這麼解決的,對Https資料先自己進行加密(Ex:AES、RSA),再Https傳輸,這樣即使擷取到Https資料,也看不到明文。那麼有沒有方式可以不讓fiddler&charles這種傢伙擷取到Https呢?有,就是Https的雙向驗證。
Https雙向驗證
伺服器端對請求它的客戶端要進行身份驗證,客戶端對自己所請求的伺服器也會做身份驗證。服務端一旦驗證到請求自己的客戶端為不可信任的,服務端就拒絕繼續通訊。客戶端如果發現服務端為不可信任的,那麼也中止通訊。具體怎麼做呢?如下圖所示。
相關文章
- 理解https中的安全及其實現原理HTTP
- apache與 tomcat 搭建https及其關係ApacheTomcatHTTP
- 自簽名證書安全性問題研究https(ssl)HTTP
- https安全性 帶給im 訊息加密的啟發HTTP加密
- HTTPS 原理淺析及其在 Android 中的使用HTTPAndroid
- 深入理解std::shared_ptr:原理、用法及其執行緒安全性執行緒
- HTTPS 理論基礎及其在 Android 中的最佳實踐HTTPAndroid
- HTTPS理論基礎及其在Android中的最佳實踐HTTPAndroid
- 一文看懂https如何保證資料傳輸的安全性的HTTP
- HTTP 和 HTTPS 之間除了安全性區別外,還有哪些區別HTTP
- 使用HTTPS確保安全性(Google開發者大會演講PPT&視訊)HTTPGo
- 一文讓你看懂,https如何保證資料傳輸的安全性HTTP
- 關於Https安全性問題、雙向驗證防止中間人攻擊問題HTTP
- 基於CAS的WEB單點登入(sso)服務端及其tomcat/nginx https配置Web服務端TomcatNginxHTTP
- oracle安全性Oracle
- 即時通訊安全篇(九):為什麼要用HTTPS?深入淺出,探密短連線的安全性HTTP
- 一文讀懂Https的安全性原理、數字證書、單項認證、雙項認證等HTTP
- SOA安全性基礎知識:測試SOA安全性
- IT安全性如何提高
- API的安全性API
- MySQL安全性指南MySql
- httpsHTTP
- https學習,resin下配置httpsHTTP
- HTTPS那些事(一)HTTPS原理(轉載)HTTP
- 4A安全性分析
- PHP安全性漫談PHP
- Web安全性測試Web
- 智慧合約安全性
- 執行緒安全性執行緒
- 安全性偏好設定
- oracle 安全性引數Oracle
- JSP的安全性JS
- 控制檯安全性破解
- C# 安全性教程C#
- 資料庫安全性資料庫
- HTTPS概述HTTP
- HTTPS原理HTTP
- 自用,httpsHTTP