Android 使用 Charles 抓包失败报 SSLHandshake: Received fatal alert: certificate_unknown 最有效的解决方案

Author Avatar
dev.liang 8月 22, 2019
  • 在其它设备中阅读本文章

Android 使用 Charles 抓取 Https 请求的报文时,Android 和 Charles 都正确安装了证书之后出现抓包失败,报错 SSLHandshake: Received fatal alert: certificate_unknown, 官方有个说明文档,点击查看

原因

安卓7之后调整了安全策略会导致部分手机抓包失败,请参考此链接:https://android-developers.googleblog.com/2016/07/changes-to-trusted-certificate.html ,文中提到默认情况下,针对 API Level 24 及更高版本的应用程序不再信任用户或管理员添加的CA用于安全连接。

解决方法

方法一

个人手机上已经正确安装了 Charles 证书,证书不懂怎么安装的可以自行搜索。
在你的 AndroidManifest.xml 文件中添加如下配置:

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config"
... >
...
</application>
</manifest>

在res目录下新建一个xml文件夹,之后在res/xml/路径下新建文件 network_security_config.xml,名字可以随意定义,路径res/xml/network_security_config.xml:

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config>
<domain includeSubdomains="true">你要抓取的域名(eg:baidu.com)</domain>
<trust-anchors>
<certificates src="user"/>//信任用户自己安装的证书
</trust-anchors>
</domain-config>
</network-security-config>

方法二

手机上是否有装证书也都可以使用下面的方法:
在你的AndroidManifest.xml文件中添加如下配置:

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config"
... >
...
</application>
</manifest>

在res目录下新建一个xml文件夹,之后在 res/xml/ 路径下新建文件 network_security_config.xml,路径res/xml/network_security_config.xml:

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config>
<domain includeSubdomains="true">你要抓取的域名(eg:baidu.com)</domain>
<trust-anchors>
<certificates src="@raw/证书文件名"/>
</trust-anchors>
</domain-config>
</network-security-config>

在res目录下新建一个raw文件夹,将手机上安装的证书文件 copy 到你的工程目录,res/raw/ 目录下,证书格式:pem,crt等(chales的话就是将你在手机浏览器打开 http://charlesproxy.com/getssl 下载的证书放入即可),证书文件名,就是你放入res/raw/目录下文件的名字
配置完重新运行项目,就可以看到报文了!

PS:如果配置后还是没看到 https 对应的报文,再次检查下你输入的域名,有没有带 https://,去掉即可!