1. 程式人生 > >Android7.0、8.0、9.0的https抓包,charles解決方案

Android7.0、8.0、9.0的https抓包,charles解決方案

原文地址:https://blog.csdn.net/u011045726/article/details/76064048

 

Android7.0 和 Charles 的抓包
關於android手機在mac版charles上抓不到包這個問題困擾了很久,查閱了很多資料,發現是android7.0系統安全策略問題。

Charles抓包正常流程
1.在手機上配置證書 


點選後:直接在手機瀏覽器輸入: chls.pro/ssl 
ps:最好用UC瀏覽器 華為自帶瀏覽器會下載一個pem檔案,會直接在手機上無法安裝

2.在電腦上儲存加密檔案 


ps:這個證書後面會用到

3.設定訪問域名和埠 


ps:大部分人會設定Host:* port:443 ;但是如果直接點選OK也是沒有問題的

以上的步驟在隨便一搜都可以找到的,但是,上面是針對ios和一部分android機子可行,android7.0的機子再去用charles抓包時候會出現一下情況: 


此時此刻,把目光轉移到程式碼上來,不管你在charles怎麼配置都是無濟於事的

步驟如下:
1.在專案res目錄下新增一個資料夾,命名xml,並且新建一個xml檔案,可以命名為network_security_config.xml(其實。名字可以順便命名,對應就行)

2.network_security_config.xml 裡面新增內容:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">請求域名</domain>
        <trust-anchors>
            <certificates src="@raw/證書名稱"/>
        </trust-anchors>
    </domain-config>
</network-security-config>

PS:請求域名 - 為你專案請求介面所用到的域名 
證書名稱 - 為上面提到的第二點在charles裡面點選”Save Charles Root Certificate..”(路徑: Help - SSL Proxying -Save Charles Root Certificate.. )

3.把證書放進res/raw 目錄下 ,如果沒有此目錄,需要新建

ps:此時檔名稱應當和上面提到的network_security_config.xml 檔案裡面證書名稱對應

4.在AndroidManifest.xml檔案需要加入以下配置: 


android:networkSecurityConfig="@xml/network_security_config"
1
大功告成,配置完成即可抓包。

溫馨提示: 抓到看到亂碼也是證書導致的

 

 

 

配置成這樣:所有的都可以抓https包了

 

 在App進行資料請求的時候,如果每次都列印log去判斷是一件很不“人性化”的操作行為,所以一般都會進行抓包分析。

  以最常用的軟體Fiddler來說,進行普通的http抓包沒什麼事,但是對https的抓包,要在本地安裝Fiddler 的證書才可以,因為https是加密的。又因為是自己安裝的攔截證書,系統通常都會提示,你的網路可能已被監控……

  Android 7.0以下,安裝完證書就可以進行https的抓包了,但是7.0發現,即便安裝了證書還是不能進行https的抓包,一搜……果然有內幕,Google又在7.0改網路的安全性配置,把顆粒度縮小的應用級別了……

  官方說明文件:https://developer.android.com/training/articles/security-config.html

  也就是說,系統即便安裝了證書,應用本身是可以選擇信任,也可以選擇不信任。主動權從系統移到的各個應用本身。

  怎麼進行配置呢?同學們自己點進去看就知道了,還是很簡單的,而且還可以進行debug和release的區分配置。這裡給那些不會科學上網的同學,貼一下宇宙通用的配置(就是信任一切證書……)

  配置檔案:res/xml/network_security_config.xml

<!--信任一切證書的辦法--> 此為crush的配置

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" overridePins="true" />
<!--增加一行信任所有使用者--> <certificates src="user" overridePins="true" /> 
 <!--這行是增加信任某位使用者-->           <!--<certificates src="@raw/trusttoto" overridePins="true" />-->
        </trust-anchors>
    </base-config>



    <!--<domain-config>-->
        <!--<domain includeSubdomains="true">crushu.cheez.com</domain>-->
        <!--<domain includeSubdomains="true">open.contentos.io</domain>-->
        <!--<domain includeSubdomains="true">gcm.ksmobile.net</domain>-->
        <!--<trust-anchors>-->
            <!--<certificates src="@raw/trusttoto"/>-->
        <!--</trust-anchors>-->
    <!--</domain-config>-->
</network-security-config>

複製程式碼

<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" overridePins="true" />
            <certificates src="user" overridePins="true" />
        </trust-anchors>
    </base-config>
</network-security-config>

複製程式碼

  AndroidManifest.xml 檔案的配置

複製程式碼

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config"
                    ... >
        ...
    </application>
</manifest>

複製程式碼