分享:基于 Node.js 的 HTTPS MITM(中间人)代理的原理和实现 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
wuchangming89
V2EX    Javascript

分享:基于 Node.js 的 HTTPS MITM(中间人)代理的原理和实现

  •  2
     
  •   wuchangming89 2017-01-29 20:23:56 +08:00 7503 次点击
    这是一个创建于 3206 天前的主题,其中的信息可能已经有所发展或是发生改变。

    基于 Node.js 的 HTTPS MITM(中间人)代理的原理和实现

    分享自己写的一篇关于 HTTPS 的技术博客

    地址: https://github.com/wuchangming/https-mitm-proxy-handbook

    部署在公网的服务面临着越来越多的流量劫持、运营商劫持事件,为了能更好的保障信息的安全性和完整性, HTTPS 得到了越来越多的重视。基于此原因,本文章尝试从另一个视角,通过使用 Node.js 实现一个简单的 HTTPS 中间人代理的方式,阐述 HTTPS 是如何保证网络信息的安全,并且分析用户的何种行将会导致 HTTPS 的安全性失效。

    MITM (中间人)代理的技术手段对于软件开发者并不陌生,在实际开发和测试中经常会使用。调试接口、查看 HTTP 请求与响应时使用的 http 抓包调试工具如: Fiddler 、 Charles ,就是基于该原理实现的。

    本文会更侧重于代码的实现,每一步都提供详细的、可运行的 js 代码实现。

    17 条回复    2017-01-31 19:20:40 +08:00
    jsser
        1
    jsser  
       2017-01-29 20:31:09 +08:00
    谢谢分享!
    Sparetire
        2
    Sparetire  
       2017-01-29 22:26:58 +08:00 via Android
    很有帮助,非常感谢!
    wuchangming89
        3
    wuchangming89  
    OP
       2017-01-29 22:31:59 +08:00
    @Sparetire ,谢谢!
    EPr2hh6LADQWqRVH
        4
    EPr2hh6LADQWqRVH  
       2017-01-29 23:14:14 +08:00 via Android
    ????黑人问号
    wuchangming89
        5
    wuchangming89  
    OP
       2017-01-29 23:16:14 +08:00
    @avastms ,没太懂,什么意思?
    SoloCompany
        6
    SoloCompany  
       2017-01-30 01:06:52 +08:00
    一般而言的 MITM 不包括正向代理
    当然为了调试的目的也可以在正向代理上附加 MITM
    如果你想做 MITM 的普及,应当实现一个反向代理 + DNS 污染
    linbiaye
        7
    linbiaye  
       2017-01-30 06:49:25 +08:00
    如何取得“信任”

    回到最初的思路分析:建立一个可以同时与客户端和服务端进行通信的网络服务。

    现在需要解决的是如何得到客户端的信任,才能建立与客户端的通信。经过上面的分析,突破口就是 CA 证书。只要自定义的 CA 证书得到了客户端的信任,我就能用 CA 证书签发各种“伪造”的服务器证书。简单说就是让客户端系统安装上我们自定义的 CA 证书。

    这算不上 mitm 了,都能给客户端安装 ca 证书了,啥不能干。思路应该是中间设备劫持 dns 和第一次 http->https 的 302 跳转,让客户端和中间设备保持 http 通信,同时剥去来自服务器端的 hsts header 。对于客户端已经被告知 hsts 的站点无效。
    lslqtz
        8
    lslqtz  
       2017-01-30 07:13:13 +08:00 via iPhone
    @linbiaye 这就是 mitm ,只不过能取得客户端的信任。
    HTTP 的劫持也是中间人,只要你和服务器的通信被第三方修改过或嗅探过,就属于被中间人。
    des
        9
    des  
       2017-01-30 08:28:05 +08:00 via Android
    https 劫持的话,就算去掉了 hsts ,然后代理。我也能插随机 js 跳回去,再加上 cookie secure ,不太可能破解。
    wuchangming89
        10
    wuchangming89  
    OP
       2017-01-30 09:53:24 +08:00
    @linbiaye ,想说的就是装了 CA 证书什么都能干 :)。对于一般用户他不知道什么是 CA 证书,被诱导安装上自定义的 CA 是很容易的。

    另外,“ https 剥离”我觉得更应该叫 http mitm ,因为全程和 https 都没什么关系。

    wuchangming89
        11
    wuchangming89  
    OP
       2017-01-30 10:00:03 +08:00
    @SoloCompany ,一个完整的 hack 方案确实是要包括流量劫持,但这里想讲的只是 HTTPS 的证书链,所以就用最简单的正向代理的方式。
    wuchangming89
        12
    wuchangming89  
    OP
       2017-01-30 10:02:00 +08:00
    @des ,随机 js ?
    linbiaye
        13
    linbiaye  
       2017-01-30 11:33:19 +08:00
    @wuchangming89 垃圾 12306 还在用自签的,估计已经不少人被装了不明来路的 ca 证书。
    breeswish
        14
    breeswish  
       2017-01-30 17:48:05 +08:00
    @linbiaye 只信任那一张证书就可以了,不需要信任 12306 的 CA
    wuchangming89
        15
    wuchangming89  
    OP
       2017-01-30 20:15:23 +08:00 via iPhone
    @breeswish ,但一般用户其实不知道 CA 是什么,会留下安全隐患
    breeswish
        16
    breeswish  
       2017-01-31 14:48:15 +08:00
    @wuchangming89 一般用户连 https 都不知道 ┑( ̄Д  ̄)┍
    sola97
        17
    sola97  
       2017-01-31 19:20:40 +08:00
    非一般用户不就没辙了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1255 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 23:57 PVG 07:57 LAX 15:57 JFK 18:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86