android7.0证书校验问题

针对安卓7.0系统后不再信任用户导入证书的问题,本文介绍了解决方案,包括在项目中配置network-security-config.xml文件,实现不同环境的证书信任控制,确保测试和正式环境的HTTPS请求正常。

安卓7.0系统之后,系统不再信任用户导入的证书,并且自己项目里面的自签名证书也会不受信任。这样就导致,第一:抓包软件可能抓不到https的请求,第二:如果你的证书不是ca的证书,是自签名的证书,将无法请求服务器。

在谷歌开发者文档上面可以看到解决方案https://developer.android.google.cn/training/articles/security-config。这篇文章只是对这个文档的一个总结。详细的内容请看上面的链接。

解决方式:

1.在项目目录main/res/xml下新建network-security-config.xml文件

2.在AndroidManifest.xml文件下的application节点添加

android:networkSecurityConfig="@xml/network_security_config"

 

<?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>

思考一:上面配置会让线上的包也会被抓到,如果我只想抓测试环境的包和debug下正式环境的包该如何改进这个配置?

解答一:通过配置多个dmain 的字段。把测试环境的域名加上,过滤正式环境的域名。这样达到只抓取测试服务器的域名了。如果你想在debug下抓正式环境的数据,那么在domain-config下添加 <debug-overrides>节点,然后再这个节点下添加正式环境的域名。这样正式环境就只在debug下才能被抓取了。<network-security-config>
    <domain-config>
        <debug-overrides>
            <domain includeSubdomains="true">正式环境域名</domain>
        </debug-overrides>
        <domain includeSubdomains="false">测试环境域名</domain>
        <trust-anchors>
            <certificates src="user"/>
        </trust-anchors>
    </domain-config>
</network-security-config>

思考二:但是有些公司测试环境,正式环境连得域名是一样的,只是dns做了转发,这类情况如何解决;

解答二:这里提供一个思路,通过在gradle配置里面设置一个boolean值来区分测试包还是正式包,如果是测试包,那么添加这个net_config的配置,否则正式包不配置。

思考三:大部分公司环境有多套:test,dev,uat等,那么一个个环境一起加总感觉麻烦,有没有方便的解决方式

解答三:比如你的环境有如下域名 test.csdn.com,dev.csdn.com,uat.csdn.com, 那么 你只要添加csdn.com就能把这三个域名都包含进来。注意includeSubdomains必须为true才是模糊匹配,否则是精确匹配。

结语:有啥其他问题请留言

<think>好的,我现在需要解决用户Android11上使用Charles时遇到的证书不被信任问题。首先,我得回忆一下Android系统证书信任的机制变化。记得从Android7(API24)开始,系统不再信任用户安装证书,除非应用明确配置为信任用户证书。这可能影响到像Charles这样的工具,因为用户安装的Charles证书可能不被系统应用信任。接下来,用户提到的是Android11,所以这个限制仍然存在。解决方法通常括将Charles证书安装系统证书,但需要root权限,这可能对普通用户来说比较困难。不过,有些设备允许通过将证书移动到系统证书目录来解决,即使没有root,比如通过ADB。例如,用户可能需要将证书文件重命名为特定的哈希格式,并使用adb remount和push命令将其放入/system/etc/security/cacerts目录中。不过,这需要设备解锁并允许分区挂载为可写,这可能在某些设备上不可行。另外,还有一种方法是为应用添加网络安全配置,即在应用的AndroidManifest.xml中设置networkSecurityConfig,指定信任用户证书。但这种方法需要修改应用本身,对于非开发用户来说可能不适用,特别是对于第三方应用。不过,如果是用户自己开发的应用,可以在配置文件中添加相应的设置。用户可能已经尝试过安装Charles证书用户证书存储,但发现部分应用仍然不信任,尤其是那些targetSdkVersion>=24的应用。这时候需要确认证书是否正确安装,并且是否被系统认可。另外,检查Charles的SSL代理设置是否正确,是否启用了SSLProxying,可能需要配置Charles的SSL位置为正确的域名或通配符。 还可能存在时间或日期不正确的问题,导致证书验证失败,但这种情况相对少见。用户需要确保设备时间与Charles主机时间同步。另外,参考到引用中提到的AndroidWebViews存储cookie的情况,可能有些应用使用WebView,而WebView的证书信任链可能需要单独处理。但不确定这是否相关。总结可能的解决步骤:1.安装Charles证书用户证书,并确保正确安装。2.尝试将证书安装系统证书(需要ADB或root)。3.配置应用的网络安全配置以信任用户证书(适用于自己开发的应用)。 4.检查Charles的SSL代理设置,确保正确拦截目标域名。5.验证设备时间和日期是否正确。 6.对于无法修改的系统应用,可能需要使用已root设备或自定义ROM。需要详细说明每一步的具体操作,尤其是如何通过ADB安装系统证书,这可能对用户来说比较有挑战性,但有些教程可能指导用户如何操作。例如,生成证书的哈希文件名,使用adb remount,然后push到系统证书目录。同时提醒用户注意风险,如分区损坏可能。另外,可能需要指导用户导出Charles证书的正确方式,确保是.pem格式,并且正确转换为.crt格式,以及正确的哈希命名规则。 最后,生成相关问题,帮助用户进一步解决可能遇到的障碍,例如如何处理没有root的情况,或者如何配置特定应用的网络安全设置。</think>### Android 11 Charles代理证书不被信任的解决方案 #### 原因分析 Android 11延续了自Android 7(API 24)以来的安全策略:**默认不信任用户安装证书**,仅信任系统证书。这导致通过Charles等工具安装用户证书无法被部分应用(尤其是`targetSdkVersion>=24`的应用)信任[^1]。 --- #### 分步解决方案 1. **安装Charles证书用户证书** - 步骤: 1. 在Charles中导出证书:`Help → SSL Proxying → Save Charles Root Certificate`,选择`.pem`格式。 2.证书发送到手机,通过系统设置安装(路径:`设置 → 安全 → 加密与凭据 → 安装证书 → CA证书`)。 - 验证:打开浏览器访问HTTPS网站,确认无证书警告。 2. **将证书安装系统证书(需ADB)** - **适用场景**:无root权限但能启用`USB调试`的设备。 - 步骤: 1. 将`.pem`证书转换为`.crt`格式,并生成哈希文件名: ```bash openssl x509 -inform PEM -subject_hash_old -in charles.pem | head -n 1 # 输出类似"c3a11b2d",重命名为"c3a11b2d.0" ``` 2. 通过ADB推送证书系统目录: ```bash adb remount # 可能需要设备已解锁并允许分区挂载 adb push c3a11b2d.0 /system/etc/security/cacerts/ adb shell chmod 644 /system/etc/security/cacerts/c3a11b2d.0 adb reboot ``` - **注意**:部分设备系统分区不可写,需解锁Bootloader或使用Magisk模块实现[^3]。 3. **配置应用信任用户证书** - **适用场景**:自开发应用。 - 修改`AndroidManifest.xml`: ```xml <application android:networkSecurityConfig="@xml/network_security_config"> ``` - 创建`res/xml/network_security_config.xml`: ```xml <network-security-config> <base-config trustUserCAs="true" /> </network-security-config> ``` 4. **Charles配置验证** - 确保启用SSL代理:`Proxy → SSL Proxying Settings → Add`,配置域名(如`*:*`通配所有地址)。 - 检查代理端口(默认8888)是否与设备设置一致。 --- #### 特殊情况处理 - **WebView应用**:若目标应用使用WebView,需确保WebView客户端启用`setWebContentsDebuggingEnabled(true)`并重写证书验证逻辑[^1]。 - **时间同步问题**:检查设备时间与Charles主机时间误差是否在5分钟内。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值