0.前言
用charles對(duì)手機(jī)app進(jìn)行抓包時(shí),有些app在使用了charles代理的時(shí)候會(huì)無(wú)法連接網(wǎng)絡(luò)的情況,即便已經(jīng)將charles證書(shū)安裝到手機(jī)用戶(hù)證書(shū)了也不行,這個(gè)時(shí)候一般考慮兩種情況:
1.證書(shū)雙向驗(yàn)證。詳情可以參考:http://www.itdecent.cn/p/22b56d977825
2.app僅信任系統(tǒng)證書(shū)。
關(guān)于如何區(qū)分這兩種情況,我并未在網(wǎng)上找到明確的答案,如果有人對(duì)這方面了解的話(huà)求給小弟指條明路,感激不盡。
本文要解決的是第2種情況,出現(xiàn)這種情況的話(huà)直接把charles證書(shū)安裝成系統(tǒng)證書(shū)就行了。
1.下載charles證書(shū)
打開(kāi)charles,點(diǎn)擊Help > SSL Proxying > Save Charles Root Certificate...下載證書(shū)到本地
這里有個(gè)坑,選擇下載目錄后,需要在文件夾名后面加上"\xxx"才會(huì)把證書(shū)下載到該目錄下的xxx.pem文件,否則的話(huà)證書(shū)會(huì)下載到上一級(jí)目錄,而證書(shū)名就是最后一級(jí)目錄的名稱(chēng),比如這里如果沒(méi)有加"\chrales",那證書(shū)就會(huì)下載到D盤(pán)根目錄的work.pem文件。搞的我第一次下的時(shí)候老找不到文件,重新下又說(shuō)文件已存在,蛋疼。

2.證書(shū)格式化
系統(tǒng)證書(shū)和用戶(hù)證書(shū)文件有很大不同,我們先進(jìn)入系統(tǒng)證書(shū)目錄看一下系統(tǒng)證書(shū)都長(zhǎng)什么樣,安卓系統(tǒng)證書(shū)都在/system/etc/security/cacerts目錄下,用adb shell進(jìn)入該目錄,查看一下已有的證書(shū)

可以看到系統(tǒng)證書(shū)都是.0格式的,而且命名顯然也是大有講究的。
證書(shū)的名稱(chēng)可以用openssl獲取,linux或者mac一般都有openssl,如果沒(méi)有的話(huà)就自己裝一個(gè)吧。使用以下命令就可以計(jì)算出證書(shū)的名字:
openssl x509 -inform PEM -subject_hash_old -in xxxx.pem | head -1

得到文件名之后把證書(shū)重命名以下就可以了
mv charles.pem e03d39e3.0
3.將證書(shū)放到安卓系統(tǒng)證書(shū)目錄
這里需要一部擁有root權(quán)限的安卓設(shè)備,建議使用夜神模擬器,直接下載最新版,默認(rèn)有root權(quán)限,并且夜神模擬器自帶有adb,方便下面的步驟。
利用夜神模擬器的文件傳輸功能將證書(shū)傳到安卓模擬器,需要把證書(shū)先放到電腦夜神模擬器共享目錄,然后把證書(shū)拖動(dòng)到夜神模擬器窗口就完成傳輸了,文件會(huì)傳到模擬器的共享目錄。

然后打開(kāi)cmd,進(jìn)入夜神模擬器adb目錄,這個(gè)要看個(gè)人的安裝目錄,我的電腦是D:\Program Files\Nox\bin
然后在cmd中依次輸入以下命令就行了
進(jìn)入shell
adb shell
獲取超級(jí)用戶(hù)權(quán)限
su
修改system目錄讀寫(xiě)權(quán)限
mount -o remount,rw /system
將安卓共享目錄中的證書(shū)文件復(fù)制到系統(tǒng)證書(shū)目錄中去
cp /sdcard/Pictures/e03d39e3.0 /system/etc/security/cacerts/
開(kāi)啟證書(shū)權(quán)限
chmod 644 /system/etc/security/cacerts/e03d39e3.0

4.設(shè)置charles
Charles默認(rèn)不開(kāi)啟https抓包,所以我們需要進(jìn)行以下設(shè)置
首先將Charles證書(shū)安裝到電腦
點(diǎn)擊Help > SSL Proxying > Install Charles Root Certificate,在彈出窗口中點(diǎn)擊“安裝證書(shū)”,然后選擇安裝到本地計(jì)算機(jī),點(diǎn)擊下一頁(yè),選擇將所有證書(shū)都放入下列存儲(chǔ),選擇受信任的根證書(shū)頒發(fā)機(jī)構(gòu),確定。
第二步開(kāi)啟https代理
點(diǎn)擊Proxy > SSL Proxying Setting,勾選Enable SSL Proxying,添加代理域名/端口

可以直接兩個(gè)通配符代理所有https請(qǐng)求

經(jīng)過(guò)這兩步操作就可以開(kāi)始抓包https請(qǐng)求了
5.設(shè)置設(shè)備代理
安卓模擬器中點(diǎn)擊設(shè)置打開(kāi)wifi,長(zhǎng)按wifi修改網(wǎng)絡(luò)

填入charles代理地址后保存即可,可以在Charles中點(diǎn)擊Help > SSL Proxying > Install Charlse Root Cetificate on a mobile device or remote browser看到ip地址和端口

全部流程走完,可以愉快的抓包了,可以用某靈魂軟件去試一下,好像舊版有些是ssl pinning的,但我在模擬器安裝的是3.98.0版本,用這個(gè)方法就可以抓包了。
歡迎技術(shù)交流,互相學(xué)習(xí)一起進(jìn)步!