1. 先把这个需求背景说清楚在红米Note 8 Pro上装Charles证书,这是很多做移动开发、接口调试、弱网测试甚至逆向分析的同学迟早会碰上的活。Charles本质上是个HTTP中间人代理工具,核心作用就是让你看到手机App发出的每个请求是什么样、返回了什么数据。我们平时在电脑浏览器里抓包很简单,因为Charles可以直接设置系统代理;但手机上要抓HTTPS包,就必须让手机“信任”Charles的根证书,否则所有加密的流量在Charles眼里都是一团乱码。为什么专门要讲红米Note 8 Pro?因为这个机器的系统和常见原生安卓机不太一样,它跑的是MIUI,Android版本从9到11都有,证书安装入口、权限弹窗、系统安全策略都有自己的一套逻辑。很多人在电脑上配置得好好的,一到手机端就卡住,要么证书下载不下来,要么下载了装不上,要么装上了依然抓不到包。这篇文章就是把我实际在红米Note 8 Pro上走过的每一个坑、验证过的每一条路径整理出来,新手可以直接跟着操作,老手也可以对照排查一下自己的问题出在哪。需要说明清楚一点:这里说的代理和证书安装,全部是开发调试场景下的合法操作,Charles也只是个流量分析工具,类似的服务端账号、App测试包这些都是你自己有权限去调试的东西,不要拿去做任何越权的事。2. 安装证书前必须懂的三个核心原理2.1 HTTPS在Charles眼里是怎么被“打开”的很多人装证书装了很多次,但始终没搞明白为什么装完证书就能抓包。这里用一个生活化的比喻:HTTPS请求相当于你给收件人写了一封上了锁的信,锁是收件人给的,只有收件人的钥匙能开。正常情况下,第三方偷看这封信只能看到一堆乱码。但Charles的做法是:它先拦下你原本要直接寄给服务器的信,然后自己动手拆开,看完了再用自己的钥匙重新包装一封新信寄给服务器,再把服务器回信的内容拆开看一遍后重新包装给你。这一切能成立的关键,就是这个“钥匙”。Charles使用的是一把叫“Charles根证书”的钥匙。手机或者电脑上如果没有安装这个根证书,浏览器、App就会认为Charles不是可信的中间人,会直接拒绝建立连接。而一旦安装了Charles根证书,手机就会无差别信任Charles,它就能顺利解密、查看、甚至修改流量。认清这个原理之后,你就能理解后面每一步操作的必要性了。2.2 安卓7.0和MIUI系统版本带来的证书信任问题安卓系统从7.0开始,有一个让无数开发者崩溃的改动:默认情况下,App自己发出的HTTPS请求不再信任用户手动安装的CA证书。也就是说,你在手机设置里费半天劲装好的Charles证书,只是让浏览器和部分应用信任,但很多App(尤其是目标调试的应用)直接无视它,照样加密通信,你照样抓不到包。红米Note 8 Pro出厂系统Android 9,后来升级MIUI 12甚至12.5,底层对应Android 11,这个问题一个不少。解决思路有几条:第一种,把证书移到系统证书目录,让App认为这是系统预置的信任证书,这是最彻底的办法,后面我会专门讲;第二种,用调试版本或者hook绕过证书校验,这种属于应用层操作,根据你自己的场景看需不需要;第三种,修改App的网络安全配置,但前提是这个App允许你改。MIUI系统版本的差异也很关键。早期MIUI基于Android 9时,证书安装入口在“设置 > 安全 > 加密与凭据”里;到了MIUI 12,变成了“设置 > 密码与安全 > 系统安全 > 加密与凭据”。很多人网上搜到教程后照着老路径找,找不到入口就以为手机坏了,其实只是路径变了。2.3 Charles的SSL Proxying功能开关每过一段时间就会有人跑来问:我在手机上下载安装了证书,代理也设置了,为什么Charles里看到的还是带锁的小图标,展开后全是乱码?一问才知道,Charles自带的SSL解密功能根本没开启。这不是手机的问题,是电脑端Charles的配置漏了。在Charles界面里找到Proxy菜单,打开SSL Proxying Settings,勾选Enable SSL Proxying,然后添加一条规则。最省事的做法是加一个Host填“*”,Port填“443”,这样所有443端口的HTTPS流量都会尝试解密。这和你安装证书是两回事,二者缺一不可。证书是让手机信任Charles,SSL Proxying开关是让Charles主动去解密流量,没有这个开关,流量只会原样透传,Charles并不会去碰加密内容。3. 实际操作前需要准备的几件事3.1 电脑端和手机端的软件准备电脑上先装好Charles,我用的版本是4.6.x,序列号的问题自己解决,这里不多聊。安装完成后先确认Charles能正常启动,随便在浏览器访问一个HTTP网页,能看到Charles界面上冒出请求,说明电脑端代理工作正常。红米Note 8 Pro手机端则需要保证系统是正常的,不要开什么省电模式之类的限制,如果开发调试频繁的话建议关掉MIUI对后台联网的限制。还有一点很多人忽视:手机和电脑必须连接到同一个WiFi网络,否则手机设置了代理地址也找不到电脑。用办公网或热点都可以,但确保路由设备没有开启AP隔离,否则设备之间互相无法访问。3.2 电脑端Charles的端口和本机IPCharles默认的HTTP代理端口是8888,这个不用改,除非你本机有其他程序占用了这个端口。启动Charles后,界面上会提示“Charles is running on port 8888”,说明端口正常。接着在Charles的Help菜单中选择Local IP Address,记下电脑当前在局域网里的IP地址,通常是192.168.x.x或者10.x.x.x这一类的。这一步是最容易出错的点之一:很多人的电脑同时连了WiFi和有线网,系统里有多个IP,你一定要选那个和手机同一网络的地址。简单验证方法是在手机浏览器里直接访问这个IP加端口,比如http://192.168.1.100:8888,如果出现一个写着欢迎页面的提示,说明手机能访问到你的电脑。这一步没通过之前,后面全白搭。3.3 手机WiFi代理设置红米Note 8 Pro上打开已连接的WiFi设置,长按当前WiFi名称,选择“修改网络”或“管理网络设置”,展开高级选项,代理方式选“手动”。主机名填刚才记下的电脑IP,端口填8888,然后保存。保存之后MIUI可能会弹窗提示“网络可能不可用”,因为系统发现经由代理访问有风险,直接选择仍然使用。如果这个弹窗导致代理配置被还原,还需要重新设置一次。这里建议你先把手机代理配好,再打开浏览器访问一个网页,如果浏览器能打开页面但Charles上出现了来自这个手机的请求,说明代理链路已经通了。提示:设置代理后,如果手机浏览器无法访问任何网页,先检查电脑端Charles的System Proxy是否被关闭,或者Windows防火墙是否放行了8888端口。4. 红米Note 8 Pro上安装Charles证书的完整流程4.1 用手机浏览器下载证书文件这一步是大多数人遇到的第一个拦路虎。手机在代理状态下,打开浏览器访问chls.pro/ssl。这个域名是Charles官方提供证书下载的地址,浏览器会自动下载一个crt或pem格式的证书文件。但有个很现实的问题:有时候浏览器会把证书文件直接识别成危险下载,或者提示格式不对。我实测过两种下载方式:第一种就是直接用浏览器下载,打开红米自带的浏览器或者Chrome都行,关键是确保当前处于代理开启状态。如果你没开代理就访问这个地址,那是Charles官方服务器直接给你发文件,文件根本不是你本地Charles生成的证书,装了也白装。第二种方式:在Charles的Help菜单中选择SSL Proxying,再选Save Charles Root Certificate,把它保存到电脑上,然后用微信或者数据线传到手机里点开安装。这种方式的好处是文件是本地生成的,绝对匹配,坏处是稍微麻烦一点。证书下载完成后,MIUI的下载目录里会多出一个后缀为.pem或者.crt的文件,可以通过通知栏找到它,按下方的“打开”按钮会直接进入系统证书安装向导。4.2 MIUI里安装CA证书的正确定位路径MIUI系统里安装CA证书的路径确实比较隐蔽,早期版本和现在版本还不一样。红米Note 8 Pro如果停在MIUI 10,路径是“设置 > 更多设置 > 安全 > 加密与凭据 > 安装CA证书”。如果升级到了MIUI 12或者更高,路径改成了“设置 > 密码与安全 > 系统安全 > 加密与凭据 > 安装证书”。点进去后选择CA证书,此时系统会提示你需要设置锁屏密码。如果之前没设锁屏密码,MIUI会强制先让你设置一个,这是安卓系统的安全策略,不能跳过。设置好密码后,找到刚才下载的.pem文件,选择安装。这里有个细节:在MIUI的一些版本里,安装CA证书的选项有两个,一个叫“CA证书”,一个叫“用户证书”,一定要选“CA证书”。很多人在这一步选了后者,装完一看证书列表里确实有Charles,但实际证书的信任级别不对,抓包还是失败,后面折腾半天才发现装错了地方。安装完成之后,系统会弹出“已安装CA证书”的提示,有时候还要求你输入一次锁屏密码确认。到这一步,证书安装本身已经完成了。可以去“加密与凭据”里点开“信任的CA证书”,在“系统”标签下面找一找,正常情况下根本看不到Charles;在“用户”标签下面就能看到。这就是安卓7.0后的用户证书信任策略,也是后面我们要处理的核心问题。4.3 把用户证书提升为系统证书这一步不是每个人都需要,但如果你要抓的是某个正经的App(不是浏览器),那基本绕不开。红米Note 8 Pro是能解锁Bootloader的(翻到底部连接小米账号申请解锁,等几天),有了root权限之后,用户证书转系统证书就有路了。具体操作是这样的:先用adb或者文件管理器从手机的数据目录里把用户证书导出来,路径是/data/misc/user/0/cacerts-added/,文件名是一串哈希加.pem后缀。然后计算它的哈希名称,用OpenSSL命令或者一些现成的脚本工具,得出一个在CA证书系统目录里不冲突的名称,复制到/system/etc/security/cacerts/目录下,给文件设置644权限,重启手机。如果你不想搞root,也可以让Charles配置好证书后,配合Frida或者调试版App处理。有一个更实用的情况:很多抠业务数据的同学根本不抓App的证书校验,而是直接改App的AndroidManifest,设置android:networkSecurityConfig允许用户证书,不过这取决于App有没有开启调试配置,不是所有App都能这么干。无论用哪种方式,最终目标都是让手机在信任层面把Charles当作系统信任的CA之一。每换一台手机,每重置一次设备,都要重复一遍操作,这也是很多人觉得抓HTTPS包麻烦的根源。4.4 验证证书是否生效证书装完之后,不要急着打开目标App,先做一个小实验:在电脑的Charles界面上,点Proxy菜单里的SSL Proxying Settings,确认Enable SSL Proxying勾选状态,再在Location里添加*和443。然后让手机浏览器访问一个HTTPS页面,比如https://www.baidu.com。回到Charles里,如果能看到百度的域名,并且展开请求下面的数据能看到明文内容和URL,说明整条链路已经通了。如果你看见请求还在,但上面全都是SSLHandshake: Received fatal alert: certificate_unknown之类的错误,说明证书没有正确装进用户证书目录;如果浏览器直接显示安全警告打不开页面,说明证书不匹配。检查方向很简单:重新下载证书、删除旧证书、重装一遍。5. 装完证书依然抓不到包的常见问题排查5.1 手机访问chls.pro/ssl时提示无法打开或下载不完整这个问题的根源几乎都是代理没有生效。你可以先去手机浏览器访问一个纯HTTP网站,比如http://www.baidu.com,如果打不开,说明代理链路有问题。排查顺序:确认Charles端口监听是否正常,确认Windows防火墙没拦8888端口,确认手机代理填的IP是PC在局域网内真实IP,确认没有写错端口。还有一个隐蔽的坑:Charles开启之后,它默认会同时把系统代理也设置好。如果你在电脑上访问chls.pro/ssl能下载证书,但手机访问不了,大概率不是Charles的问题,而是红米Note 8 Pro的系统“安全网络”功能,对代理访问做了限制。可以试着在手机浏览器里直接输入http://你的电脑IP:8888,如果返回Charles提示页,说明网络通;如果直接超时,那就要去MIUI设置里看看有没有开启“安全网络保护”之类的功能。5.2 证书文件下载下来后点击报错“格式无效”这种现象在红米自带的浏览器上出现的概率不低。原因是MIUI下载的证书文件被系统擅自修改了MIME类型,或者是下载到的文件只有几字节,说明下载过程被拦截。建议不要用自带浏览器下载,改用Chrome或者Edge,或者干脆从电脑上保存好证书文件传到手机上。传输方式用微信传文件或者数据线最简单,传完之后要确认文件名后缀是.crt或.pem,双击即可打开。如果仍然提示格式无效,把文件用文件管理器重命名一次再打开,有时候Oracle的pem文件和MIUI的MIME解析兼容性差,改个后缀就好。5.3 安装证书时提示需要锁屏密码,但设置后依然装不上MIUI安全策略规定:只有设置了锁屏密码的情况下才能安装CA证书。这个密码不是WiFi密码,不是应用锁密码,必须是系统锁屏密码。如果你已经设置了但加载证书时还是提示需要设置,有一种可能是你设置的密码类型太弱,比如无密码或滑动解锁。解决方法是去“设置 > 密码与安全 > 锁屏密码”,把类型改成PIN码或更高级别。同时确保手机当前没有开启“访客模式”或者“儿童模式”,这两种状态下系统不允许进行安全证书类操作。5.4 证书装好了、代理也配置完成,但目标App依然抓不到包这个问题要分两种情况来看:情况一:App发起了请求,但Charles里只看到TCP连接,看不到任何HTTP内容,而且刷新后请求数量很少,说明App的流量根本没走系统代理。微信小程序、部分游戏、银行App都会自己接管网络层,不走系统代理。对策是让手机使用透明代理,比如配合转发工具把所有TCP流量转发到Charles。情况二:Charles能看到请求,但展开后显示乱码,而且报错“SSLHandshake: Received fatal alert: unknown_ca”,这说明App做了证书校验。常见对策就是前面提到的把用户证书升级为系统证书,或者用Frida配合绕过pinning。红米Note 8 Pro上如果跑的是MIUI 12,还要注意一个点:MIUI的“隐私保护”功能里的“拦截网路”开关可能会对某些App生效,导致连接被切断。抓包时建议先把这个关闭,或者授权给调试的App。5.5 抓包过程中手机出现“网络波动”“无法连接”的提示出现这种情况大概率不是网络真的有问题,而是代理配置导致的。Charles没开着或者电脑IP变化了,手机里所有流量都会失败。红米Note 8 Pro的WiFi模块对这种情况有一个很烦人的表现:一旦代理失效,部分App直接显示服务器超时,但换个普通页面有时又能打开,很容易让人怀疑是App的问题而不是代理的问题。排查建议:先把代理关闭,确认手机网络恢复。然后重新确认电脑的IP(因为自动获取的IP是会变的),重配代理。最稳妥的办法是在电脑上把WiFi的IP设置成静态IP,比如192.168.1.110,这样以后手机设置代理不用反复改地址。5.6 证书只能用于部分App,比如浏览器能用但目标App不行这基本就是安卓7.0后用户证书信任问题的典型案例。如果你不想root,还有一个相对省事的办法:如果你的目标App本身就是你们自己开发的或者是可以修改的,直接在App的res/xml/network_security_config.xml里配置信任用户证书,如下所示:<network-security-config> <base-config cleartextTrafficPermitted="true"> <trust-anchors> <certificates src="system" /> <certificates src="user" /> </trust-anchors> </base-config> </network-security-config>然后在AndroidManifest.xml的application节点里加上android:networkSecurityConfig="@xml/network_security_config",重新打包安装即可。如果你只是调试别人的App,那还是老老实实root后把用户证书转成系统证书吧,别在这一步浪费时间。6. 用红米Note 8 Pro抓包时的一些实操心得6.1 抓包别开WiFi智能省电MIUI有一个WiFi智能省电模式,会间歇性断开网络连接以节省电量,抓包时这个功能会害得你断断续续。直接关闭:进入WiFi设置,点当前网络的设置按钮,关闭“智能省电”或者“网络优化”。这种优化平时感觉不明显,但抓包时非常致命,你会在Charles上看到请求时好时坏。6.2 控制好证书的安装时机证书装好一次之后,哪怕你后续重启手机也不会丢。但如果你恢复出厂设置、刷机升级系统,证书目录就会被清空。每次升级MIUI大版本之前,想清楚要不要保留调试环境,升级完之后重新走一遍证书安装流程。红米Note 8 Pro发布这么久,MIUI版本跨度非常大,我印象里至少经历了三轮证书安装路径变化。6.3 使用Charles的Filter功能提升效率开始抓目标App时,手机上其他App的后台请求也会一股脑涌进Charles界面。建议在Charles的主面板里添加Filter,比如加一个Host为api.example.com的过滤器,一眼就只看到目标请求。你还可以右键请求列表里的某条请求,选择Focus,把这条请求置顶标色,平时调试特别实用。6.4 弱网测试和断点修改要配合使用证书都弄好之后,Charles的威力才算真正释放。比如红米Note 8 Pro这种手机上做App弱网测试,在Charles的Proxy菜单下打开Throttle Settings,可以限速到3G甚至Edge网络,还能加丢包延迟。配合Breakpoint功能可以拦截请求,修改请求参数或者响应数据,再放行给App,做接口容错测试非常方便。我自己习惯的操作是:先Filter到目标接口,然后开启Throttle,断点打开,手动改几次响应,确认App逻辑没问题后再关掉。这套流程在红米Note 8 Pro上跑得很顺,注意改完响应之后要把Throttle和Breakpoint都关掉,否则后面所有请求都变得巨慢,让人误以为手机坏了。6.5 证书过期后的更新方法Charles证书是有有效期的。如果你的手机突然某天抓包全部失败,报错里出现“certificate expired”之类的字眼,基本就是证书过期了。处理方法是在电脑端Charles里删除旧证书,重新生成新证书,手机上把旧证书删掉,再走一遍下载安装流程。这里有个细节:一定要先把手机上旧证书删了再装新的,否则系统会因为存在同名证书而安装失败。7. 最后分享一点实际操作中的体会我在红米Note 8 Pro上反复折腾Charles证书的那段时间,最深的一个感受是:抓包这件事,90%的时间不是在抓包,而是在解决证书和代理链路的问题。MIUI和原生安卓的差异、安卓系统版本升级带来的策略变化、不同App的自有网络逻辑,都会让原本简单的事情变得复杂。所以如果你装在红米Note 8 Pro上遇到问题,先不要急着怀疑教程不对,一步一步按顺序排查:代理通不通、证书装没装、SSL Proxying开没开、App是否信任用户证书,绝大多数问题都在这个循环里。证书装好之后的体验,是真的香。你能在电脑上看着红米Note 8 Pro里每一个App向外发送的请求,看清楚它们上报的行为数据、用户异常信息、还有各种接口返回值,对排查线上问题的帮助是巨大的。如果条件允许,建议你多备一台专门用来调试的安卓手机,专门用于抓包测试,不要拿主力机折腾,毕竟证书信任级别提升后,对设备安全属于反向影响,用专用测试设备会更稳妥。希望这篇基于红米Note 8 Pro的Charles证书安装实战记录能给你省点时间。如果你照着操作一遍还没通,回头看看是不是中间某一步的入口找错了,或者证书下到了错误的文件,这两类原因的占比至少七成。剩下的三成,就是App本身在反调试上做了加固,那就只能靠更进阶的方案去解决了,改天有空再单独写一篇聊聊。
1. 先把这个需求背景说清楚在红米Note 8 Pro上装Charles证书,这是很多做移动开发、接口调试、弱网测试甚至逆向分析的同学迟早会碰上的活。Charles本质上是个HTTP中间人代理工具,核心作用就是让你看到手机App发出的每个请求是什么样、返回了什么数据。我们平时在电脑浏览器里抓包很简单,因为Charles可以直接设置系统代理;但手机上要抓HTTPS包,就必须让手机“信任”Charles的根证书,否则所有加密的流量在Charles眼里都是一团乱码。为什么专门要讲红米Note 8 Pro?因为这个机器的系统和常见原生安卓机不太一样,它跑的是MIUI,Android版本从9到11都有,证书安装入口、权限弹窗、系统安全策略都有自己的一套逻辑。很多人在电脑上配置得好好的,一到手机端就卡住,要么证书下载不下来,要么下载了装不上,要么装上了依然抓不到包。这篇文章就是把我实际在红米Note 8 Pro上走过的每一个坑、验证过的每一条路径整理出来,新手可以直接跟着操作,老手也可以对照排查一下自己的问题出在哪。需要说明清楚一点:这里说的代理和证书安装,全部是开发调试场景下的合法操作,Charles也只是个流量分析工具,类似的服务端账号、App测试包这些都是你自己有权限去调试的东西,不要拿去做任何越权的事。2. 安装证书前必须懂的三个核心原理2.1 HTTPS在Charles眼里是怎么被“打开”的很多人装证书装了很多次,但始终没搞明白为什么装完证书就能抓包。这里用一个生活化的比喻:HTTPS请求相当于你给收件人写了一封上了锁的信,锁是收件人给的,只有收件人的钥匙能开。正常情况下,第三方偷看这封信只能看到一堆乱码。但Charles的做法是:它先拦下你原本要直接寄给服务器的信,然后自己动手拆开,看完了再用自己的钥匙重新包装一封新信寄给服务器,再把服务器回信的内容拆开看一遍后重新包装给你。这一切能成立的关键,就是这个“钥匙”。Charles使用的是一把叫“Charles根证书”的钥匙。手机或者电脑上如果没有安装这个根证书,浏览器、App就会认为Charles不是可信的中间人,会直接拒绝建立连接。而一旦安装了Charles根证书,手机就会无差别信任Charles,它就能顺利解密、查看、甚至修改流量。认清这个原理之后,你就能理解后面每一步操作的必要性了。2.2 安卓7.0和MIUI系统版本带来的证书信任问题安卓系统从7.0开始,有一个让无数开发者崩溃的改动:默认情况下,App自己发出的HTTPS请求不再信任用户手动安装的CA证书。也就是说,你在手机设置里费半天劲装好的Charles证书,只是让浏览器和部分应用信任,但很多App(尤其是目标调试的应用)直接无视它,照样加密通信,你照样抓不到包。红米Note 8 Pro出厂系统Android 9,后来升级MIUI 12甚至12.5,底层对应Android 11,这个问题一个不少。解决思路有几条:第一种,把证书移到系统证书目录,让App认为这是系统预置的信任证书,这是最彻底的办法,后面我会专门讲;第二种,用调试版本或者hook绕过证书校验,这种属于应用层操作,根据你自己的场景看需不需要;第三种,修改App的网络安全配置,但前提是这个App允许你改。MIUI系统版本的差异也很关键。早期MIUI基于Android 9时,证书安装入口在“设置 > 安全 > 加密与凭据”里;到了MIUI 12,变成了“设置 > 密码与安全 > 系统安全 > 加密与凭据”。很多人网上搜到教程后照着老路径找,找不到入口就以为手机坏了,其实只是路径变了。2.3 Charles的SSL Proxying功能开关每过一段时间就会有人跑来问:我在手机上下载安装了证书,代理也设置了,为什么Charles里看到的还是带锁的小图标,展开后全是乱码?一问才知道,Charles自带的SSL解密功能根本没开启。这不是手机的问题,是电脑端Charles的配置漏了。在Charles界面里找到Proxy菜单,打开SSL Proxying Settings,勾选Enable SSL Proxying,然后添加一条规则。最省事的做法是加一个Host填“*”,Port填“443”,这样所有443端口的HTTPS流量都会尝试解密。这和你安装证书是两回事,二者缺一不可。证书是让手机信任Charles,SSL Proxying开关是让Charles主动去解密流量,没有这个开关,流量只会原样透传,Charles并不会去碰加密内容。3. 实际操作前需要准备的几件事3.1 电脑端和手机端的软件准备电脑上先装好Charles,我用的版本是4.6.x,序列号的问题自己解决,这里不多聊。安装完成后先确认Charles能正常启动,随便在浏览器访问一个HTTP网页,能看到Charles界面上冒出请求,说明电脑端代理工作正常。红米Note 8 Pro手机端则需要保证系统是正常的,不要开什么省电模式之类的限制,如果开发调试频繁的话建议关掉MIUI对后台联网的限制。还有一点很多人忽视:手机和电脑必须连接到同一个WiFi网络,否则手机设置了代理地址也找不到电脑。用办公网或热点都可以,但确保路由设备没有开启AP隔离,否则设备之间互相无法访问。3.2 电脑端Charles的端口和本机IPCharles默认的HTTP代理端口是8888,这个不用改,除非你本机有其他程序占用了这个端口。启动Charles后,界面上会提示“Charles is running on port 8888”,说明端口正常。接着在Charles的Help菜单中选择Local IP Address,记下电脑当前在局域网里的IP地址,通常是192.168.x.x或者10.x.x.x这一类的。这一步是最容易出错的点之一:很多人的电脑同时连了WiFi和有线网,系统里有多个IP,你一定要选那个和手机同一网络的地址。简单验证方法是在手机浏览器里直接访问这个IP加端口,比如http://192.168.1.100:8888,如果出现一个写着欢迎页面的提示,说明手机能访问到你的电脑。这一步没通过之前,后面全白搭。3.3 手机WiFi代理设置红米Note 8 Pro上打开已连接的WiFi设置,长按当前WiFi名称,选择“修改网络”或“管理网络设置”,展开高级选项,代理方式选“手动”。主机名填刚才记下的电脑IP,端口填8888,然后保存。保存之后MIUI可能会弹窗提示“网络可能不可用”,因为系统发现经由代理访问有风险,直接选择仍然使用。如果这个弹窗导致代理配置被还原,还需要重新设置一次。这里建议你先把手机代理配好,再打开浏览器访问一个网页,如果浏览器能打开页面但Charles上出现了来自这个手机的请求,说明代理链路已经通了。提示:设置代理后,如果手机浏览器无法访问任何网页,先检查电脑端Charles的System Proxy是否被关闭,或者Windows防火墙是否放行了8888端口。4. 红米Note 8 Pro上安装Charles证书的完整流程4.1 用手机浏览器下载证书文件这一步是大多数人遇到的第一个拦路虎。手机在代理状态下,打开浏览器访问chls.pro/ssl。这个域名是Charles官方提供证书下载的地址,浏览器会自动下载一个crt或pem格式的证书文件。但有个很现实的问题:有时候浏览器会把证书文件直接识别成危险下载,或者提示格式不对。我实测过两种下载方式:第一种就是直接用浏览器下载,打开红米自带的浏览器或者Chrome都行,关键是确保当前处于代理开启状态。如果你没开代理就访问这个地址,那是Charles官方服务器直接给你发文件,文件根本不是你本地Charles生成的证书,装了也白装。第二种方式:在Charles的Help菜单中选择SSL Proxying,再选Save Charles Root Certificate,把它保存到电脑上,然后用微信或者数据线传到手机里点开安装。这种方式的好处是文件是本地生成的,绝对匹配,坏处是稍微麻烦一点。证书下载完成后,MIUI的下载目录里会多出一个后缀为.pem或者.crt的文件,可以通过通知栏找到它,按下方的“打开”按钮会直接进入系统证书安装向导。4.2 MIUI里安装CA证书的正确定位路径MIUI系统里安装CA证书的路径确实比较隐蔽,早期版本和现在版本还不一样。红米Note 8 Pro如果停在MIUI 10,路径是“设置 > 更多设置 > 安全 > 加密与凭据 > 安装CA证书”。如果升级到了MIUI 12或者更高,路径改成了“设置 > 密码与安全 > 系统安全 > 加密与凭据 > 安装证书”。点进去后选择CA证书,此时系统会提示你需要设置锁屏密码。如果之前没设锁屏密码,MIUI会强制先让你设置一个,这是安卓系统的安全策略,不能跳过。设置好密码后,找到刚才下载的.pem文件,选择安装。这里有个细节:在MIUI的一些版本里,安装CA证书的选项有两个,一个叫“CA证书”,一个叫“用户证书”,一定要选“CA证书”。很多人在这一步选了后者,装完一看证书列表里确实有Charles,但实际证书的信任级别不对,抓包还是失败,后面折腾半天才发现装错了地方。安装完成之后,系统会弹出“已安装CA证书”的提示,有时候还要求你输入一次锁屏密码确认。到这一步,证书安装本身已经完成了。可以去“加密与凭据”里点开“信任的CA证书”,在“系统”标签下面找一找,正常情况下根本看不到Charles;在“用户”标签下面就能看到。这就是安卓7.0后的用户证书信任策略,也是后面我们要处理的核心问题。4.3 把用户证书提升为系统证书这一步不是每个人都需要,但如果你要抓的是某个正经的App(不是浏览器),那基本绕不开。红米Note 8 Pro是能解锁Bootloader的(翻到底部连接小米账号申请解锁,等几天),有了root权限之后,用户证书转系统证书就有路了。具体操作是这样的:先用adb或者文件管理器从手机的数据目录里把用户证书导出来,路径是/data/misc/user/0/cacerts-added/,文件名是一串哈希加.pem后缀。然后计算它的哈希名称,用OpenSSL命令或者一些现成的脚本工具,得出一个在CA证书系统目录里不冲突的名称,复制到/system/etc/security/cacerts/目录下,给文件设置644权限,重启手机。如果你不想搞root,也可以让Charles配置好证书后,配合Frida或者调试版App处理。有一个更实用的情况:很多抠业务数据的同学根本不抓App的证书校验,而是直接改App的AndroidManifest,设置android:networkSecurityConfig允许用户证书,不过这取决于App有没有开启调试配置,不是所有App都能这么干。无论用哪种方式,最终目标都是让手机在信任层面把Charles当作系统信任的CA之一。每换一台手机,每重置一次设备,都要重复一遍操作,这也是很多人觉得抓HTTPS包麻烦的根源。4.4 验证证书是否生效证书装完之后,不要急着打开目标App,先做一个小实验:在电脑的Charles界面上,点Proxy菜单里的SSL Proxying Settings,确认Enable SSL Proxying勾选状态,再在Location里添加*和443。然后让手机浏览器访问一个HTTPS页面,比如https://www.baidu.com。回到Charles里,如果能看到百度的域名,并且展开请求下面的数据能看到明文内容和URL,说明整条链路已经通了。如果你看见请求还在,但上面全都是SSLHandshake: Received fatal alert: certificate_unknown之类的错误,说明证书没有正确装进用户证书目录;如果浏览器直接显示安全警告打不开页面,说明证书不匹配。检查方向很简单:重新下载证书、删除旧证书、重装一遍。5. 装完证书依然抓不到包的常见问题排查5.1 手机访问chls.pro/ssl时提示无法打开或下载不完整这个问题的根源几乎都是代理没有生效。你可以先去手机浏览器访问一个纯HTTP网站,比如http://www.baidu.com,如果打不开,说明代理链路有问题。排查顺序:确认Charles端口监听是否正常,确认Windows防火墙没拦8888端口,确认手机代理填的IP是PC在局域网内真实IP,确认没有写错端口。还有一个隐蔽的坑:Charles开启之后,它默认会同时把系统代理也设置好。如果你在电脑上访问chls.pro/ssl能下载证书,但手机访问不了,大概率不是Charles的问题,而是红米Note 8 Pro的系统“安全网络”功能,对代理访问做了限制。可以试着在手机浏览器里直接输入http://你的电脑IP:8888,如果返回Charles提示页,说明网络通;如果直接超时,那就要去MIUI设置里看看有没有开启“安全网络保护”之类的功能。5.2 证书文件下载下来后点击报错“格式无效”这种现象在红米自带的浏览器上出现的概率不低。原因是MIUI下载的证书文件被系统擅自修改了MIME类型,或者是下载到的文件只有几字节,说明下载过程被拦截。建议不要用自带浏览器下载,改用Chrome或者Edge,或者干脆从电脑上保存好证书文件传到手机上。传输方式用微信传文件或者数据线最简单,传完之后要确认文件名后缀是.crt或.pem,双击即可打开。如果仍然提示格式无效,把文件用文件管理器重命名一次再打开,有时候Oracle的pem文件和MIUI的MIME解析兼容性差,改个后缀就好。5.3 安装证书时提示需要锁屏密码,但设置后依然装不上MIUI安全策略规定:只有设置了锁屏密码的情况下才能安装CA证书。这个密码不是WiFi密码,不是应用锁密码,必须是系统锁屏密码。如果你已经设置了但加载证书时还是提示需要设置,有一种可能是你设置的密码类型太弱,比如无密码或滑动解锁。解决方法是去“设置 > 密码与安全 > 锁屏密码”,把类型改成PIN码或更高级别。同时确保手机当前没有开启“访客模式”或者“儿童模式”,这两种状态下系统不允许进行安全证书类操作。5.4 证书装好了、代理也配置完成,但目标App依然抓不到包这个问题要分两种情况来看:情况一:App发起了请求,但Charles里只看到TCP连接,看不到任何HTTP内容,而且刷新后请求数量很少,说明App的流量根本没走系统代理。微信小程序、部分游戏、银行App都会自己接管网络层,不走系统代理。对策是让手机使用透明代理,比如配合转发工具把所有TCP流量转发到Charles。情况二:Charles能看到请求,但展开后显示乱码,而且报错“SSLHandshake: Received fatal alert: unknown_ca”,这说明App做了证书校验。常见对策就是前面提到的把用户证书升级为系统证书,或者用Frida配合绕过pinning。红米Note 8 Pro上如果跑的是MIUI 12,还要注意一个点:MIUI的“隐私保护”功能里的“拦截网路”开关可能会对某些App生效,导致连接被切断。抓包时建议先把这个关闭,或者授权给调试的App。5.5 抓包过程中手机出现“网络波动”“无法连接”的提示出现这种情况大概率不是网络真的有问题,而是代理配置导致的。Charles没开着或者电脑IP变化了,手机里所有流量都会失败。红米Note 8 Pro的WiFi模块对这种情况有一个很烦人的表现:一旦代理失效,部分App直接显示服务器超时,但换个普通页面有时又能打开,很容易让人怀疑是App的问题而不是代理的问题。排查建议:先把代理关闭,确认手机网络恢复。然后重新确认电脑的IP(因为自动获取的IP是会变的),重配代理。最稳妥的办法是在电脑上把WiFi的IP设置成静态IP,比如192.168.1.110,这样以后手机设置代理不用反复改地址。5.6 证书只能用于部分App,比如浏览器能用但目标App不行这基本就是安卓7.0后用户证书信任问题的典型案例。如果你不想root,还有一个相对省事的办法:如果你的目标App本身就是你们自己开发的或者是可以修改的,直接在App的res/xml/network_security_config.xml里配置信任用户证书,如下所示:<network-security-config> <base-config cleartextTrafficPermitted="true"> <trust-anchors> <certificates src="system" /> <certificates src="user" /> </trust-anchors> </base-config> </network-security-config>然后在AndroidManifest.xml的application节点里加上android:networkSecurityConfig="@xml/network_security_config",重新打包安装即可。如果你只是调试别人的App,那还是老老实实root后把用户证书转成系统证书吧,别在这一步浪费时间。6. 用红米Note 8 Pro抓包时的一些实操心得6.1 抓包别开WiFi智能省电MIUI有一个WiFi智能省电模式,会间歇性断开网络连接以节省电量,抓包时这个功能会害得你断断续续。直接关闭:进入WiFi设置,点当前网络的设置按钮,关闭“智能省电”或者“网络优化”。这种优化平时感觉不明显,但抓包时非常致命,你会在Charles上看到请求时好时坏。6.2 控制好证书的安装时机证书装好一次之后,哪怕你后续重启手机也不会丢。但如果你恢复出厂设置、刷机升级系统,证书目录就会被清空。每次升级MIUI大版本之前,想清楚要不要保留调试环境,升级完之后重新走一遍证书安装流程。红米Note 8 Pro发布这么久,MIUI版本跨度非常大,我印象里至少经历了三轮证书安装路径变化。6.3 使用Charles的Filter功能提升效率开始抓目标App时,手机上其他App的后台请求也会一股脑涌进Charles界面。建议在Charles的主面板里添加Filter,比如加一个Host为api.example.com的过滤器,一眼就只看到目标请求。你还可以右键请求列表里的某条请求,选择Focus,把这条请求置顶标色,平时调试特别实用。6.4 弱网测试和断点修改要配合使用证书都弄好之后,Charles的威力才算真正释放。比如红米Note 8 Pro这种手机上做App弱网测试,在Charles的Proxy菜单下打开Throttle Settings,可以限速到3G甚至Edge网络,还能加丢包延迟。配合Breakpoint功能可以拦截请求,修改请求参数或者响应数据,再放行给App,做接口容错测试非常方便。我自己习惯的操作是:先Filter到目标接口,然后开启Throttle,断点打开,手动改几次响应,确认App逻辑没问题后再关掉。这套流程在红米Note 8 Pro上跑得很顺,注意改完响应之后要把Throttle和Breakpoint都关掉,否则后面所有请求都变得巨慢,让人误以为手机坏了。6.5 证书过期后的更新方法Charles证书是有有效期的。如果你的手机突然某天抓包全部失败,报错里出现“certificate expired”之类的字眼,基本就是证书过期了。处理方法是在电脑端Charles里删除旧证书,重新生成新证书,手机上把旧证书删掉,再走一遍下载安装流程。这里有个细节:一定要先把手机上旧证书删了再装新的,否则系统会因为存在同名证书而安装失败。7. 最后分享一点实际操作中的体会我在红米Note 8 Pro上反复折腾Charles证书的那段时间,最深的一个感受是:抓包这件事,90%的时间不是在抓包,而是在解决证书和代理链路的问题。MIUI和原生安卓的差异、安卓系统版本升级带来的策略变化、不同App的自有网络逻辑,都会让原本简单的事情变得复杂。所以如果你装在红米Note 8 Pro上遇到问题,先不要急着怀疑教程不对,一步一步按顺序排查:代理通不通、证书装没装、SSL Proxying开没开、App是否信任用户证书,绝大多数问题都在这个循环里。证书装好之后的体验,是真的香。你能在电脑上看着红米Note 8 Pro里每一个App向外发送的请求,看清楚它们上报的行为数据、用户异常信息、还有各种接口返回值,对排查线上问题的帮助是巨大的。如果条件允许,建议你多备一台专门用来调试的安卓手机,专门用于抓包测试,不要拿主力机折腾,毕竟证书信任级别提升后,对设备安全属于反向影响,用专用测试设备会更稳妥。希望这篇基于红米Note 8 Pro的Charles证书安装实战记录能给你省点时间。如果你照着操作一遍还没通,回头看看是不是中间某一步的入口找错了,或者证书下到了错误的文件,这两类原因的占比至少七成。剩下的三成,就是App本身在反调试上做了加固,那就只能靠更进阶的方案去解决了,改天有空再单独写一篇聊聊。