天天给-App-抓包,还不懂-HTTP-代理吗?---实用-HTTP(1)

这个两种不同的表现,也对应了两种不同的 HTTP 代理:

  1. 普通代理。基于修订后的 RFC 2616 在 HTTP/1.1 中被定义。这种代理扮演的是「中间人」的角色。对客户端来说,它是服务端,而对真正的服务端来说,它又是客户端,它就是负责在两端之间传递 HTTP 报文。

  2. 隧道代理。这种一种基于 TCP 协议的隧道传输代理,它通过 HTTP 协议的 CONNECT 方法完成通信,以 HTTP 的方式,实现任意基于 TCP 的应用层协议代理。

接下来我们就分别对这两种代理进行讲解。

2.3 普通代理

普通代理,理解起来并不复杂,它是网络中的中间实体,位于客户端和服务端之间,扮演「中间人」的角色,在两端之间来回传递报文。

这个「中间人」左手牵着客户端,右手牵着服务端,在收到客户端发送的请求报文时,需要正确的处理请求和连接状态,同时向服务器发送新的请求,在收到响应后,将响应结果包装成一个响应体返回给客户端。

在普通代理的流程中,代理两端都是有可能察觉不到「中间人」的存在。

举个例子,我们要访问 A 网站,实际上我们是向代理服务器发送请求,而代理服务器又再向 A 网站发起请求,最终将响应体通过代理服务器,返回给我们。在我们的角度,我们正常的向一个网站服务器发起请求,并且对方也返回给我们正确的数据,在这个过程中,我作为客户端,会认为代理服务器就是 A 网站的服务器,而 A 网站的服务器,又认为代理服务器是一个真实的用户。

这里说到,代理服务器作为「中间人」是可以隐藏自己的存在,但是如果我们作为一个“守规矩”的代理服务器,想要将客户端的 IP 传递给服务端,可以通过 X-Forwarded-IP 这个自定义的 Header,来告诉服务端真正的客户端 IP 地址。

HTTP 协议作为一种松散的协议,服务器在接收到 X-Forwarded-IP 这个请求头时,是无法验证其真伪的。它可能是代理服务器伪造的,也可能是真实的。所以服务端从 HTTP 头部获取 IP 时,就需要格外小心。

普通代理很好理解,但是它也有缺陷,它只适用于 HTTP 协议。

在普通代理模式下,所有请求响应的数据,对于代理这个「中间人」来说,都是透明并且可以任意操作,这就会带来各种数据安全的隐患。

说到网络数据安全,首先想到的就是 HTTPS,但是 HTTPS 这种证书认证的机制,又是中间人劫持的克星。

严格上来说,HTTPS 下不存在中间人攻击,除非是人为的犯错了,没有对证书严格校验,或者证书被泄露。

在普通的 HTTPS 请求中,服务端不验证客户端的证书,中间人可以作为客户端与服务端完成 TLS 握手。

但是由于代理中间人没有证书密钥,也就无法伪造服务端和客户端简历的 TLS 连接,这会导致请求失败。

这个场景,对标到抓包工具的工作流程中,你会发现,如果想用 Charles(或Fiddler) 抓 HTTPS 的网络数据包,就需要在手机上安装一个 Charles 的 CA 证书,让手机设备信任此证书,才可以完成抓包,此时走的就是普通代理的模式。

那换个角度,假如在手机上没有安装 Charles 提供的证书,也并没有影响到请求和响应,Charles 只是无法解密 HTTPS 数据,这是如何做到的呢?

这就需要用到隧道代理

2.4 隧道代理

隧道代理,又称为 Web 隧道(Web tunnel),这种方式可以通过 HTTP 连接发送非 HTTP 流量,这样可以在 HTTP 上捎带其他协议的数据。

隧道代理是利用 HTTP 的 CONNECT 方法建立起来的。CONNECT 方法,最初并不是 HTTP/1.1 的核心规范,但却是一种得到广泛使用的扩展,它在 2014 年发布的 HTTP/1.1 修订版中,才对 CONNECT 及隧道代理有了清晰的描述。

HTTP 隧道代理的工作流程是什么样的?

一次普通的 HTTP 请求,Header 部分以连续的两组 CRLF(\r\n)作为结束标记,如果后面还有内容,就是 Content 部分的内容,也称为请求/响应体(Content),如果存在 Content 内容,就需要在 Header 中增加 Content-Length 来标记 Content 部分的长度。接收方(服务端)会根据这个长度来读取数据。

CONNECT 报文的请求,是没有 Content 部分的,只有 Request-Line 和 Header,他们仅供代理服务器使用,并不会传递给终端服务器。请求的 Header 部分一旦结束(两组连续的 CRLF),后面的所有数据,都被视为应该转发给终端服务器的数据,代理需要把他们无脑的直接转发,并且不限制长度,直到从客户端的 TCP 读通道关闭。

CONNECT 的响应报文,在代理服务器和终端服务器建立连接后,可以向客户端返回一个 200 Connect established 的状态码,以此表示和终端服务器的连接,建立成功。这个 200 Connect established 的 Header 部分一旦结束(两组连续的 CRLF),后面所有的数据均为远端服务器返回的数据,同理,代理服务器会直接转发终端服务器的数据给客户端,直到终端服务器的 TCP 读通道关闭。

了解清楚 HTTP 隧道的工作流程之后,就知道 CONNECT 方法请求隧道网管创建一条到达任意目的服务器和端口的 TCP 连接,并对客户端和服务端之间的后续数据,进行无脑的盲转发

通过隧道代理,代理服务器不再作为中间人,不再需要改写浏览器的请求,而是把浏览器和终端服务器的数据,原样转发,这样浏览器就可以直接和终端服务器进行 TLS 握手,并传输加密的数据。

2.4 导入证书后,Charles 抓 HTTPS 流程

Charles 作为抓包工具,在手机上没有导入证书的时候,是通过隧道代理来保证数据的传输。一旦导入证书之后,Charles 就又切换到普通代理的工作模式,此时我们就可以解析 HTTPS 的流量数据。

这里简单说一下原理。

在导入证书后,请求时手机就会信任 Charles 伪造的证书,而 Charles 又伪装成真实的客户端与服务端之间建立正确的 TLS 连接。此时,Charles 作为「中间人」,两端的 TLS 流量都是可以被解密的。

三、总结时刻

到这里就了解清楚 HTTP 代理的细节,其实很抽象的概念,也很好理解。

简单来说,HTTP 代理可以分为两类,普通代理和隧道代理。

普通代理作为「中间人」存在,在一次请求中,客户端明文请求代理服务器,在收到请求后,代理服务器又明文去请求终端服务器。在这整个过程中,数据都是明文传输,中间人可以对其中传递的数据进行改写,这就是著名的中间人攻击,可见其有多不安全。

这就引申出了支持 HTTPS 的隧道代理,此时代理服务器就不再作为中间人,无法改写客户端的请求,而仅仅是在建立连接后,将客户端的请求,通过建立好的隧道,无脑的转发给终端服务器。

关于 HTTP 代理的细节就到这里,有任何问题欢迎留言讨论!

最后

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。

最后文末放上一个技术交流群:Android架构设计(185873940)

PS:群内有许多技术大牛,有任何问题,欢迎广大网友一起来交流,群内还不定期免费分享高阶Android学习视频资料和面试资料包~

再推荐一篇文章,具体的架构视频,面试专题,学习笔记都在这篇文章中:“寒冬未过”,阿里P9架构分享Android必备技术点,让你offer拿到手软!

偷偷说一句:群里高手如云,欢迎大家加群和大佬们一起交流讨论啊~

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

文章不易,如果大家喜欢这篇文章,或者对你有帮助希望大家多多点赞转发关注哦。文章会持续更新的。绝对干货!!!

  • Android进阶学习全套手册
    关于实战,我想每一个做开发的都有话要说,对于小白而言,缺乏实战经验是通病,那么除了在实际工作过程当中,我们如何去更了解实战方面的内容呢?实际上,我们很有必要去看一些实战相关的电子书。目前,我手头上整理到的电子书还算比较全面,HTTP、自定义view、c++、MVP、Android源码设计模式、Android开发艺术探索、Java并发编程的艺术、Android基于Glide的二次封装、Android内存优化——常见内存泄露及优化方案、.Java编程思想 (第4版)等高级技术都囊括其中。

  • Android高级架构师进阶知识体系图
    关于视频这块,我也是自己搜集了一些,都按照Android学习路线做了一个分类。按照Android学习路线一共有八个模块,其中视频都有对应,就是为了帮助大家系统的学习。接下来看一下导图和对应系统视频吧!!!

  • Android对标阿里P7学习视频

  • BATJ大厂Android高频面试题
    这个题库内容是比较多的,除了一些流行的热门技术面试题,如Kotlin,数据库,Java虚拟机面试题,数组,Framework ,混合跨平台开发,等

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

-KO2sCmHU-1713542657337)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 10
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值