經過Charles代理,咱們能很輕易的抓取手機的Http請求,由於Http屬於明文傳輸,因此咱們能直接獲取到咱們要抓取的內容。可是Https內容自己就是加密的,這時咱們會發現內容是加密的了。本文咱們來說述一下如何使用Charles抓取Https數據包及相關原理知識。html
其實Charles就是這麼作的,當配置了Charles以後,理論上全部的http/https請求數據都被攔截到了。看下面一張簡化的中間人抓包的圖:api
注:爲了保證最簡單的方式實現,下面的Android設備默認都是Android 6.0及如下。安全
保證Android手機和抓取https請求的電腦在同一網絡下,而後就能夠開始進行抓取操做了。抓取主要分爲三步,分別以下:服務器
按照以下圖所示操做便可:網絡
按照以下圖的配置設置是最簡單的:app
配置到此,咱們就能夠正常抓取到Https明文數據了。dom
其實Charles上顯示確實抓到了包,可是當咱們看抓包的詳細數據時會發現報錯 You may need to configure your browser or application to trust the Charles Root Certificate. See SSL Proxying in the Help menu
。Charles說手機端沒有信任Charles的根證書,可是咱們手機上已經安裝了Charles根證書了,爲何會這樣?編碼
原來在Android 7.0(API 24 ) ,有一個名爲「Network Security Configuration」的新安全功能。這個新功能的目標是容許開發人員在不修改應用程序代碼的狀況下自定義他們的網絡安全設置。若是應用程序運行的系統版本高於或等於24,而且targetSdkVersion>=24,則只有系統(system)證書纔會被信任。因此用戶(user)導入的Charles根證書是不被信任的。加密
這裏要分兩種狀況:spa
這兩種狀況有什麼區別的,第一種app是咱們本身開發的,咱們手裏有源碼,可以修改,可以作到像官方文檔裏面說的同樣進行配置。第二種咱們沒有源碼,要想作到像官方文檔裏面配置的話,只能反編譯後,把配置文件添加進去而後從新打包,可是從新打包就會遇到不少坑,並不必定能成功,因此須要使用其餘方式達到抓包目的。
引用官方文檔一句話:默認狀況下,來自全部應用的安全鏈接(使用 TLS 和 HTTPS 之類的協議)均信任預裝的系統 CA,而面向 Android 6.0(API 級別 23)及更低版本的應用默認狀況下還會信任用戶添加的 CA 存儲。應用可使用 base-config(應用範圍的自定義)或 domain-config(按域自定義)自定義本身的鏈接。
1. Android 系統各個版本上https的抓包:https://www.jianshu.com/p/3b4cd6fdd8a9
2. Html標籤清除:http://www.jiniannet.com/Page/clearhtml
3. Unicode編碼轉換:http://tool.chinaz.com/tools/unicode.aspx