V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
XiaoXiaoMagician
V2EX  ›  程序员

用 Charles 抓 http/https 遇到 Connect 请求的疑问?

  •  
  •   XiaoXiaoMagician · 2023-03-02 22:54:52 +08:00 · 3000 次点击
    这是一个创建于 632 天前的主题,其中的信息可能已经有所发展或是发生改变。

    由于业务需要,抓了 PC 端几个游戏的登录接口调研流程。发现请求方法都是 Connect 和加密内容。 网上也查了相关资料,解释这种请求是隧道代理。

    但我不清楚的是,这些 http/https 的 Connect 请求是 Charles 代理软件转换成的吗? 还是说就是客户端内部代码检测代理的实现的逻辑?

    因为平常跟服务端对接大多情况都是用的 Get 和 Post 方法。这种方法基本没用过。

    有没有懂的大佬们解释一下这种防抓包的机制是怎么实现的? 个人认为可能是用的 私有证书 或是 自签名证书,直接在开发时下发给客户端后请求携带的样子。(纯属猜测)

    第 1 条附言  ·  2023-03-03 11:23:13 +08:00
    附上抓包图片

    Charles:


    Wireshark:
    shibo501c
        1
    shibo501c  
       2023-03-02 23:01:15 +08:00 via Android
    不光是 pc 端,现在大厂的 app 很多用 charles 抓请求也看不到了,很多是在 tcp 层自己做的 tls 加密,多 stream 复用,业务感觉发送的还是 http ,实际上被网络模块代理了。
    lasuar
        2
    lasuar  
       2023-03-02 23:03:00 +08:00
    HTTP 请求也是加密的话说明内容本身就是加密的,在客户端解密;
    HTTPS 请求抓包查看明文,需要在 charlers 安装根证书到系统并设置完全信任,然后 charlers 开启 ssl 代理,然后客户端设置代理为 charlers 代理地址,开始抓包。
    XiaoXiaoMagician
        3
    XiaoXiaoMagician  
    OP
       2023-03-02 23:24:52 +08:00
    @lasuar 已经装了证书了,也信任了。而且不是 Connect 请求应该是不携带 Body 内容的,为什么他们都是携带加密内容的?
    q1angch0u
        4
    q1angch0u  
       2023-03-03 01:02:13 +08:00 via iPhone
    app 本地启动一个 server ,称其为 tunServer ,用来接收 http/websocket 请求,并加密后发送到真正的服务端(realServer)。
    所以目前的访问流程就是:app->(127.0.0.1:xxxxx)tunServer->realServer 。手机上设置中使用代理连接到 charles ,流程变成了 app->[charles]->(127.0.0.1:xxxxx)此处访问不到,所以大概率 app 是不能正常使用的吧?因为 app 发送的请求目的地址是 127.0.0.1:xxxxx ,但是 charles 本地并没有相对应的端口开放用以交换数据。
    studyingss
        5
    studyingss  
       2023-03-03 01:38:07 +08:00 via Android
    还是学一下基础吧。。。

    http CONNECT 方法只是用来连接到一个 http 代理服务器,连接上之后可以中转 tcp 流量。

    CONNECT 只有第一个包
    studyingss
        6
    studyingss  
       2023-03-03 01:43:29 +08:00 via Android
    会带,server 接到之后会去跟目的地址建立连接,如果成功就回 200 Connection Established 。

    后面的数据都是纯 tcp 了,http 服务器只会做转发工作。看你的描述大概是认为每个请求都会带上 http connect 头。

    至于防抓包什么更是毫无关系,connect 本质上只是一个 tcp 隧道,如果传输的数据用了加密那不经过这个 tunnel 看到的也是加密的。
    lovelylain
        7
    lovelylain  
       2023-03-03 08:40:49 +08:00 via Android
    @q1angch0u 京东 APP 是哪种情况?我升级到新版
    lovelylain
        8
    lovelylain  
       2023-03-03 08:43:48 +08:00 via Android
    @q1angch0u 京东 APP 是哪种情况?我升级到新版后,无论是手机本地跑的代理还是路由器上跑的代理,只要设置了代理,京东就不正常,还有一些银行 APP 会提示开了代理不让用,京东是无任何提示,用这几个 APP 前得切换 WiFi 或者 APN ,太麻烦了。
    XiaoXiaoMagician
        9
    XiaoXiaoMagician  
    OP
       2023-03-03 10:01:16 +08:00
    @studyingss 那代理服务器这个是由客户端本地启动的,还是说指的就是代理软件?
    XiaoXiaoMagician
        10
    XiaoXiaoMagician  
    OP
       2023-03-03 10:03:12 +08:00
    @q1angch0u 按你说的就是需要由客户端本地启动一个服务,用作代理服务?还有就是我目前即使开抓包软件抓,一样不影响游戏登录,还是能狗正常游玩的。抓的官服永劫无间。
    q1angch0u
        11
    q1angch0u  
       2023-03-03 10:54:17 +08:00 via iPhone
    @jobmailcn 这种盲猜是双向证书认证了…
    q1angch0u
        12
    q1angch0u  
       2023-03-03 10:55:09 +08:00 via iPhone
    @XiaoXiaoMagician 不影响并且可以正常登录的话那就不是这种情况
    shibo501c
        13
    shibo501c  
       2023-03-03 11:12:20 +08:00
    @lasuar @XiaoXiaoMagician @jobmailcn @studyingss @q1angch0u 请教下,如果做一个这种网络加速的开源项目,会有人想用吗,比如提供 TCP 或者 QUIC 的通道,TLS 1.3 的握手,,然后集成到 js ,kotlin ,swift 的网络库里,可以选择发现请求延迟大于一定的情况下,开启请求的隧道,转给一个轻量级的中转服务,转给用户内网的服务。在做一个 UI 进行一些统计和 Debug 的功能。
    shibo501c
        14
    shibo501c  
       2023-03-03 11:14:04 +08:00
    我了解到的是大厂都有网关团队,有的叫做长连接服务,请求治理什么的,好像开源的不多。
    studyingss
        15
    studyingss  
       2023-03-03 12:04:40 +08:00 via Android   ❤️ 1
    @shibo501c 没搞懂你想说什么。

    如果是想要降低服务器负载并且让资源尽可能接近 client ,有个相似的东西叫做 CDN 。

    你想开源什么我也没搞懂,如果你说的那个 tcp / quic 通道是延迟更低更快线路的话,是要花钱找运营商买的。然后再集成一下就叫做游戏加速器了。。。

    如果你只是开源连接到代理的工具的话有个叫 netch 的东西。

    集成到网络库又是什么。。。quic tls tcp 全部都是标准的东西,早就在库里了。

    不存在不额外依赖中转服务器就可以直接提升网络质量的方法,如果有早就被放到标准协议里了,比方说多路复用确实有效,于是就有了 http/2 。kcp 能显著降低延迟所以一堆游戏都在用。


    我的知识比较浅,确实是没看懂你想开源啥。
    studyingss
        16
    studyingss  
       2023-03-03 12:10:50 +08:00 via Android   ❤️ 1
    @XiaoXiaoMagician 看你第一张截图不是游戏啊

    看起来是设置了系统代理被浏览器识别到之后连接到 http 代理。这种请求是客户端主动发的,比如说你在软件设置里面设置了使用 http 代理 /使用系统代理同时系统设置了代理,就会发送这种 connect 请求。

    至于游戏是什么情况我就不知道了。
    shibo501c
        17
    shibo501c  
       2023-03-03 12:17:39 +08:00
    @studyingss CDN 主要还是静态资源,主要是加速 RESTFul API ,优化弱网响应的速度,部署在海外也可以,很多工具都能代理请求哈,但是都是设备级别的,主要是针对 APP 或者 网站级别的。比如美团的做法 https://zhuanlan.zhihu.com/p/144449362
    studyingss
        18
    studyingss  
       2023-03-03 12:43:02 +08:00 via Android
    @shibo501c 这个依然需要服务器来配合呀,client 和 server 都是美团自家的,想怎么弄怎么弄,比方说中间提到的 tcp 长连接,所有 http 请求使用二进制通过这条 tcp 连接发送,代理服务器需要做解析工作的呀。

    排除掉他们给自己业务做的针对性优化,再考虑上通用性,最终结果是可能你发现自己重新发明了 http/2 或者 quic 。

    如果你想在不更改 server 的情况下做优化,那就只有自己买一台服务器来做解码然后由服务器请求。

    如果你想把上面文章提到的技术写成一个通用的库开源出来,那用户要使用就得先自己去买台服务器。

    假设一个人非常非常牛逼,首先开发出了一个用户-›proxy 的工具,所有请求都通过一个连接发代理服务器所以可以复用连接,非常快,并且自带连接迁移,即使在移动场景下也可以保证连接稳定。
    然后为了这台代理服务器能高速访问目的服务器,再让所有大厂都主动把资源放这台代理服务器。

    然后它给这个东西取名,叫做 cloudflare warp ?

    还是说我对你的想表达的东西的理解依然有偏差?
    shibo501c
        19
    shibo501c  
       2023-03-03 12:52:10 +08:00   ❤️ 1
    @studyingss 感谢回复,你的理解没有偏差。我们内部在使用 http2 或者 quic 的时候,发现改造的成本比较大,最终是通过一个代理服务来做的,内部统计上看,p99 等长尾的数据确实改善明显。确实不够通用,而且还有排查问题更复杂的情况。不过目前看很多大厂都有在使用这种方式。肯定是要部署启动一个进程的,所以肯定是针对有自己机房和服务的团队。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2726 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 15:05 · PVG 23:05 · LAX 07:05 · JFK 10:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.