前提:
Android使用Charles抓取Https請求的報文時,Android和Charles都正確安裝了證書以後出現抓包失敗,報錯SSLHandshake: Received fatal alert: certificate_unknown,以下圖所示:html
緣由:
安卓7以後調整了安全策略會致使部分手機抓包失敗,請參考此連接:https://android-developers.googleblog.com/2016/07/changes-to-trusted-certificate.htmlandroid
文中提到默認狀況下,針對API Level 24及更高版本的應用程序再也不信任用戶或管理員添加的CA用於安全鏈接。意思就是就算你在手機上安裝了受信任的證書也是沒卵用的。瀏覽器
解決辦法 一:
前提你的手機上已經正確安裝了Charles證書:安全
-
在你的AndroidManifest.xml文件中添加以下配置:app
<?xml version="1.0" encoding="utf-8"?> <manifest ... > <application android:networkSecurityConfig="@xml/network_security_config" ... > ... </application> </manifest>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
-
在res目錄下新建一個xml文件夾,以後在res/xml/路徑下新建文件network_security_config.xmldom
res/xml/network_security_config.xml:google
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config> <domain includeSubdomains="true">你要抓取的域名</domain> <trust-anchors> <certificates src="user"/>//信任用戶本身安裝的證書 </trust-anchors> </domain-config> </network-security-config>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
解決辦法 二:
手機上是否有裝證書均可以使用下面的方法:spa
-
在你的AndroidManifest.xml文件中添加以下配置:.net
<?xml version="1.0" encoding="utf-8"?> <manifest ... > <application android:networkSecurityConfig="@xml/network_security_config" ... > ... </application> </manifest>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
-
在res目錄下新建一個xml文件夾,以後在res/xml/路徑下新建文件network_security_config.xmlcode
res/xml/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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
-
在res目錄下新建一個raw文件夾,將手機上安裝的證書文件放入res/raw/目錄下,證書格式:pem,ca等(chales的話就是將你在手機瀏覽器打開http://charlesproxy.com/getssl下載的證書放入便可),步驟2中的證書文件名,就是你放入res/raw/目錄下文件的名字
配置完從新運行項目,就能夠看到報文了!
更多配置方法請參考Google-Android
轉載:https://blog.csdn.net/mrxiagc/article/details/75329629