1.背景
自己想了解一下Https如何透明,于是找到了这个项目,但是需要自己把流量定位到8080端口。windows是支持代理流量的,常见的代理方式是修改internet setting(某不愿透露姓名的哥儿说SSR也是通过这种方式代理本地的流量),如下图所示。

接着简单分析一下这个代理服务器是如何实现。通过ProMon不难发现,iexplore是通过修改注册表的方式实现的。

那么我们怎么通过API来指定自己的代理服务器,这里通过栈回溯,发现使用的是WININET.dll下的InternetSetOptionW。

这里自己假装去找一下MSDN的定义,了解一下怎么使用这个API。
2.如何自己转发流量
上述的方式可以代理当前计算机产生的流量,mitmproxy也能成功的实现https的透明化,但是有几个问题需要了解和注意:
1、修改windows代理的方式比较简单,但是也容易被其他人修改。
2、https透明需要本地安装根证书的。
3、怎么让流量走到我们设置的代理服务器。
在对上述问题有一个基本了解之后,开始查找资料。
3.使用WinDivert进行端口重定向
对https有点了解的朋友都知道,https使用的是443端口,那么我们只需要转发自己的443端口到代理服务器的端口不就行了吗?是的就是这么简单。下面是r3使用WinDivert转发端口的代码
#include
#include
#include
#include
#include
#include
#include
这里需要注意的是不能使用本地的IP地址,因为443端口的数据会被全部转发到8080,导致本地的代理服务器的https请求也发不出去,形成一个闭环。
还有就是根证书问题,需要在需要https透明的主机上安装,建议使用静默安装。
证书管理器工具 (Certmgr.exe) | Microsoft Docs
当然https还有很多需要注意的细节(比如为什么要安装CA、https通信又是如何保证安全的、Http1和Http2又有说明区别、MITM又是怎么实现中间人的、SSLStrip如何实现https的降级),这里不谈,主要是自己水平有限。
最后成功透明化了流量。
