Fiddler是个问题少女,又作又可招人爱
09
2020-10
今天距2021年83天
这是ITester软件测试小栈第165次推文
点击上方蓝字“ITester软件测试小栈“关注我,每周一、三、五早上 08:30准时推送,每月不定期赠送技术书籍。
微信公众号后台回复“资源”、“测试工具包”领取测试资源,回复“微信群”一起进群打怪。
本文3125字,阅读约需8分钟
相信大伙应该已经非常熟悉Fiddler,作为一个HTTP协议调试代理工具,它可以监听系统的HTTP网络数据流动,检查HTTP通讯,设置断点,修改请求数据,堪称测试工作中的利器。
但是近期发现Fiddler好像不乖了,在工作中偶尔闹脾气。通过沟通了解,Fiddler还有一些不为人知的小秘密,经过Fiddler心仪之人的同意,特将它的小故事告诉大伙儿,愿治愈你的节后综合症。
一
与Fiddler相识相知
1
握手六部曲
“Fiddle是一半天使一半高冷的女神,本着学习唐三藏取经的精神,觉得非我不能被收服,遂通过6步开启刷存在感,以此确认关系。”
第一步:客户端发起明文请求,将自己支持的一套加密规则、以及一个随机数
(Random_C)发送给服务器 。
第二步:服务器选出一组加密规则和Hash算法,并将自己的身份信息
以证书(CA:包含网站地址、加密公钥、证书颁发机构等信息)和一个随机数(Random_S)发给客户端 。
第三步:客户端接到服务器的响应验证证书的合法性
(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等)。如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。 如果证书受信任,或者是用户接受了不受信的证书,客户端进行以下工作:
- 生成密码:浏览器会生成一串随机数的密码(Pre_master),并用CA证书里的公钥加密(enc_pre_master),用于传给服务器。
- 计算协商密钥:enc_key=Fuc(random_C, random_S, Pre-Master)
- 生成握手信息:使用约定好的HASH计算握手消息,并使用协商密钥enc_key及约定好的算法对消息进行加密。
- 发送信息到服务器: ①用公钥加密过的服务器随机数密码enc_pre_master; ②客户端发给服务器的通知,”以后我们都要用约定好的算法和协商密钥进行通信的哦”;③客户端加密生成的握手信息。
第四步:服务器接收客户端发来的数据
,要完成以下四件事情。
- 私钥解密:使用自己的私钥从接收到的enc_pre_master中解密取出密码Pre_master。
- 计算协商密钥:enc_key=Fuc(random_C, random_S, Pre-Master)
- 解密握手消息:使用协商密钥enc_key解密客户端发来的握手消息,并验证HASH是否与客户端发来的一致。 生成握手消息使用协商密钥enc_key及约定好的算法加密一段握手消息,发送给客户端。这里要发的数据有两条:
- 服务器发给客户端的通知,”听你的,以后我们就用约定好的算法和协商密钥进行通信哦“。 服务器加密生成的握手信息。
第五步:客户端拿到握手信息解密
,握手结束。 客户端解密并计算握手消息的Hash,如果与服务端发来的Hash一致,此时握手过程结束。
第六步:正常加密
通信 。握手成功之后,所有的通信数据将由之前协商密钥enc_key及约定好的算法进行加密解密。 这里浏览器与网站互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码和Hash算法,并且可以正常的加密解密数据,为后续真正数据的传输做一次测试。
从以上握手过程,我们可以得知:
- 通过CA可以确认网站的合法性;
- 通过enc_key来加密解密,在传输过程中,为了保证enc_key不被解破,在客户端用公钥加密后,在服务器端用私钥解密,私钥只有服务器端有,所以即使报文被截获,也无法破解。
2
Fiddler获取HTTP请求过程七部曲
“Fiddler女神不仅高贵冷艳、成熟体贴,更是工作上的得力助手,各种得体的安排和助攻帮我省去了不少的麻烦。”
第一步:Fiddler向服务器发送请求
进行握手, 获取到服务器的CA证书, 用根证书公钥进行解密, 验证服务器数据签名, 获取到服务器CA证书公钥。
第二步:Fiddler伪造自己的CA证书
, 冒充服务器证书传递给客户端浏览器, 客户端浏览器做跟fiddler一样的事。
第三步:客户端浏览器生成HTTPS通信用的对称密钥
, 用 Fiddler伪造的证书公钥加密后传递给服务器, 被 Fiddler截获。
第四步: Fiddler将截获的密文用自己伪造证书的私钥解开
, 获得https通信用的对称密钥。
第五步: Fiddler将对称密钥用服务器证书公钥加密
传递给服务器, 服务器用私钥解开后建立信任, 握手完成, 用对称密钥加密消息, 开始通信。
第六步:Fiddler接收到服务器发送的密文, 用对称密钥解开, 获得服务器发送的明文。再次加密
, 发送给客户端浏览器。
第七步:客户端向服务器发送消息, 用对称密钥加密, 被 Fiddler截获后, 解密获得明文
。由于 Fiddler一直拥有通信用对称密钥, 所以在整个HTTPS通信过程中信息对其透明。
二
与Fiddler相爱相杀
1
Fiddler的问题
“熟络之后,Fiddler露出其他本性。工作上的高标准导致了她的坏脾气、坏情绪,调皮又任性的封印在越来越捉摸不定的问题里。”
事由:按照正常情况抓取HTTPS请求,需要设置Fiddler的HTTPS选择项,如图所示。
问题:手机和Fiddler都正常安装SSL证书,依旧显示”Tunnel to……443”。
Fiddler一言不和就闹情绪,猜测原因如下:
①手机未绑定Fiddler证书:以IOS为例,设置->通用->描述文件与设备管理,查看证书是否存在。
②证书未认证:设置->通用->关于->证书信任设置,查看证书是否认证。
③证书过期:检查手机系统当前时间是否正确,由于测试机为公用,并且某些特殊需求需要调整系统时间,所以建议检查系统时间。
④服务器支持:访问测试服务器查看nginx.conf配置。
⑤Windows根证书无效:Fiddler开启HTTPS证书设置后,Windows根证书不信任,如图所示。
2
与Fiddler磨合
“回望从前,我觉得没有谁对或谁错,只要一起探索升级便是最大的筹码。我们决定在对方遇到困难时给予靠谱的解决办法,并且有了醍醐灌顶的连连惊喜。”
①将之前的证书删除:打开系统证书管理器(运行->certmgr.msc->回车),然后出现管理器,将之前生成的证书删除即可。
②用”FiddlerCertMaker.exe“工具,进行认证。
③重新安装手机证书,进行抓包即可。
鉴此,在并肩前行的路上,该来的问题会迟到,却不会缺席,困难还会接踵而来。如果连捍卫之心都不曾有,那才是过错。愿在与Fiddler一路磨合,相爱相杀的路上走得更远。
以上
That‘s all
更多系列文章
敬请期待
ITester软件测试小栈
往期内容宠幸
2.Python接口自动化-接口基础(二)
3.Python接口自动化-requests模块之get请求
4.Python接口自动化-requests模块之post请求
5.Python接口自动化之cookie、session应用
- 以太坊·将数据写入到区块链中
- 如何使用Faster R-CNN来计算对象个数
- hyperledger v1.0.5 区块链运维入门
- 在TensorBoard中使用t-SNE实现TensorFlow自动编码器的可视化嵌入
- 以太坊智能合约开发入门
- CatBoost:一个自动处理分类(CAT)数据的机器学习库
- Python机器学习的练习八:异常检测和推荐系统
- Blade 模板中有关 section 的那些事
- 分布式计划任务设计与实现
- 怎样在Python的深度学习库Keras中使用度量
- 网络设备配置管理与版本控制
- 使用Python对Instagram进行数据分析
- 解决多标签分类问题(包括案例研究)
- Docker Compose + GPU + TensorFlow = Heart
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android7.0版本影响开发的改进分析
- POJ - 2251 Dungeon Master(搜索)
- An Overview of PostgreSQL & MySQL Cross Replication
- POJ - 1321 棋盘问题
- CREATE TABLE ... WITH storage_parameter [= value] [, ... ]
- Windows窗口模板
- TabLayout关联ViewPager后不显示文字的解决方法
- POJ - 3278 Catch That Cow 简单搜索
- Codeforce 239 B. Easy Tape Programming
- Codeforces Round #530 (Div. 1) 1098A Sum in the tree
- 非易失性WAL buffer实现解析(三)
- android实现切换日期左右无限滑动效果
- 疯子的算法总结(七) 字符串算法之 manacher 算法 O(N)解决回文串
- PostgreSQL WAL解析:构建WAL记录准备
- CodeForces - 225C. Barcode(DP)