
如果你跟我一样平时调试接口、排查线上问题、看 App 请求详情那 Charles 这个名字你大概率不陌生。简单说Charles 是一个运行在你电脑上的 HTTP/HTTPS 代理服务工具浏览器、App、小程序发起的网络请求都会经过它你就能清清楚楚看到请求头和响应体甚至还能手动篡改请求再发给服务器。很多刚接触的人把它当成“抓包工具”实际上它更像是一个网络请求的中转观察站所有流量经它一手自然什么都能看到。这篇内容我会从零开始把下载安装、证书配置、手机抓包、HTTPS 解密、模拟器抓包这类高频需求全部过一遍顺便把我在实际使用中踩过的坑也一并写出来。不管你是 Windows 用户、Mac 用户还是需要抓 iOS、安卓真机包的人这篇文章都能直接照着做。另外标题里提到的那些热门搜索词比如“charles 证书安装过了 windows 抓包还是 unknow”“苹果手机连接 charles 代理时无法下载证书”“雷电模拟器抓包”之类的我都会在正文里逐个拆解属于典型的新手拦路虎看一遍基本就能避开。1. 核心需求与场景解析1.1 先搞清楚Charles 到底能做什么在动手安装之前我觉得有必要先把 Charles 的定位说清楚否则你很容易把它和浏览器自带的开发者工具搞混。Charles 本质上是一个跨平台的 HTTP/HTTPS 代理工具。你在电脑上启动它以后它会监听一个本地端口默认是 8888然后你把手机、浏览器或者某个客户端的请求代理指向这个端口Charles 就能截获并解析这些流量。浏览器开发者工具只能看到浏览器自己发出的请求而 Charles 能看的是所有设备的请求比如同一局域网下 iPhone、安卓手机、模拟器里的 App 请求这些用浏览器工具是看不到的。更实用的是Charles 不止能“看”还能“改”。你可以打断一个请求修改请求参数再放行可以用来测试前端传参的边界情况也可以把某个线上接口重定向到本地文件这在联调前端页面时特别常用。换句话说它解决的是“我看不到数据”“我想模拟各种响应”“我要定位到底是前端还是后端的问题”这三类最常见的工作痛点。1.2 市面抓包工具对比为什么多数人选择 Charles很多人会纠结一个问题Fiddler、Charles、Wireshark、Stream 这些工具到底选哪个我简单说说我的理解。Fiddler 和 Charles 功能上高度重合都是代理型抓包工具都能解密 HTTPS。Fiddler 免费且只支持 Windows新版有 Fiddler Everywhere 跨平台版Charles 是付费软件但支持 Windows、macOS、Linux 全平台一次购买多平台使用。对于 Windows 用户Fiddler 和 Charles 差距不算大但如果你用 MacCharles 的体验会更稳定界面也更顺滑一些。Charles 在移动端抓包上有一个天然优势iOS 和安卓的 Wi-Fi 代理设置非常直观模拟器尤其是安卓模拟器的代理指向也很容易配通而且它的 SSL 代理机制对开发者友好很少出现装了证书但解密不了的情况。至于 Wireshark那已经属于网络协议分析级别了能看到 TCP/IP 层的数据但成本高、学习曲线陡日常调试用不上那么底层的东西。所以我的建议很简单如果你主要做 Web 调试和移动端接口分析Windows 上可以用 FiddlerMac 上直接选 Charles跨平台需要今天配 Windows 明天配 Mac就毫不犹豫选 Charles。2. 下载与安装细节2.1 官方下载渠道与版本选择Charles 的官方下载地址是它的官网我建议只从官网下载因为搜索引擎里排名靠前的第三方下载站很容易捆绑流氓软件而且版本可能非常旧。官网首页会根据你的操作系统自动推荐对应安装包Windows 用户下载.exe或.msiMac 用户下载.dmgLinux 用户有.tar.gz和.deb包。版本选择上有一个历史遗留问题需要注意。Charles 4.x 长期是主力版本2021 年后推出了 Charles 5界面有一些调整证书机制也做了优化如果你之前用惯了 4.x 也不用焦虑核心操作逻辑是一模一样的。新用户我建议直接下载官网当前主推版本不要寻找“汉化版”或“老版本”因为汉化版经常导致菜单项对不上教程反而增加学习成本。2.2 Windows 和 Mac 的安装差异Windows 安装没啥好说的一路 Next 就行默认会装到 Program Files 并把 Charles 加入开始菜单。值得一提的小细节是Windows 上 Charles 安装完成后首次启动会触发防火墙提示一定记得勾选“允许访问”否则后续手机和模拟器连接你电脑的 IP 时会直接失败而且官方文档根本不会提到这点我当时就被这个问题卡了半小时。Mac 上安装稍微有点不同。如果你用的是 Apple SiliconM1/M2/M3芯片建议下载官网针对 ARM 架构的版本虽然 Rosetta 转译也能跑但原生版本在代理转发大量数据时明显更稳。安装方式是标准的拖拽到 Applications 文件夹但首次启动可能被 Gatekeeper 拦截右键点击图标选择“打开”即可放行。安装完成以后打开 Charles 默认主页会显示一个提示大意是“你要启用 SSL 代理才能查看 HTTPS 流量”先不用着急点后面我会把配置过程一步步带过。2.3 试用授权到底能不能用Charles 是付费软件但不付费也能一直用只是每次启动后只能会话 30 分钟30 分钟后会自动退出重新打开又能继续用。对偶尔调试的人来说这种试用机制其实够用了只是不适合长时间挂着抓包。我个人建议如果你是高频使用者比如天天调接口还是值得买一份正版授权毕竟这工具的稳定性对工作效率影响很大。网上流传的各种注册名和注册码一方面大多已经失效另一方面也可能存在恶意风险为了省这点钱没必要拿自己的电脑开玩笑。如果你只是临时用一下那免费试用模式完全能覆盖需求。3. 核心配置与 HTTPS 抓包3.1 启动代理并确认端口Charles 安装后默认就会开启代理服务入口在菜单栏的Proxy-Proxy Settings勾选Enable HTTP Proxying端口默认是 8888。正常情况下不需要改端口但如果端口被其他程序占用了可以换成 8889、9090 之类的端口。启动代理后你可以在电脑上用浏览器随便访问一个网站Charles 界面里应该会立刻刷出一堆请求这就说明本机代理已经生效了。不过这里有一个新手很容易混淆的点Charles 抓取本机浏览器的请求有两种方式。一种是它自动把自己设置为系统代理Charles 启动时会默认接管系统代理设置另一种是手动配置浏览器代理指向127.0.0.1:8888。如果你发现浏览器请求不在 Charles 里优先检查菜单栏Proxy-Windows Proxy/Mac OS X Proxy这个选项是否处于勾选状态。3.2 电脑端 HTTPS 证书安装抓取 HTTP 请求不需要额外配置但遇到 HTTPS 网站时Charles 默认显示的是一堆乱码根本看不到明文内容。这是因为 HTTPS 的流量是加密的Charles 要解密它就需要在电脑上安装并信任一个根证书然后 Charles 用这个证书对客户端伪装成目标服务器从而解密通信内容。证书安装的路径是Help-SSL Proxying-Install Charles Root Certificate。Windows 系统会弹出证书导入向导选择“当前用户”存储区证书位置选“个人”即可导入完成后还需要打开“管理用户证书”在“受信任的根证书颁发机构”里确认 Charles Proxy CA 出现在列表中。Mac 系统则在钥匙串访问中需要手动设置信任具体为打开钥匙串访问找到 Charles Proxy CA双击把“信任”设为“始终信任”。一个我踩过很多次的坑就算电脑端已经安装了证书如果 SSL Proxying 设置里没有添加对应域名HTTPS 请求依然不会被解密。所以你还需要在Proxy-SSL Proxying Settings里勾选 Enable SSL Proxying然后在 Location 中添加*:443代表所有 443 端口的 HTTPS 流量才会全量解密。3.3 SSL Proxying 配置的两种思路配置 SSL Proxying 的 Location 有两种思路。一种是图省事直接添加*和端口*所有流量全部解密。这种做法在调试阶段没问题但 Charles 的性能会受影响而且在 Charles 里看到的请求会非常杂。另一种思路是只解密你关心的域名比如你的接口是api.example.com那就添加一个 LocationHost 填api.example.comPort 填443。这样 Charles 只解密这个域名下的 HTTPS 请求流量干净、速度快也避免证书信任问题在其他域名上引发误报。我的习惯是先用全量解密确认大致范围然后马上收紧成精确域名这样既能看到全景又不至于被刷屏。4. 手机抓包实战4.1 iPhone 真机抓包完整流程手机抓包是 Charles 使用频率最高的场景毕竟 App 里的请求用浏览器开发者工具看不到。iPhone 抓包的第一步是证书准备你需要先在手机上安装 Charles 的 SSL 证书。具体操作是Mac/Windows 电脑上打开 Charles菜单栏选择Help-SSL Proxying-Install Charles Root Certificate on a Mobile Device or Remote Browser这时 Charles 会提示“手机代理设置为你的电脑 IP:8888然后访问 chls.pro/ssl 下载证书”。然后打开 iPhone 的设置-无线局域网点击当前 Wi-Fi 右侧的i图标最底部找到配置代理选择手动服务器填你电脑的局域网 IP端口填 8888。设置完代理之后用 iPhone 自带的 Safari 浏览器访问chls.pro/ssl会弹出一个证书下载提示点击允许。下载完成后需要去设置-通用-VPN 与设备管理找到刚下载的描述文件点击安装。安装描述文件这一步还没结束iOS 10.3 以上的系统还得去设置-通用-关于本机-证书信任设置把 Charles Proxy CA 的开关打开否则你会遇到“证书已安装但抓包还是走不了 HTTPS”的情况。一切配置完之后打开任意 App 触发网络请求Charles 里就能看到这台 iPhone 的所有 HTTP/HTTPS 流量了。iOS 15 以上的系统在连接代理时会弹一个系统警告说“网络流量可能被拦截”这是正常提示点允许就行。4.2 Android 真机抓包与证书信任的坑Android 手机抓包的配置思路类似但在证书信任上有一个非常大的坑Android 7.0API 24及以上系统默认不再信任用户安装的 CA 证书这就导致即便你手机装好了证书很多 App 的 HTTPS 请求还是抓不到明文。如果你抓的 App 没有做网络安全配置限制可以用一个折中方案把 Charles 证书从“用户证书”装成“系统证书”。但普通手机一般没有 root 权限装系统证书比较困难模拟器反而容易所以很多开发者在安卓真机抓包时会选用 Android 6 及以下的旧版系统或者干脆用模拟器抓。具体配置步骤手机连接和电脑同一个 Wi-Fi进 Wi-Fi 设置把代理改为手动服务器为电脑 IP端口为 8888然后用手机系统浏览器访问chls.pro/ssl下载证书并安装到“CA 证书”里。安装完成后部分 App 仍显示请求失败或抓不到数据这时你可以尝试在 Charles 的Proxy-SSL Proxying Settings里确认你抓的域名已加入解密列表。需要特别提醒的是如果你只是抓一些网页版 H5或者允许明文流量的 App那 Android 7 的证书限制影响不大如果是抓市面上主流 App尤其是做过安全加固的应用那大概率还是会被证书校验挡住。这不是 Charles 的问题是 Android 系统的安全策略导致的。4.3 雷电模拟器等安卓模拟器抓包很多人在模拟器上抓包尤其是用 Windows 玩雷电模拟器时会发现配置了代理但 Charles 里啥也看不到。模拟器抓包和真机的差别在于模拟器通常有两种模式NAT 模式和桥接模式。NAT 模式下模拟器内部的网络地址和电脑主机不在同一网段如果代理 IP 填错了当然连不上。雷电模拟器抓包时推荐你先在模拟器的无线设置里查看当前 IP 网段然后把代理服务器填成10.0.2.2这个特殊地址。为什么填这个因为 Android 模拟器包括雷电模拟器基于的 Android 系统把10.0.2.2默认映射为宿主机你的电脑的 localhost相当于模拟器访问10.0.2.2就等于访问电脑上的 Charles。如果有的模拟器版本不支持这个地址那你就需要打开模拟器的桥接模式让模拟器直接和电脑处于同一局域网然后填电脑的局域网 IP。装证书的流程跟安卓真机一样在模拟器系统浏览器里访问chls.pro/ssl下载并安装证书。安装完成后同样受 Android 7 的证书限制影响如果你用的模拟器系统是 Android 9 或 10抓系统浏览器和 WebView 的请求通常没问题但抓某些强制校验证书的 App 依然会失败一般建议装一个 Android 6/7 版本的模拟器镜像用来做抓包测试。4.4 抓包前必须确认的四个前提手机和模拟器抓包看似简单但很多人反复失败我把常见的四个前提列出来你照着排查基本都能解决。第一电脑防火墙必须放行 Charles。Windows 首次启动时如果没有弹窗或者你手滑点了拒绝会在控制面板里单独给 Charles 添加入站规则。第二手机和电脑必须在同一个局域网。如果你手机连的是流量、公司访客 Wi-Fi或者电脑开了客户端隔离那手机是访问不到你电脑的 8888 端口的。第三手机代理必须手动配置。有的手机 Wi-Fi 支持“自动代理”但如果你填了自动代理地址却没有对应的 PAC 文件那就等于没配必须选手动并且 IP 和端口都正确。第四代理一旦配置成功手机的所有网络请求都会经过 Charles但 Charles 一旦关闭手机就会断网所以抓完包记得把代理关掉。这是新手反馈最多的“抓到包后手机怎么上不了网了”的原因。5. 高频问题排查实录5.1 Windows 抓包一直显示 Unknown这是热词里出现频率最高的问题“charles 证书安装过了windows 抓包还是 unknown”。很多人以为证书装了就能解决问题但显示 Unknown 的原因可能根本不是证书。排查顺序应该是先看请求是不是走代理了。启动 Charles访问一个 HTTP 网站观察能否正常显示。如果 HTTP 都显示 Unknown说明代理就没生效如果只有 HTTPS 显示 Unknown才需要排查证书。HTTPS 显示 Unknown 的常见原因有三个第一个是 Charles 的 SSL Proxying 设置里没有启用或者没有添加*:443第二个是证书安装时“证书存储位置”选错了Windows 上必须选择“受信任的根证书颁发机构”如果只装到了“个人”证书里Charles 无法正确调用第三个是部分浏览器如 Firefox默认不信任系统证书需要在 Firefox 的设置里手动导入 Charles 证书或者干脆把 Firefox 的证书机构设置为“使用系统根证书”。5.2 手机无法下载证书或连不上代理“苹果手机连接 charles 代理时无法下载证书”这个问题也特别常见。证书下载页面是一个专门的地址chls.pro/ssl如果你在手机浏览器里打不开不要怀疑是 Charles 坏了先检查代理是否真实生效、电脑端 Charles 是否处于监听状态、手机浏览器有没有被拦截。另外有一个细节chls.pro/ssl这个地址走的是 HTTP 而不是 HTTPS所以手机浏览器访问前你的 HTTP 代理必须已经配好。如果手机系统设置了“仅代理 HTTPS 流量”或者某些浏览器默认强行跳转 HTTPS就可能导致访问失败。遇到这种情况换用 Safari 或 Chrome 的系统默认模式而不是第三方浏览器成功率更高。下载证书之后如果提示“无效的证书”或“证书无法安装”优先检查电脑端 Charles 当前使用的证书是否被系统信任。Mac 用户特别注意钥匙串里 Charles 证书的信任设置必须是“始终信任”如果只是默认信任手机会拒绝安装。5.3 抓不到本机 Mac 数据Mac 上抓取本机数据是很多人搞不定的一个点。在 Charles 抓包时本机浏览器发出的请求通常走127.0.0.1但 Charles 默认不会解密来自本机 localhost 的 SSL 流量所以你会看到本地开发服务比如localhost:3000的请求进不了 Charles。解决方法是在 SSL Proxying 的 Location 里添加 Host 为localhost、Port 为你要抓的端口。还有一个更隐蔽的问题如果你的 Mac 上配置了系统代理但开了某些网络加速工具影响了系统代理的注入Charles 的“Mac OS X Proxy”选项看着是勾上的实际上却没生效。这种情况下我建议直接关掉第三方网络工具再重启 Charles通常就能恢复正常。5.4 Charles 抓包常见问题速查表现象可能原因解决方法本机浏览器能看到 HTTPHTTPS 是乱码SSL Proxying 未开启Proxy - SSL Proxying Settings 添加*:443手机连代理后所有请求超时电脑防火墙拦截或手机与电脑不在同一网段放行 8888 端口确认同一 Wi-Fi手机下载证书页面打不开代理没配好或浏览器跳转 HTTPS换 Safari/Chrome配置 HTTP 代理后访问chls.pro/sslAndroid 7 抓不到 App 的 HTTPS系统不信任用户证书使用旧版系统、模拟器或 root 后装系统证书模拟器抓不到包代理 IP 填错或系统版本过高使用10.0.2.2:8888或换 Android 6/7 镜像抓包后手机无法上网Charles 关闭导致代理失效停止抓包后关闭手机代理6. 效率技巧与后续扩展6.1 用 Focus 和 Filter 快速定位目标请求Charles 默认会显示所有经过它的流量数量多到你根本找不到目标。在 Charles 下方有Filter输入框可以直接输入域名关键词快速筛选更推荐的操作是右键点击你关心的请求选择FocusCharles 会把该域名下的请求单独归到一个标签页后续该域名的所有请求都会自动进入这个标签页其他流量完全不干扰。这个习惯一旦养成了你在 Charles 里的操作效率能翻一倍。我平时会同时打开两三个 Focus 标签一个放前端页面域名一个放后端接口域名再配合上方的搜索框定位问题基本是秒级。6.2 断点修改和 Map Local 重定向Charles 的价值不只是“看”还可以“改”。在Proxy-Breakpoints里添加规则后对应的请求在发送前和响应返回后会被打断你可以修改 header、body、状态码再点执行服务器收到的是你篡改后的数据或者客户端收到的是你伪造的响应。很多前后端联调时的异常场景模拟都可以通过断点功能完成。Map Local 就更常用了。它的原理是把某个请求的响应替换成本地文件。比如前端联调时后端接口还没写好你用 Map Local 把接口响应对应到一个本地 JSON 文件就能先行开发页面。配置路径是右键请求 -Map Local目标路径选一个本地文件勾选启用即可。6.3 结合其他工具继续扩展Charles 本身虽然强大但它专注的是调试场景。如果想把 Charles 抓到的流量导入 Postman 做接口管理可以在请求上右键选择Export导出为 Postman 格式直接导入后即可复用。如果你需要自动化处理接口也可以把 Charles 录制的会话导出为 HAR 格式在脚本环境里解析。我最近在做一些接口回归测试时就是先用 Charles 录制正常流程的请求然后导出 HAR再用脚本批量回放并对比响应差异效率比一个个造数据高很多。所以不要只把 Charles 当成一个“看包工具”它录下的流量本身就是你的测试资产。把这个思路拓展开你会发现它能帮你完成不少自动化工作。