上一篇提过,为了能够Charles能够抓包,在代码里面添加了
android:networkSecurityConfig="@xml/network_security_config"
为什么要添加这个?
我在官方的文档找到了答案
网络安全性配置特性让应用可以在一个安全的声明性配置文件中自定义其网络安全设置,而无需修改应用代码。可以针对特定域和特定应用配置这些设置。此特性的主要功能如下所示:
- 自定义信任锚:针对应用的安全连接自定义哪些证书颁发机构 (CA) 值得信任。例如,信任特定的自签署证书或限制应用信任的公共 CA 集。
- 仅调试重写:在应用中以安全方式调试安全连接,而不会增加已安装用户的风险。
- 明文通信选择退出:防止应用意外使用明文通信。
- 证书固定:将应用的安全连接限制为特定的证书。
具体细节可以参考:
https://developer.android.google.cn/training/articles/security-config.html
我大致归类了一下:
1. 如果你设置了代理去抓包一下几种配置都是没有问题的:
配置自定义 CA
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config>
<domain includeSubdomains="true">example.com</domain>
<trust-anchors>
<certificates src="@raw/my_ca"/>
</trust-anchors>
</domain-config>
</network-security-config>
限制可信 CA 集
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config>
<domain includeSubdomains="true">secure.example.com</domain>
<domain includeSubdomains="true">cdn.example.com</domain>
<trust-anchors>
<certificates src="@raw/trusted_roots"/>
</trust-anchors>
</domain-config>
</network-security-config>
信任附加 CA
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config>
<trust-anchors>
<certificates src="@raw/extracas"/>
<certificates src="system"/>
</trust-anchors>
</base-config>
</network-security-config>
以上配置,如果没有设置代理,会存在一种风险:移除代理后,会出现网络访问失败的情况,这个时候需要你把AndroidMainfest.xml里面的android:networkSecurityConfig给去掉即可。
2.如果不想把AndroidMainfest.xml的安全设置去掉也是可以的:
使用以下方法:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<debug-overrides>
<trust-anchors>
<certificates src="@raw/debug_cas"/>
</trust-anchors>
</debug-overrides>
</network-security-config>
这样就不会影响到网络访问了。