分享自己写的一篇关于 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
非一般用户不就没辙了
|