温故而知新之 https proxy

周六昏昏欲睡的下午,顺手用 goproxy 写了个小工具。功能部分不到两个小时就搞定了,但是在处理 https proxy 部分,希望实现一个自定义feature时,调试了挺长时间。这大大打击了自诩可以手撕 https/tls 的自我信心😝。于是顺手看了一下这块的实现部分。

原理上,https proxy 的处理,都是以客户端 CONNECT 请求开始,后续的请求都是通过这次建立的连接进行 req-rsp 交互。一句话就能讲完,很简单,对吧?对也不对。正确的部分在于,原理的确就是这样的,但是如何使用这个连接,以及如何处理其中的安全问题让这一块有很多细节需要考虑。所谓魔鬼在细节中,这也是这块最有意思的地方。

以 goproxy 这块的实现为例,通过 CONNECT 建立连接以后,请求的的交互主要支持4种方式

  • ConnectAccept
  • ConnectHijack
  • ConnectHTTPMitm
  • ConnectMitm

ConnectAccept 是最基本的方式,只负责在 tcp 层建立远端和客户端的连接,这个连接具体怎么用,由客户端自己与远端交互决定。各个平台、各个客户端都支持这种方式,基本上没有兼容性问题。

ConnectHijack 与后面的两种方式本质上同一种类型,都可以认为是 Hijack 类型。这里涉及一个很重要的概念 Hijack, 这个在 golang 标准库中有非常准确详细的解释,搬运如下:

也就是相较于 ConnectAccept, proxy 不再是中间的小透明,而是可以接管连接,在中间实现一些自定义有意思的功能,这也是 MITM 的基石。所不同的是:

  • ConnectHijack 要求在业务自己在应用层实现这块逻辑,优点就是一切尽在掌握,可以实现很多有意思的功能。
  • ConnectHTTPMitm 是一种 https 降级为 http 的一种实现。也就是 https 通过这个 proxy 后,都被降级为 http 请求与远端交互。优点是可以 offload TLS 这层的加解密和签名开销,但是完全没有安全性。因此,这种一种古老的方式已经不被绝大部分 client 支持了。
  • ConnectMitm 则是一种经典实现,把客户端的 https 请求在中间做中转,然后还是以 https 的方式发送到远端。这是被client广泛支持的方式,因此兼容性较好。

需要说明的是:

  • Hijack 类型都依赖CA证书,这也是为什么你手机、电脑设备里面的CA根证书很重要,不要随便信任和安装来路不明证书的原因。
  • goproxy 在 ConnectHTTPMitmConnectMitm 的实现中,都会再次调用 filterRequest 执行 OnRequest 的 handler, 因此要在你的 request handler 中识别和处理这种经过转换的请求,否则会出现 loop 以及请求失败的情况。

从原理到实现,基本就拆解完了。其实也没有什么高深的部分,正如很多东西,不过是温故而知新,进一寸有一寸的欢喜。

闭关这一年

去年的这个时候,工作上进入阶段性闭关。近年这个时候,到了出关的时候。也是一种巧合。

一年时间,俯仰之间。在一年的中点,少了一点理所当然时间朋友的感觉,有得有失,冷暖自知。

在目标感与企图心之间,自己缺少了一些区别感。一年之后的现在回头,我想前者更多的是自己,而后者更多的别人。没有褒贬之分,而是要有区别感,这很重要。

不久前妞儿问我之前14年在毕业典礼上讲的十年之约还算数吗?我信誓旦旦的说,当然算数,但是却少了许多坚定。如同前端时间看到同窗好友的朋友圈,不禁疯狂点赞的同时,也感慨十年一剑的隐忍不易与静水流深。

我承认我至今依然非常迷恋宏大的叙事。但是,这种宏大叙事更多是传达别人或者历史的认知,而不是自己的认知。很多时候,当听众遇到良师,是一种幸运,当时会自然的陷入一种智力和体力的偷懒。下半年依然会密切关注身边的朋友,依然会用有限的资本积累感受时代和经济的温度,位置上希望自己能更上前一步,然后更向前一步。

五月与新生

疫情反复,四月无声。

五月,从一开始就让自己有些许焦躁。这种焦躁本来是更加个人的事情,虽然成都一直在几个大城市中保持得不错,但是在这种大背景下,也让自己平添了一些不安。

16日的确是很有意义的一天。早上,身手矫健的妞儿跟自己一起去卸掉了阶段性的负债。晚上因为临时的事情,莫名其妙在闭关室加班到了最后一个。回到家,跟妞儿一脸淡定的去医院,然后…到医院没几分钟,妞儿在诊室叫喊得整个一层都能听见,我跟在屁股后面办住院手续,等追到楼上去,医生直接叫我签字,一脸懵逼还没搞清楚怎么回事,字还没写完,已经听见新生的哭喊声响彻走廊!有时候,身在其中,你很明确这一定是一个moment, 但是感性的自己可能落后在了身体之后,还在思考这到底是怎么回事。

那天晚上基本没睡觉,但是相比7年前,只是单纯身体上的疲惫。很多7年前相同时刻疑惑的事情,现在已经没有了出现在思考主线上的资格。有时候,看着大宝的成长,在这个时刻其实也映照在了自己身上。恍然回首,感觉自己还算做得不错。

生活从来没有剧本,使劲窥探,只能看到轮廓若隐若现,其中的内容只能活在当下,品在其中。如同上一次,可以预期自己的心态又会发生一次改变,这种改变其实在这之前似乎跟计划好了一般,已经预演了很多次,而这临门一脚刚好到了转折点。

格物致知,宁静致远。心有所托,也是自己的一次重新成长。