Android network_security_config.xml 安卓网络安全配置文件写法

4次阅读

network_security_config.xml必须放在res/xml/目录下,文件名严格为network_security_config.xml,并在androidmanifest.xml的application标签中通过android:networksecurityconfig=”@xml/network_security_config”引用,否则不生效。

Android network_security_config.xml 安卓网络安全配置文件写法

network_security_config.xml 放哪才生效

必须放在 res/xml/network_security_config.xml,路径错一个字母或放错目录(比如丢进 assetsraw)都完全不生效。Android 构建系统只认这个固定路径,且文件名大小写敏感——NetworkSecurityConfig.xmlnetwork-security-config.xml 都会静默失败。

还要在 AndroidManifest.xml<application></application> 标签里显式引用:

<application     android:networkSecurityConfig="@xml/network_security_config"     ... >

漏掉这行,配置等于没写。

debug 模式下允许明文 http 怎么配

开发时调本地 API 经常遇到 Cleartext HTTP traffic to xxx not permitted 错误,直接改全局 android:usesCleartextTraffic="true" 是错的——它绕过所有校验,上线前极易忘记关,而且 Android 9+ 默认强制禁用,仅靠这个属性无法覆盖 network_security_config 的约束。

正确做法是用 <debug-overrides></debug-overrides> 块,它只在 debug 构建类型下生效,不影响 release:

<network-security-config>     <debug-overrides>         <domain-config>             <domain includeSubdomains="true">192.168.1.100</domain>             <trust-anchors>                 <certificates src="system" />                 <certificates src="user" />             </trust-anchors>             <allow-clear-text-http="true" />         </domain-config>     </debug-overrides> </network-security-config>
  • includeSubdomains="true" 要根据实际地址决定:如果只连 192.168.1.100:8080,设为 false 更安全
  • <allow-clear-text-http></allow-clear-text-http> 必须写在 <domain-config></domain-config> 内,写在根节点或 <domain-config></domain-config> 外无效
  • 调试用的自签名证书,记得同时加 <certificates src="user"></certificates>,否则即使开了明文,证书校验仍会失败

信任自签名证书或内网 CA 怎么写

对接测试环境或企业内网服务时,系统默认不信任自签名证书或私有 CA,会报 SSLHandshakeExceptionPKIX path building failed。不能简单关 https 校验,得精准导入证书。

步骤分三步:

  • 把 PEM 或 DER 格式证书(后缀 .crt.cer)重命名为小写字母 + 数字 + .cer(如 myca.cer),放进 res/raw/ 目录
  • network_security_config.xml 中引用:
    <domain-config>     <domain includeSubdomains="true">api.test.internal</domain>     <trust-anchors>         <certificates src="@raw/myca" />         <certificates src="system" />     </trust-anchors> </domain-config>
  • src="@raw/myca" 的路径必须和文件名完全一致(不含扩展名),@raw/myca.cer 会加载失败

注意:Android 7.0+ 才支持 @raw/ 引用;低于此版本只能靠 src="system" + 用户手动安装证书,兼容性差。

为什么 config 写对了但抓包还是被拦截

常见于用 Charles/fiddler 抓 App 流量时,明明配了 <certificates src="user"></certificates>,却提示证书不受信任。根本原因是:Android 7.0+ 默认不信任用户安装的证书,除非明确在配置中启用。

必须确保两点同时满足:

  • 证书已通过系统设置 → “加密与凭据” → “安装证书” 正确安装(不是浏览器里点开安装)
  • 配置中对应 domain 的 <trust-anchors></trust-anchors> 块里包含 <certificates src="user"></certificates>,且该块未被更高优先级的父配置覆盖

最容易忽略的是域匹配逻辑:如果 App 请求的是 https://api.example.com/v1,但配置里只写了 <domain>example.com</domain>includeSubdomains="false",那么 api.example.com 就不命中,仍走系统默认锚点(即不信任 user 证书)。

text=ZqhQzanResources