
分享自己写的一篇关于 HTTPS 的技术博客
地址: https://github.com/wuchangming/https-mitm-proxy-handbook
部署在公网的服务面临着越来越多的流量劫持、运营商劫持事件,为了能更好的保障信息的安全性和完整性, HTTPS 得到了越来越多的重视。基于此原因,本文章尝试从另一个视角,通过使用 Node.js 实现一个简单的 HTTPS 中间人代理的方式,阐述 HTTPS 是如何保证网络信息的安全,并且分析用户的何种行将会导致 HTTPS 的安全性失效。
MITM (中间人)代理的技术手段对于软件开发者并不陌生,在实际开发和测试中经常会使用。调试接口、查看 HTTP 请求与响应时使用的 http 抓包调试工具如: Fiddler 、 Charles ,就是基于该原理实现的。
本文会更侧重于代码的实现,每一步都提供详细的、可运行的 js 代码实现。
1 jsser 2017-01-29 20:31:09 +08:00 谢谢分享! |
2 Sparetire 2017-01-29 22:26:58 +08:00 via Android 很有帮助,非常感谢! |
3 wuchangming89 OP @Sparetire ,谢谢! |
4 EPr2hh6LADQWqRVH 2017-01-29 23:14:14 +08:00 via Android ????黑人问号 |
5 wuchangming89 OP @avastms ,没太懂,什么意思? |
6 SoloCompany 2017-01-30 01:06:52 +08:00 一般而言的 MITM 不包括正向代理 当然为了调试的目的也可以在正向代理上附加 MITM 如果你想做 MITM 的普及,应当实现一个反向代理 + DNS 污染 |
7 linbiaye 2017-01-30 06:49:25 +08:00 如何取得“信任” 回到最初的思路分析:建立一个可以同时与客户端和服务端进行通信的网络服务。 现在需要解决的是如何得到客户端的信任,才能建立与客户端的通信。经过上面的分析,突破口就是 CA 证书。只要自定义的 CA 证书得到了客户端的信任,我就能用 CA 证书签发各种“伪造”的服务器证书。简单说就是让客户端系统安装上我们自定义的 CA 证书。 这算不上 mitm 了,都能给客户端安装 ca 证书了,啥不能干。思路应该是中间设备劫持 dns 和第一次 http->https 的 302 跳转,让客户端和中间设备保持 http 通信,同时剥去来自服务器端的 hsts header 。对于客户端已经被告知 hsts 的站点无效。 |
8 lslqtz 2017-01-30 07:13:13 +08:00 via iPhone @linbiaye 这就是 mitm ,只不过能取得客户端的信任。 HTTP 的劫持也是中间人,只要你和服务器的通信被第三方修改过或嗅探过,就属于被中间人。 |
9 des 2017-01-30 08:28:05 +08:00 via Android https 劫持的话,就算去掉了 hsts ,然后代理。我也能插随机 js 跳回去,再加上 cookie secure ,不太可能破解。 |
10 wuchangming89 OP @linbiaye ,想说的就是装了 CA 证书什么都能干 :)。对于一般用户他不知道什么是 CA 证书,被诱导安装上自定义的 CA 是很容易的。 另外,“ https 剥离”我觉得更应该叫 http mitm ,因为全程和 https 都没什么关系。 ![]() |
11 wuchangming89 OP @SoloCompany ,一个完整的 hack 方案确实是要包括流量劫持,但这里想讲的只是 HTTPS 的证书链,所以就用最简单的正向代理的方式。 |
12 wuchangming89 OP @des ,随机 js ? |
13 linbiaye 2017-01-30 11:33:19 +08:00 @wuchangming89 垃圾 12306 还在用自签的,估计已经不少人被装了不明来路的 ca 证书。 |
15 wuchangming89 OP @breeswish ,但一般用户其实不知道 CA 是什么,会留下安全隐患 |
16 breeswish 2017-01-31 14:48:15 +08:00 @wuchangming89 一般用户连 https 都不知道 ┑( ̄Д  ̄)┍ |
17 sola97 2017-01-31 19:20:40 +08:00 非一般用户不就没辙了 |