① HTTPS 抓包原理以及 android 端如何防止抓包
抓包的基本原理就是中間人攻擊 HTTPS 的握手過程 。Mac 上可使用 Charles 進行抓包。本質上就是兩段 HTTPS 連接,Client <--> Man-In-The-Middle 和 Man-In-The-Middle <--> Server。使用 Charles 進行抓包,需要 Client 端提前將 Charles 的根證書添加在 Client 的信任列表中。
回顧之前的 HTTPS 的握手過程 ,可以知道 SSL 的核心過程就是客戶端驗證證書鏈合法性——客戶端檢查證書鏈中是否有一個證書或者公鑰存在於客戶端的可信任列表中。
手機系統中內置了上百份不同的根證書。Certificate Pinning 的原理其實就是 app 中內置需要被信任的特定證書,app 在驗證伺服器傳過來的證書鏈時,使用這些特定證書來驗證的。
證書的主要作用是公鑰的載體,但在實踐中我們更多是去 pinning 公鑰, SubjectPublicKeyInfo(SPKI) 。這是因為很多伺服器會去定期旋轉證書,但是證書旋轉後,證書中的公鑰還是相同的公鑰。
如果私鑰泄露了,那麼伺服器端就不得不使用新的私鑰做出新的證書。客戶端為了預防這種情況,可以提前 pinning 這些新的證書。這樣,當伺服器替換新的證書時,客戶端 app 就可以不做任何改動。
從 SDK 24 開始,Android 支持通過 xml 來配置 certificate pinning,見 Network Security Configuration 。
其中 <pin> 節點接受 SubjectPublicKeyInfo 的 hash 值。
OkHttp 從 2.1 開始直接支持 Certificate Pinning 。
我在項目實踐中發現有的伺服器並不會在 ssl 握手階段 將完整的證書鏈傳輸過來——只會傳證書鏈中的根證書和葉子證書。如果安卓系統中使用 HttpUrlConnection 訪問伺服器,拋出如下類似異常:
但是瀏覽器對於這種缺失中間證書的伺服器卻能驗證通過,主要原因是瀏覽器訪問有完整證書鏈的網站時,如果發現證書鏈中有瀏覽器沒有內置的中間證書,那麼瀏覽器會將該證書緩存下來,這樣瀏覽器訪問其他沒有該中間證書的伺服器時,就可以使用這個緩存的中間證書來驗證證書鏈。
解決安卓上出現這個問題的方法是將這個中間證書通過 app 添加到信任證書列表中。我們需要將該中間證書加入到 App 運行時所用的 TrustManager 中。
使用 X509TrustManagerExtensions 可以將證書 pinning 到 app 中。 X509TrustManagerExtensions.checkServerTrusted() 允許開發者在系統對證書鏈驗證通過後,再次使用自己的方法驗證證書鏈。
使用方法如下:
② 網路抓包原理
本文以App作為例子,實際應用不限於App范圍。
大部分場合都可以通過程序調試來定位問題,但有些場景使用抓包來定位介面問題更准確、更方便,如以下場景:
要實現對App的網路數據抓包,需要監控App與伺服器交互之間的網路節點,監控其中任意一個網路節點(網卡),獲取所有經過網卡中的數據,對這些數據按照網路協議進行解析,這就是抓包的基本原理。
但是中間網路節點,不受我們控制,所以基本無法實現抓包的,只能在客戶端和服務端進行抓包。
通常我們監控本地網卡數據,如下圖:
本地網路 指的是WIFI的路由,如果直接抓路由器的包還是比較麻煩的,因此我們會在 手機 和 本地路由 之間加一層 代理服務 ,這樣只要抓代理服務的網路數據即可:
雖然在 手機 側也可實現抓包,但和 本地路由 一樣,抓包比較麻煩,如果不是沒有辦法,盡量還是不在手機側抓包。但是有一種情況必須在手機端抓包,那就是在4G網路情況下:
4G網路狀態下如何抓包,以及它的劣勢,我們後面章節再細講。
抓包實際上是分析網路協議的一種過程,盡管繁瑣的細節勞動都讓抓包工具做了,但我們還是需要了解下基礎的網路協議,好幫助我們更好的分析問題。
首先需要了解下經典的OSI七層網路模型,以及每層的作用,其次對TCP、HTTP協議簡單了解。
HTTPS是基於HTTP協議的一種改進,在 TCP之上 的會話層增加安全處理。對於應用層來說,HTTPS和HTTP沒有什麼不同,也就是說,HTTPS是保證網路傳輸的安全性,對業務數據無侵入。
簡化理解大概是這個樣子:
SSL和TLS是保證安全傳輸的協議,包括證書認證、加解密和數字簽名。
項目中HTTPS的鏈路:
因此,客戶端與後台,編寫網路介面時,不需要關心SSL或TLS,按照HTTP協議處理即可。
既然HTTPS在網路傳輸是經過加密的,那麼抓包抓到的數據就是密文,不經過解密是無法看到報文的。針對這個問題,如上圖WIFI環境下設置代理的方式可以解決,具體思路是:
所以整個網路鏈路依然是HTTPS在傳輸,但代理服務自己可以獲取到明文數據。
比較常用的抓包工具大概有4個,主要用作互補,配合使用基本所有平台、所有抓包需求都能滿足:
需要說明的是,tcpmp可將數據保存成文件,直接用wireShark打開分析,針對後台或手機抓包使用起來十分方便。
幾個工具間的使用關系:
為什麼要真機抓包?必定是沒有辦法設置代理服務了,如4G網路情況下直接和移動基站鏈接,沒法設置代理服務。凡是非4G網路狀態下,都不建議真機抓包。
iOS 5後,apple引入了RVI remote virtual interface的特性,它只需要將iOS設備使用USB數據線連接到mac上,然後使用rvictl工具以iOS設備的UDID為參數在Mac中建立一個虛擬網路介面rvi,就可以在mac設備上使用tcpmp,wireshark等工具對創建的介面進行抓包分析。
具體步驟:
android是linux系統,和後台一樣可以使用tcpmp命令來抓包,但是需要root許可權,因為一般手機系統不帶有抓包命令 tcpmp ,需要自行安裝。
安裝tcpmp:
使用tcpmp:
這是就已經進入抓包狀態,手機所有的網路請求都會被捕獲,並保存到capture文件中。
導出capture文件:
原文: 網路抓包