利用Fiddler和Wireshark解密SSL加密流量
原文地址:http://kelvinh.github.io/blog/2014/01/12/decrypt-ssl-using-fiddler-and-wireshark/
Fiddler是一个著名的调试代理工具,它不仅能解析HTTP,而且还能解析加密的HTTPS流量。Wireshark则是一个非常强大的网络包监控以及协议分析工具。 在本文中,只考虑使用SSL来加密HTTP,所以并不严格区分SSL和HTTPS,虽然从广义上来讲,将二者混为一谈是非常不合理的 。
看到这里,大多数人都会很困惑:Fiddler不就能解密SSL流量吗?为什么还需要Wireshark呢?
是的,在大多数情况下,用Fiddler来解密SSL已经足够了,但在实际使用过程中,我们发现Fiddler在解决HTTP长连接时无能为力。对于特定的应用,比方说Office365的Microsoft MAPI over HTTP,它总是在Outlook和Office365 Exchange server之间维护一个HTTP长连接,并且利用HTTP chunk的特性,在有更新时返回一个chunk来达到实时将server端的变化告知给Outlook的目的。但是Fiddler不能很好地handle这种情况,它总是期望在HTTP response全部返回之后再显示出来。所以,在上述应用中,Fiddler不仅不能实时显示HTTP通信中的内容,而且,即使一个长连接断开之后,它显示的HTTP response也是无效的内容。
所以,我们就想到了Wireshark,它总是能实时监控网络流量。可是我们要监控的HTTP流量是经过SSL加密的,所以它必须要加密SSL流量的private key,才能解密这个SSL流量。因此,直接拦截网络流量是行不通的,因为server端的private key我们无法拿到。
于是,这两种情况综合一下,就促成了我们的解决方案:将Fiddler作为SSL代理以提供private key,然后用Wireshark实时监控以解密流量。
SSL介绍及SSL代理原理
SSL(Secure Socket Layer)是Netscape公司设计用来加密Internet通信流量的,最新版本更名为TLS(Transport Layer Security)。它采用X509证书加密来保证通信的保密性和可靠性。加密采用的证书通常由第三方证书颁发机构颁发,而这些机构是被信任的,也就是说,它们不会利用这些颁发的证书来进行窃听等行为。基于此前提,SSL协议本身能够保证:如果发生了窃听,那么用来加密的证书必定是不受信任的(除非用户将这些证书添加到其受信任证书列表中)。
SSL代理——换种说法,其实就是 Man-in-the-Middle 攻击。SSL代理,即是用自己的证书替代原来server端的证书(SSL虽然支持通信两方都提供证书,但目前绝大多数支持HTTPS的服务,都只是一方认证,即server提供证书,不要求client也提供受信任的证书,所以SSL代理只需要替代server端的证书即可),从而解密流量。但这样一来client端就会发现server端证书不是受信任的,但因为这只是我们自己的测试,所以我们需要信任代理生成的证书。
设置解密环境
要同时使用Fiddler和Wireshark,我们需要两台机器:机器A运行Fiddler作为代理,机器B运行Outlook,并且将系统代理设置成机器A以将所有流量导到机器A。然后在机器B上用Wireshark监听。之所以不能只用一台机器,是因为Wireshark的Windows版本在默认情况下,不支持loopback监听,简单说来,就是对127.0.0.1的监听。之于为什么、以及如何让其实现loopback监听,可以参看这里和这里。最终的流程如下所示:
+------------+ +------------+ +-----------------+
| Computer A | Wireshark | Computer B | | |
| +---------->| +------>| Exchange Server |
| Outlook | | Fiddler | | |
+------------+ +------------+ +-----------------+
设置Fiddler并导出根证书到受信任列表
Fiddler作为一个能够代理所有HTTPS流量的工具,它需要提供所有网站的HTTPS证书。因此,最通用的做法,是自签一个根证书,然后用这个根证书来签发所有domain的证书,作为client,只需要信任这个根证书即可。这个方法也是流行的梯子工具——goagent所采用的。但是,Fiddler自己生成证书的工具 makecert.exe 并不提供导出其生成证书(包括根证书和生成的各个domain的证书)的private key的方法,因此,我们需要安装一个Fiddler的插件—— CertMaker 来代替Fiddler作为证书生成工具,因为这个工具可以看到private key。
CertMaker插件并不影响Fiddler解密SSL的设置,它只是替换了Fiddler默认的证书生成过程。在Fiddler中执行以下设置:
图1. SSL解密设置,这个会自动导入根证书到Windows证书管理器的受信任列表
图2. 打开“允许远程连接”的选项,保存后需要重启Fiddler
别忘了,我们有两台机器,因此,在机器B上面也需要将根证书添加到受信任列表。打开机器B的Windows命令行,输入 certmgr 打开证书管理器,然后将导出的根证书分别添加到Personal和Trusted Root Certification Authorities下面的Certificate里,具体操作为:在Certificate上点击右键,选择"All Tasks"->"Import",然后选择证书存放的位置,确定即可。
导出Fiddler生成证书的private key
在使用了CertMaker插件之后,我们能看到Fiddler的根证书的private key了。 但需要注意的是,我们需要的,不是Fiddler的根证书的private key,而是监视网站的private key。例如,如果我们要监视和https://www.example.com的通信流量,我们需要Fiddler针对这个domain签发的证书的private key 。所以,要做到这点,需要在Fiddler中设置一个属性:
- 在Fiddler界面左下角输入框输入
about:config并回车 - 在右侧的about:config标签中添加
fiddler.certmaker.bc.LogPrivateKeys,并设置为True
因为在还没有连接要监听的HTTPS网站时,Fiddler是不会自动为其生成证书的,而是在连接之后才会为其生成证书。所以,我们打开Wireshark,然后运行Outlook,在连接Exchange HTTPS服务器之后,Fiddler会为这个domain生成证书,现在在其Log标签页就可以看到这个证书了,是Base64编码的,我们将其拷贝出来,保存成文件。 注意:直接保存到文件不符合pem证书文件的格式,我们需要在文件的开头和结尾分别加上以下内容:
-----BEGIN PRIVATE KEY-----
Base64 encoded private key here
-----END PRIVATE KEY-----
导入private key到Wireshark
在Wireshark中,打开Edit->Preferences->Protocols->SSL,然后点击RSA keys list的Edit按钮,点击New,添加一个新的Rule,IP和Port设置为代理机器A的地址和端口,然后Protocol设置为http,Key File选择我们刚生成的文件,然后确定,如下图:
图3. 在Wireshark中添加新的SSL private key
好了,现在在Wireshark中,是不是就可以看到已经解密的绿色的HTTP流量了呢?
Reference
- https://en.wikipedia.org/wiki/Secure_Sockets_Layer
- http://wiki.wireshark.org/CaptureSetup/Loopback
- http://www.hsc.fr/ressources/articles/win_net_srv/missing_loopback.html
- https://fiddler2.com/add-ons
- http://security14.blogspot.com/2010/07/how-to-use-fiddler-and-wireshark-to.html
- http://www.iprotocolsec.com/2012/11/07/wireshark%E6%8A%80%E5%B7%A7-%E8%A7%A3%E5%AF%86ssl%E5%8D%8F%E8%AE%AE/
- https://groups.google.com/forum/#!topic/httpfiddler/lofwICmb7PQ
利用Fiddler和Wireshark解密SSL加密流量的更多相关文章
- 如何利用Wireshark解密SSL和TLS流量
如何利用Wireshark解密SSL和TLS流量https://support.citrix.com/article/CTX135121 1.有server端的private key,直接在wires ...
- wireshark解密本地https流量笔记
此方式支持firefox,chrome 建立path变量 SSLKEYLOGFILE=c:\ssl.key 重启firefox chrome,访问https网站会自动生成ssl session key ...
- 一个最简单的通过WireShark破解SSL加密网络数据包的方法
原文地址: http://article.yeeyan.org/view/530101/444688 一般来说,我们用WireShark来抓取包进行分析是没有多大问题的.但这里有个问题是,如果你碰到的 ...
- wireshark 解密加密报文
wireshark 解密IPSec加密后的报文 序言 wireshark作为一款非常优秀的抓包工具,支持了各种各样的网络协议,成为了网络开发中必不可少的工具之一.一般而言,对于普通的网络数据包,wir ...
- 利用Wireshark 解密HTTPS流量
在我之前的一篇文章中已经介绍了一种解密HTTPS流量的一种方法,大致方法就是客户端手动信任中间人,然后中间人重新封包SSL流量. 文章地址: http://professor.blog.51cto.c ...
- Wireshark解密HTTPS流量的两种方法
原理 我们先回顾一下SSL/TLS的整个握手过程: Clienthello:发送客户端的功能和首选项给服务器,在连接建立后,当希望重协商.或者响应服务器的重协商请求时会发送. version:客户端支 ...
- 转 关于Https协议中的ssl加密解密流程
关于Https协议中的ssl加密解密流程 2016年09月28日 09:51:15 阅读数:14809 转载自:http://www.cnblogs.com/P_Chou/archive/2010/1 ...
- .net mvc 站点自带简易SSL加密传输 Word报告自动生成(例如 导出数据库结构) 微信小程序:动画(Animation) SignalR 设计理念(一) ASP.NET -- WebForm -- ViewState ASP.NET -- 一般处理程序ashx 常用到的一些js方法,记录一下 CryptoJS与C#AES加解密互转
.net mvc 站点自带简易SSL加密传输 因项目需要,传输数据需要加密,因此有了一些经验,现简易抽出来分享! 请求:前端cryptojs用rsa/aes 或 rsa/des加密,后端.net ...
- 利用fiddler+nginx模拟流量识别与转发
最近看到一些关于全链路压测的文章,全链路压测主要处理以下问题: 数据清洗压测流量标记,识别 压测流量标记的传递测试数据与线上数据隔离等等... 要实现全链路压测,必然要对原有的业务系统进行升级,要怎么 ...
随机推荐
- springboot整合Thymeleaf模板引擎
引入依赖 需要引入Spring Boot的Thymeleaf启动器依赖. <dependency> <groupId>org.springframework.boot</ ...
- [原创]Sql2008 使用TVP批量插入数据
TVP(全称 :Table-Valued Parameter) 叫做表值参数(Table-Valued Parameter)是SQL2008的一个新特性.顾名思义,表值参数表示你可以把一个表类型作为参 ...
- 20175225《java程序设计》第五周学习总结
20175225 2018-2019-2 <Java程序设计>第5周学习总结 教材学习内容总结 1.接口体中包含常量的声明(没有变量)和抽象方法两部分.接口体中只有抽象方法,没有普通的方法 ...
- Java基础90 MySQL触发器
1.创建触发器 CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt ...
- 测试开发之Django——No1.介绍以及引申
前言 > 测试行业发展飞速,自动化测试兴起,由此对测试人员的要求与日俱增.随时而来的,就是职能的增加. > 首先需要学习的,就是自动化测试.而由自动化测试引申而来的,就是另外几个新增的岗位 ...
- Kubernetes Master节点灾备恢复操作指南---升级版
本文档简述了Kubernetes主节点灾备恢复的相关步骤,供在发生k8s master崩溃时操作. 就算是在k8s里部署了etcd群集, 主节点控制组件的高可用节点,灾备恢复也是必须要实现的操作,才能 ...
- [BZOJ2616]SPOJ PERIODNI 树形dp+组合数+逆元
2616: SPOJ PERIODNI Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 128 Solved: 48[Submit][Status][ ...
- WebAPI性能优化
WebAPI性能优化之压缩解压 有时候为了提升WebAPI的性能,减少响应时间,我们会使用压缩和解压,而现在大多数客户端浏览器都提供了内置的解压支持.在WebAPI请求的资源越大时,使用压缩对性能提升 ...
- echarts地图定时切换散点及多图表级联联动
本文目录 1. 摘要 2.引入ECharts以及地图相关json 3. 界面布局 4. js实现图形布局 5.定时循环jquery实现 6. 总结 1. 摘要 最近做项目遇到个统计相关需求,一个页面 ...
- cygwin安装sshd服务并实现无密码登录
http://blog.csdn.net/cybercode/article/details/7080743 这篇文章主要是为我在win7(64位)下搭建hadoop环境所准备的.首先参照在cygwi ...