【发布时间】:2021-03-15 23:26:21
【问题描述】:
我正在实现一个 Web 代理(用 C 语言),最终目标是实现一些简单的缓存和广告拦截。目前代理支持普通的HTTP站点,也支持HTTPS站点,通过HTTP CONNECT实现隧道。代理从 localhost 运行并使用我的浏览器配置非常好。
尽管如此,只要代理无法解密 HTTPS 流量,我就永远无法实现我想要的功能。我的问题的本质是:我需要采取哪些一般步骤才能解密此流量并实现我想要的?我一直在研究这个,似乎有大量关于现有代理的信息,例如Squid。
目前,我的服务器使用 select() 并将所有客户端 ID 保存在 fd_set 中。当发出 CONNECT 请求时,它会与指定的主机建立 TCP 连接,并将客户端和主机的文件描述符放入 fd_set。它还将 fd 的元组放入一个列表中,只要从 select() 中准备好更多数据,就会扫描该列表,以查看数据是否来自现有隧道。然后盲目地读取和转发数据。由于 CONNECT 动词的性质要求打开一个简单的 TCP 套接字到所需的主机,然后在客户端和主机设置自己的 SSL 时“远离它”,我正在努力查看如何截取这些数据插座。我只是在询问如何使用代理作为 MITM 攻击者来读取和操作传入的数据的正确方向。
顺便说一句,这个项目仅供我自己使用,因此不需要安全或高级功能。我只需要它在一个浏览器上工作,如果证书欺骗是最好的方法,我很高兴收到来自浏览器的任何警告。
【问题讨论】:
-
为什么你认为你需要实现自己的代理而不是仅仅使用 squid?
-
这是我为自己的学习利益而做的一个项目。我同意,如果我只是想要一个功能正常的代理,我只会使用 Squid 或由有能力的人编写的东西。
-
使用 libssl 解密 HTTPS 流量。
-
一般情况下你不能这样做,因为 TLS/SSL 可以防止这种本质上的 MITM 攻击。如果您可以让您的 MITM 证书受到客户的信任,那么您可能会成功。
标签: c encryption https proxy openssl