…
<?xml version="1.0" encoding="utf-8"?>這樣即表示,App信任用戶CA證書,讓系統(tǒng)對用戶CA證書的校驗給予通過。更多相關(guān)信息,詳見
Network security configuration:
https://developer.android.com/training/articles/security-config
調(diào)低targetSdkVersion < 24
=====================================================================================
如果想抓一個App的包,可以找個歷史版本,只需要其targetSdkVersion < 24即可。然而,隨著GooglePlay開始限制targetSdkVersion,現(xiàn)在要求其必須>=26,2019年8月1日后必須>=28,國內(nèi)應(yīng)用市場也開始逐步響應(yīng)這種限制。絕大多數(shù)App的targetSdkVersion都將大于24了,也就意味著抓HTTPS的包越來越難操作了。
平行空間抓包
====================================================================
如果我們希望抓targetSdkVersion >= 24的應(yīng)用的包,那又該怎么辦呢?我們可以使用平行空間或者VirtualApp來曲線救國。平行空間和VirtualApp這種多開應(yīng)用可以作為宿主系統(tǒng)來運行其它應(yīng)用,如果平行空間和VirtualApp的targetSdkVersion < 24,那么問題也就解決了。
在此,我推薦使用平行空間,相比部分開源的VirtualApp,平行空間運行得更加穩(wěn)定。但必須注意平行空間的版本4.0.8625以下才是targetSdkVersion < 24,別安裝錯了。當(dāng)然,HttpCanary的設(shè)置中是可以直接安裝平行空間的。
安裝到系統(tǒng)CA證書目錄
=========================================================================
對于Root的機器,這是最完美最佳的解決方案。如果把CA證書安裝到系統(tǒng)CA證書目錄中,那這個假CA證書就是真正洗白了,不是真的也是真的了。由于系統(tǒng)CA證書格式都是特殊的.0格式,我們必須將抓包工具內(nèi)置的CA證書以這種格式導(dǎo)出,HttpCanary直接提供了這種導(dǎo)出選項。
操作路徑:設(shè)置 -> SSL證書設(shè)置 -> 導(dǎo)出HttpCanary根證書 -> System Trusted(.0)。
PS. 很不幸的HttpCanary v2.8.0前導(dǎo)出的證書名稱可能不正確,建議升級到v2.8.0以上版本操作。
導(dǎo)出.0格式的證書后,可以使用MT管理器將.0文件復(fù)制到/etc/security/cacerts/目錄下,或者通過adb remount然后push也可(這里稍微提一下,別在sdcard里找這個目錄)。
Firefox證書安裝
=========================================================================
火狐瀏覽器Firefox自行搞了一套CA證書管理,無論是系統(tǒng)CA證書還是用戶CA證書,F(xiàn)irefox通通都不認(rèn)可。這種情況,我們需要將CA證書通過特殊方式導(dǎo)入到Firefox中,否則Firefox瀏覽網(wǎng)頁就無法工作了。
HttpCanary v2.8.0版本提供了Firefox證書導(dǎo)入選項。在設(shè)置 -> SSL證書設(shè)置 -> 添加HttpCanary根證書至Firefox 中:
點擊右上角復(fù)制按鈕將url復(fù)制到粘貼板,然后保持此頁面不動,打開Firefox粘貼輸入復(fù)制的url。
出現(xiàn)下載證書彈框后,一定要手動勾上:信任用來標(biāo)志網(wǎng)站和信任用來標(biāo)志電子郵件用戶。然后確定即可。
公鑰證書固定
====================================================================
證書固定(Certificate Pinning)是指Client端內(nèi)置Server端真正的公鑰證書。在HTTPS請求時,Server端發(fā)給客戶端的公鑰證書必須與Client端內(nèi)置的公鑰證書一致,請求才會成功。
在這種情況下,由于MITM Server創(chuàng)建的公鑰證書和Client端內(nèi)置的公鑰證書不一致,MITM Server就無法偽裝成真正的Server了。這時,抓包就表現(xiàn)為App網(wǎng)絡(luò)錯誤。已知的知名應(yīng)用,比如餓了么,就采用了證書固定。
另外,有些服務(wù)器采用的自簽證書(證書不是由真正CA發(fā)行商簽發(fā)的),這種情況App請求時必須使用證書固定。
證書固定的一般做法是,將公鑰證書(.crt或者.cer等格式)內(nèi)置到App中,然后創(chuàng)建TrustManager時將公鑰證書加進去。很多應(yīng)用還會將內(nèi)置的公鑰證書偽裝起來或者加密,防止逆向提取,比如餓了么就偽裝成了png,當(dāng)然對公鑰證書偽裝或者加密沒什么太大必要,純粹自欺欺人罷了。
證書固定對抓包是個非常麻煩的阻礙,不過我們總是有辦法繞過的,就是麻煩了點。
JustTrustMe破解證書固定
Xposed和Magisk都有相應(yīng)的模塊,用來破解證書固定,實現(xiàn)正常抓包。破解的原理大致是,Hook創(chuàng)建SSLContext等涉及TrustManager相關(guān)的方法,將固定的證書移除。
基于VirtualApp的Hook機制破解證書固定
Xposed和Magisk需要刷機等特殊處理,但是如果不想刷機折騰,我們還可以在VirtualApp中加入Hook代碼,然后利用VirtualApp打開目標(biāo)應(yīng)用進行抓包。當(dāng)然,有開發(fā)者已經(jīng)實現(xiàn)了相關(guān)的功能。詳見:
案例1:
https://github.com/PAGalaxyLab/VirtualHook
案例2:
https://github.com/rk700/CertUnpinning
不過,這里CertUnpinning插件的代碼有點問題,要改改。
導(dǎo)入真正的公鑰證書和私鑰
如果Client固定了公鑰證書,那么MITM Server必須持有真正的公鑰證書和匹配的私鑰。如果開發(fā)者具有真正服務(wù)端的公鑰證書和私鑰,(比如百度的公鑰證書和私鑰百度的后端開發(fā)肯定有),如果真有的話,可以將其導(dǎo)入HttpCanary中,也可以完成正常抓包。
在設(shè)置 -> SSL證書設(shè)置 -> 管理SSL導(dǎo)入證書 中,切換到服務(wù)端,然后導(dǎo)入公鑰證書+私鑰,支持.p12和.bks格式文件。
雙向認(rèn)證
==================================================================
SSL/TLS協(xié)議提供了雙向認(rèn)證的功能,即除了Client需要校驗Server的真實性,Server也需要校驗Client的真實性。這種情況,一般比較少,但是還是有部分應(yīng)用是開啟了雙向認(rèn)證的。比如匿名社交應(yīng)用Soul部分接口就使用了雙向認(rèn)證。使用了雙向認(rèn)證的HTTPS請求,同樣無法直接抓包。
關(guān)于雙向認(rèn)證的原理
首先,雙向認(rèn)證需要Server支持,Client必須內(nèi)置一套公鑰證書 + 私鑰。在SSL/TLS握手過程中,Server端會向Client端請求證書,Client端必須將內(nèi)置的公鑰證書發(fā)給Server,Server驗證公鑰證書的真實性。
注意,這里的內(nèi)置的公鑰證書有區(qū)別于前面第5點的公鑰證書固定,雙向認(rèn)證內(nèi)置的公鑰證書+私鑰是額外的一套,不同于證書固定內(nèi)置的公鑰證書。
如果一個Client既使用證書固定,又使用雙向認(rèn)證,那么Client端應(yīng)該內(nèi)置一套公鑰證書 + 一套公鑰證書和私鑰。第一套與Server端的公鑰證書相同,用于Client端系統(tǒng)校驗與Server發(fā)來的證書是否相同,即證書固定;第二套SSL/TLS握手時公鑰證書發(fā)給Server端,Server端進行簽名校驗,即雙向認(rèn)證。
用于雙向認(rèn)證的公鑰證書和私鑰代表了Client端身份,所以其是隱秘的,一般都是用.p12或者.bks文件+密鑰進行存放。由于是內(nèi)置在Client中,存儲的密鑰一般也是寫死在Client代碼中,有些App為了防反編譯會將密鑰寫到so庫中,比如S匿名社交App,但是只要存在于Client端中都是有辦法提取出來的。
雙向認(rèn)證抓包
這里以S匿名社交App為例,講解下如何抓取使用了雙向認(rèn)證的App的HTTPS包。如果服務(wù)器使用了Nginx且開啟了雙向認(rèn)證,抓包時會出現(xiàn)400 Bad Request的錯誤,如下:
有些服務(wù)器可能不會返回404,直接請求失敗。接下來看,如何使用HttpCanary配置雙向認(rèn)證抓包。
首先,解壓APK,提取出.p12或者.bks文件,二進制的文件一般存放都在raw或者assets目錄。
將client.p12文件導(dǎo)入手機,然后在HttpCanary的設(shè)置 -> SSL證書設(shè)置 -> 管理SSL導(dǎo)入證書中,切換到客戶端(因為需要配給MITM Client),然后導(dǎo)入.p12文件。
由于雙向認(rèn)證的公鑰證書和私鑰是受密鑰保護的,所以需要輸入密碼:
一般通過逆向可以從APK中提取出密鑰,具體操作這里略過。輸入密鑰后,需要輸入映射域名,這里使用通配符*映射所有相關(guān)域名:
導(dǎo)入完成后如下:
可以點進證書詳情查看細(xì)節(jié),這個client.p12文件包含公鑰證書和私鑰,是用于雙向認(rèn)證的。
配置完成后,重新進行抓包,看看效果。
可以看到,之前400 Bad Request的兩個要求雙向認(rèn)證的請求成功了!
SSL重協(xié)商
有些服務(wù)器可能會開啟SSL重協(xié)商,即SSL/TLS握手成功后發(fā)送請求時服務(wù)器會要求重新握手。這種情況一般比較少,但是也不排除,已知的應(yīng)用比如 10000社區(qū) 就使用了SSL重協(xié)商。
由于Android系統(tǒng)對SSL重協(xié)商是有限支持,所以部分系統(tǒng)版本抓包會失敗,表現(xiàn)為網(wǎng)絡(luò)異常。在Android 8.1以下,SslSocket是完全支持SSL重協(xié)商的,但是SSLEngine卻是不支持SSL重協(xié)商的,而HttpCanary解析SSL/TLS使用的是SSLEngine。在Android 8.1及以上,SSLEngine和SslSocket統(tǒng)一了實現(xiàn),故是支持SSL重協(xié)商的。
所以,如果確認(rèn)服務(wù)器使用了SSL重協(xié)商,請使用8.1及以上版本系統(tǒng)進行抓包。
非Http協(xié)議抓包
自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過,也去過華為、OPPO等大廠,18年進入阿里一直到現(xiàn)在。
深知大多數(shù)初中級Android工程師,想要提升技能,往往是自己摸索成長或者是報班學(xué)習(xí),但對于培訓(xùn)機構(gòu)動則近萬的學(xué)費,著實壓力不小。自己不成體系的自學(xué)效果低效又漫長,而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年Android移動開發(fā)全套學(xué)習(xí)資料》,初衷也很簡單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友,同時減輕大家的負(fù)擔(dān)。
既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗的小伙伴深入學(xué)習(xí)提升的進階課程,基本涵蓋了95%以上Android開發(fā)知識點,真正體系化!
由于文件比較大,這里只是將部分目錄截圖出來,每個節(jié)點里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實戰(zhàn)項目、講解視頻,并且會持續(xù)更新!
如果你覺得這些內(nèi)容對你有幫助,可以掃碼獲?。。。▊渥ⅲ篈ndroid)文章來源:http://www.zghlxwxcb.cn/news/detail-855783.html

總結(jié)
本文講解了我對Android開發(fā)現(xiàn)狀的一些看法,也許有些人會覺得我的觀點不對,但我認(rèn)為沒有絕對的對與錯,一切交給時間去證明吧!愿與各位堅守的同胞們互相學(xué)習(xí),共同進步!文章來源地址http://www.zghlxwxcb.cn/news/detail-855783.html
《Android學(xué)習(xí)筆記總結(jié)+移動架構(gòu)視頻+大廠面試真題+項目實戰(zhàn)源碼》,點擊傳送門即可獲取!
來,每個節(jié)點里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實戰(zhàn)項目、講解視頻,并且會持續(xù)更新!**
如果你覺得這些內(nèi)容對你有幫助,可以掃碼獲?。。。▊渥ⅲ篈ndroid)

總結(jié)
本文講解了我對Android開發(fā)現(xiàn)狀的一些看法,也許有些人會覺得我的觀點不對,但我認(rèn)為沒有絕對的對與錯,一切交給時間去證明吧!愿與各位堅守的同胞們互相學(xué)習(xí),共同進步!
《Android學(xué)習(xí)筆記總結(jié)+移動架構(gòu)視頻+大廠面試真題+項目實戰(zhàn)源碼》,點擊傳送門即可獲??!
到了這里,關(guān)于Android高級架構(gòu)師:Android平臺HTTPS抓包解決方案及問題分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!