Fiddler HTTPS解密原理与中间人攻击:从证书信任到抓包实战
1. HTTPS到底在防什么从明文到加密的演进先聊一个很多人容易混淆的点HTTPS并不是一种新协议它就是HTTP加了一层TLS/SSL加密壳子。你平时在浏览器地址栏看到的https://前缀意味着这条链接上跑的HTTP报文在传输前会被TLS层加密到达对端后再解密还原成明文HTTP。这个加密过程对上层应用完全透明——你在浏览器里发请求、收响应感知不到加密的存在但对中间网络设备来说看到的只是一堆无法解读的密文。为什么要这么做核心原因是HTTP明文传输真的太脆弱了。想象一下你住在一个没有墙的房间里聊天隔壁有人拿个录音机就能把你说的每一句话录下来。HTTP就是这个没有墙的房间任何中间节点——路由器、交换机、ISP设备、WiFi热点——都能看到完整的请求和响应内容。早年间互联网还是个信任环境大家都觉得无所谓后来隐私问题、账号安全问题越来越严重全站HTTPS就成了硬性要求。HTTPS能解决的问题有三个维度第一是机密性报文加密后中间人只能看到密文第二是完整性传输过程如果被篡改TLS的MAC校验会让接收方立刻发现第三是身份认证通过数字证书体系让客户端确认自己连的确实是目标服务器而不是某个冒充者。这三个维度的组合构成了当前互联网信任体系的地基。但如果你拆开看TLS握手的过程会发现一个非常微妙的地方通信双方在正式加密之前需要先交换一些关键信息——支持的加密套件、随机数、证书、密钥交换参数。这一段加密之前的明文协商阶段是整个HTTPS安全模型里最薄弱的环节也是Fiddler这类抓包工具能够做文章的关键切入点。后面我会详细解释这一点。1.1 对称加密与椭圆密钥交换一次握手里到底发生了什么事要理解HTTPS为什么能被劫持必须先理解TLS握手里两套加密体系的分工协作。第一套是非对称加密也就是RSA或ECC这种公钥/私钥配对私钥只有服务器自己持有公钥可以随证书发放给任何客户端。第二套是对称加密比如AES客户端和服务器共享同一个会话密钥加解密效率非常高适合传输大量数据。TLS的聪明之处在于它不用非对称加密直接加密业务数据而是用非对称加密来安全地协商出一个临时的对称密钥。完整流程大致是——客户端先发一个ClientHello里面带着随机数、TLS版本和支持的加密套件列表服务器收到后回应ServerHello同样带自己的随机数并把自己的数字证书和公钥一起发给客户端客户端验证证书有效后双方通过密钥交换算法现代主流是ECDHE也就是椭圆曲线迪菲-赫尔曼生成一个只有双方知道的预主密钥再用这个预主密钥配合之前交换的两个随机数推导出最终用来加密业务数据的会话密钥。这里有个关键点ECDHE密钥交换的过程中客户端和服务器各自生成一对临时的椭圆曲线公私钥然后用对方的临时公钥和自己的临时私钥做乘法运算得到的结果是相同的——这就是迪菲-赫尔曼算法的核心原理。即使第三方监听了双方交换的所有公开参数椭圆曲线参数、各自的临时公钥也因为没有私钥而无法计算出最终的共享密钥。这也就是所谓的前向保密即使服务器主私钥泄漏历史会话也无法被解密。对于Fiddler来讲它最关心的是这中间两样东西一是服务器证书二是会话密钥的协商过程。只要它能拿到这两个环节的控制权就能让客户端和它之间建立一个加密会话同时它和真正服务器之间再建立另一个加密会话。这就是中间人的完整形态。1.2 证书体系客户端凭什么相信一个陌生公钥非对称加密里有一个绕不开的问题当客户端拿到一个公钥时它凭什么相信这个公钥真的属于目标服务器网络世界是开放的中间人可以伪造一切流量如果客户端盲目信任任何公钥攻击者只要替换公钥就能冒充服务器。数字证书就是为了解决公钥的归属认证问题。证书的本质是CA机构用自己私钥对服务器公钥和服务器身份信息域名、组织名等做的数字签名。浏览器的信任链是这样的操作系统或浏览器内置了一批受信任的根证书Root CA这些根证书自签名且被浏览器无条件信任CA机构用根证书签发中间证书中间证书再签发服务器证书形成一条信任链。客户端在验证服务器证书时会沿着证书链逐级回溯直到找到自己信任的根证书并逐级校验签名是否有效、证书是否过期、域名是否匹配。这套体系在正常情况下是天衣无缝的但它有一个前提假设客户端本地的信任库是干净、可信的。一旦这个假设被打破——比如用户手动安装了一个原本不在信任库里的根证书——整个信任链就会出现一条可被利用的分支。Fiddler的HTTPS解密功能本质就是利用这一点它在本地生成一个自签名的根证书然后要求你在系统信任库里安装它。安装之后你本机的所有客户端都会相信Fiddler签发的任何证书。这个概念非常重要请先记住一句话中间人攻击能否成功不取决于加密算法本身有多强而取决于客户端是否信任了攻击者注入的根证书。HTTPS的安全边界在用户点下信任按钮的那一刻就已经被重新划定了。2. Fiddler实现HTTPS内容劫持的核心原理Fiddler本质上是一个HTTP/HTTPS代理服务器。它监听本机的8888端口默认所有浏览器和App的流量在作用域内都会先经过Fiddler再由Fiddler转发给真实服务器。对普通HTTP流量它只是记录和展示对HTTPS流量它要做的事情就要复杂得多了。开启HTTPS解密功能之后Fiddler的完整工作流程是这样的——第一步客户端向Fiddler发出CONNECT请求声明自己要访问的目标域名和端口比如CONNECT www.example.com:443这个过程发生在真正建立TLS连接之前看起来就像客户端在告诉代理我要去跟example.com说秘密帮我搭条线。第二步Fiddler以目标服务器的身份向客户端出示一张证书。这张证书不是example.com真正的证书而是Fiddler用自己生成的根证书即时签发的一张同名证书——证书上的域名完全一样但签发者不再是CA而是Fiddler的根证书。第三步如果客户端信任了Fiddler的根证书那么它就会信任这张伪造的证书双方随即完成TLS握手建立加密隧道。与此同时Fiddler作为客户端向真正的example.com发起另一个TLS握手这次使用的是真实证书验证过程完全正常。等两条隧道都建立起来Fiddler就站在正中间左手拿着客户端发给它的明文右手拿着它从服务器收到的密文。它在中间做翻译从客户端隧道解密数据用服务器隧道重新加密发送收到响应后反向操作。整个过程两端的系统毫无感知——客户端以为自己在跟example.com通信example.com以为自己在跟一个正常客户端通信只有Fiddler清楚两边都是我。2.1 为什么客户端会相信Fiddler签发的假证书这是整个机制里最关键的一环。当Fiddler向客户端出示伪造证书时客户端会做三件事检查证书是否过期、检查证书域名是否匹配、检查证书是否由可信CA签名。前两项Fiddler都能轻松应对——即时生成证书时域名就是要访问的那个域名有效期也可以设得很长。第三项就依赖前面说的根证书信任。如果你没有安装Fiddler的根证书客户端会弹出证书错误警告——浏览器的表现是您的连接不是私密连接移动端App则可能直接拒绝连接或者握手失败。但只要你安装了Fiddler生成的根证书通常叫FiddlerRoot Certificate那情况就完全不同了。因为Fiddler伪造证书的签名链可以回溯到这个根证书而你的系统现在把它标记为受信任客户端验证时沿着信任链一查发现最终落在信任库里证书校验就通过了。你可以做一个实验来验证这个逻辑拿一台没有安装Fiddler根证书的机器去走抓包流程所有HTTPS请求都会报证书错误安装根证书后同一批请求全部正常显示密文被解密后的明文。这个对比实验能让你直观体会到信任根证书这四个字的分量。用生活化的方式理解正常的证书体系相当于你认识一个权威机构比如公安局它能证明每个公民的身份Fiddler的做法是伪造了一个公安局在你自己家院子里然后把自家院子挂上公安局的牌子让你认为它权威。你一旦默认了它它给任何人出具的假身份证你都认。2.2 从解密到劫持同一个机制的双面性理解了上面的原理你就会发现一个非常有意思的事实Fiddler的HTTPS解密功能和恶意中间人攻击在技术实现上完全是同构的。区别只在于安装根证书的人是不是你本人、数据流向是不是受你控制。这带来一个后果一旦你本机被安装了一个恶意生成的根证书攻击者完全可以用同样的方式截获你所有的HTTPS流量——账号密码、银行验证码、聊天记录全部以明文形式暴露给攻击者。在实际的安全工作中这种攻击手法确实被大量使用比如在公共WiFi环境下注入恶意根证书、在钓鱼App中诱导用户安装证书等。也正因为如此现在越来越多的应用开始做证书锁定Certificate Pinning来对抗这种攻击——App在代码里固定了服务器证书的指纹即使系统信任了Fiddler的根证书App也坚持我只认这个指纹的证书。这也是为什么你用Fiddler抓某些大型互联网公司的App时经常抓不到内容或者报SSL握手失败。3. Fiddler配置HTTPS解密的实操全流程理论讲了不少下面进入实操。我先说明一下环境和版本本文以Fiddler Classic经典版个人使用免费在Windows 10/11上的配置为例这个版本虽然官方更新频率不高但对理解原理、做调试完全够用。如果你用的是Fiddler Everywhere跨平台商业版菜单路径会略有不同但核心配置逻辑是一样的。3.1 开启HTTPS解密三步完成核心配置操作路径是打开Fiddler从菜单栏找到Tools - Options - HTTPS选项卡。在HTTPS选项卡里勾选Capture HTTPS CONNECTs和Decrypt HTTPS traffic两个复选框。勾选后会弹出证书安装提示一路点是把它装到受信任的根证书颁发机构存储区。这一步完成后Fiddler本身已经可以解密HTTPS流量了。我建议你把Decrypt HTTPS traffic旁边的选项也看一眼——有些版本会让你选择解密范围比如全部进程还是仅浏览器。抓浏览器场景选全部进程没毛病但如果你只调试特定App可以暂时保持默认后续在过滤器里限制。还有一个高频需求有些用户为了使用方便会把Fiddler Core注册为系统代理。默认情况下Fiddler启动后会自动把IE/系统代理设置为127.0.0.1:8888很多浏览器Chrome默认走系统代理Firefox也支持都会自动把流量送进Fiddler。如果你不想让Fiddler接管全局代理可以在Tools - Options - Connections里取消勾选Use system proxy相关选项改成手动配置浏览器代理。3.2 让手机流量也能无线解密局域域网App抓包配置用Fiddler抓手机App的HTTPS流量是这个工具最常见的场景。配置分为两步——代理设置和证书安装。第一步确认Fiddler所在电脑和手机处于同一个局域网。在Fiddler的Tools - Options - Connections里勾选Allow remote computers to connect并记下Fiddler监听的端口默认8888。同时注意Windows防火墙可能会拦截入站连接要放行Fiddler进程否则手机连不上。第二步在手机的WiFi设置里把代理改成手动主机名填电脑的局域网IPcmd里ipconfig可以查到通常是192.168.x.x或10.x.x.x端口填8888。保存后手机访问一个HTTP网站比如http://example.com你应该能看到Fiddler里出现来自手机的请求。第三步是重点——给手机安装Fiddler根证书。手机浏览器访问 http://电脑IP:8888Fiddler会在该地址提供一个下载页里面有FiddlerRoot certificate.cer的下载链接下载并安装即可。iOS设备安装后还需要去设置 - 通用 - 关于本机 - 证书信任设置里手动打开对Fiddler根证书的完全信任开关否则证书虽装了但不算数。这个步骤很多人漏掉导致死活抓不到HTTPS明文。3.3 为什么有些App抓不到内容Android 7.0与iOS的证书锁定你会发现一个规律抓浏览器网站基本都能解密抓大型App却经常失败。根源在于系统版本和应用自身的安全策略。Android 7.0API 24开始系统默认只信任系统级CA不信任用户安装的CA。你在设置里装的Fiddler证书属于用户级CAApp的默认配置是不会信任它的。所以抓包时你会发现App弹错误或者连接超时。解决办法有两个方向一是有些App自己写了networkSecurityConfig允许信任用户CA少见二是你得用能修改系统证书分区的手段比如root过的设备或者Magisk的证书模块把Fiddler证书装进系统证书区。同理苹果设备上抓App也是类似的逻辑——普通证书安装无法影响那些做了证书锁定的应用。Fiddler官方对这类问题有一个常见结论抓不到内容不代表工具坏了而是对方的安全机制在起作用。反过来看这恰恰说明HTTPS加密和证书校验机制在实际对抗中是有效的。如果一个App什么防护都不做任何安装了根证书的中间人都能轻松换取全部敏感数据这种产品本身安全不过关。4. 常见问题与排查技巧实录实际操作中你会遇到各种各样的报错和异常这里把我踩过的一些坑整理成速查表。现象常见原因排查与解法开启解密后浏览器报您的连接不是私密连接Fiddler根证书未正确安装到系统信任库重新安装证书确认证书被放入受信任的根证书颁发机构Fiddler里看不到任何HTTPS请求未开启系统代理或浏览器配置了独立代理检查Fiddler是否设置为系统代理重启浏览器手机连接到电脑IP:8888打不开下载页Windows防火墙拦截、不在同一局域网、端口被占用检查局域网、放行防火墙或更换端口iOS安装证书后HTTPS仍然解密失败iOS未开启证书完全信任开关设置 - 通用 - 关于本机 - 证书信任设置 - 打开开关某些App抓不到HTTPS内容Android 7.0用户CA不信任、证书锁定使用系统证书方案或考虑Root理解并接受该App做了防护启动Fiddler后整个电脑上不了网代理配置异常、崩溃导致代理残留关闭Fiddler检查系统代理设置必要时手动重置代理抓不到localhost的HTTPS流量部分系统/浏览器对localhost请求绕过代理加过滤器或用http://localhost.zz/绕过规则4.1 打开Fiddler后浏览器上不了网代理残留问题在所有问题里这个最让人抓狂。Fiddler退出或者崩溃后Windows系统代理有时候会残留一个指向8888端口的设置而这时候Fiddler已经没在监听端口了所有流量都发向一个黑洞结果就是网页全部打不开。排查思路分两步先关闭Fiddler打开设置 - 网络和Internet - 代理看一下手动代理是否还开着如果开着关闭它或者改回自动配置。如果你用的是Fiddler的内置功能也可以让它退出时自动恢复系统代理在Tools - Options - Connections里勾选Monitor all connections旁边的那些清理类选项。我的习惯是每次用完Fiddler先正常退出不要直接杀进程让它有机会清理代理。4.2 SSL握手失败不是所有握手失败都是证书问题Fiddler解密HTTPS时有时候会报类似ReadResponse() failed: The server did not return a response for this request或者SSL handshake failed之类的错。很多时候大家第一反应是证书没配好但真实场景里可能是服务端用了客户端不支持的加密套件应用开启了双向TLS认证客户端也需要出示证书服务器对TLS指纹有检测Fiddler与服务器之间的TLS握手本身被服务器的安全策略拒绝。遇到这类问题推荐思路是先用浏览器直连目标站点确认网络本身通不通再用curl或者OpenSSL去手动测试TLS层是否正常比如openssl s_client -connect www.example.com:443 -servername www.example.com这样可以快速把问题边界划清楚——是Fiddler的问题还是目标服务器的问题。4.3 弱网测试Fiddler的另一个隐藏技能除了抓包解密Fiddler还有一个被广泛使用的功能是模拟弱网环境。菜单里Rules - Performance - Simulate Modems Speeds就是一个简单节流开关开了之后所有请求会按一个较慢的速度发送。进阶的做法是在ScriptEditor里修改OnBeforeRequest中的延迟时间参数自定义上行/下行带宽和延迟模拟2G/3G网络下App的行为逻辑。类似的你还可以修改请求的响应状态、注入自定义请求头、断点调试响应数据——这些都是做接口联调和异常场景测试时的利器。我自己的使用习惯是把Fiddler当成一个看门狗用AutoResponder功能把某个接口的响应替换成写死的Json来测试前端对错误数据的容错或者用Composer功能手工构造请求来验证服务端接口的边界条件。抓包解密只是它最出圈的一个功能它的可玩性远比想象中高。5. 抓包能力的边界哪些能做哪些绝对不能碰写到这里我觉得有必要停下来认真聊一下边界问题。Fiddler的HTTPS解密能力是一把地地道道的双刃剑。技术本身无善恶但使用技术的人是有的。能做的场景包括调试你自己开发的Web和App应用对公司内部系统做接口联调和压力测试在授权范围内对自有系统的安全漏洞进行检测在测试环境复现线上问题。这些场景的共同点是——你对目标系统拥有合法的调试权限或者你是系统的开发维护者。不能做的场景也很明确未经授权对他人网站、他人App、他人设备进行流量抓取和解密无论目的是什么都属于越权行为。尤其是对金融、支付、社交类应用做这种操作可能直接涉及违法犯罪。即使技术上讲Fiddler是调试工具我只是看看法律上不会因为工具的中立性而免去你的责任。还有一个容易被忽视的底线不要在未经同意的情况下抓取他人的通信内容。你做的每一步解密本质上是获取了数据所有者不希望第三方看到的信息。技术兴趣归技术兴趣对他人数据的尊重是根植于职业伦理的基本素养。5.1 证书锁定的存在意义它不是你的敌人现在很多App做了证书锁定导致Fiddler抓不到包。有些开发者因此吐槽太妨碍调试了。我的观点是证书锁定是应用安全体系中合理且必要的组成部分它在设计上就是为了对抗中间人攻击——不管这个中间人的动机是恶意的还是善意的。作为开发者如果你明确需要抓包调试这类App正确的做法是第一要求后端提供测试环境专用的证书校验配置允许在Debug包中禁用Certificate Pinning第二使用自带调试入口的移动端框架比如Flutter/Dart VM服务、OkHttp拦截器等抓取应用层日志第三在审批授权范围和合规条件下选择专业的HTTPS调试工具配合测试设备做专项测试而不是绕过锁定去强行解密。我见过一些团队为了抓大厂App的数据花了很多功夫研究各种绕过手段。说实话这些努力投入在正向上也许早就解决了自己的技术问题。5.2 正确使用Fiddler的六个原则敲了这么多字最后想把自己日常使用Fiddler时给自己定的几条规矩分享出来希望能对你有参考价值第一只在调试自己拥有或获明确授权的系统和设备时开启HTTPS解密排查他人系统之前先确认授权边界第二不使用抓包来的数据做任何与调试目的无关的事情尤其不触碰账户密码、验证码、身份证号等高敏信息第三测试环境中尽量使用虚拟测试账号不用真实的高权限账号做抓包验证第四每次测试结束后关闭Fiddler并检查系统代理恢复同时清理测试过程中留下的证书和日志文件第五理解并尊重目标系统的安全机制如证书锁定、双向认证等它们保护的不是你而是最终用户第六自己写代码调试时把HTTPS解密功能当作一个开发工具而不是一个攻防工具。我觉得搞技术的人最值得保持的一个习惯就是——在动手之前先想想这个操作放在阳光下能不能说得清。如果说不清那大概率就是越界了。Fiddler本身是无辜的能不能用好它取决于使用者的边界感。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →