使用OpenSSL增强ASIO无法读取HTTP标头

时间:2013-02-27 23:48:52

标签: c++ boost ssl openssl boost-asio

我正在尝试使用Boost ASIO编写一个简单的HTTP / HTTPS代理。 HTTP工作正常,但我遇到了一些HTTPS问题。为了记录,这是一个本地代理。无论如何,这里是一个事务如何与我的设置一起工作的例子。

浏览器要求Google.com
我撒谎到浏览器并告诉它转到127.0.0.1:443
浏览器套接字在443上连接到我的本地服务器。我尝试读取标头,这样我就可以进行真正的主机查找并打开第二个上游套接字,这样我就可以简单地转发请求。

这是事情立即失败的地方。当我尝试打印传入套接字的标头时,它们似乎已经由发出请求的浏览器加密。我一开始以为可能是混乱的控制台输出只是标题被压缩了,但经过一些彻底的测试后情况并非如此。

所以我想知道是否有人可以指出我正确的方向,也许是一些阅读材料,我可以更好地了解这里发生的事情。为什么在连接到“服务器”(我的代理)之前,标头会立即加密,并且有机会与客户端通信?它是临时密钥吗?我是否需要忽略初始标头并发回一些命令告诉客户端使用或不使用什么临时密钥进行压缩/加密?非常感谢您提供任何帮助,我已经坚持了一段时间。

1 个答案:

答案 0 :(得分:0)

HTTPS通过安全的SSL连接传递所有HTTP流量,标头和所有内容。这是为了防止你正在尝试做的事情本质上是一个中间人攻击。为了取得成功,您必须想出一种方法来破坏SSL安全性。

执行此操作的一种方法是提供浏览器将接受的SSL证书。浏览器抱怨证书有几个常见原因:(1)证书未由浏览器信任的权限签名,(2)证书公用名(CN)与URL主机不匹配。

只要您控制浏览器环境,就可以通过创建自己的certificate authority(CA)并在操作系统和/或浏览器中将其证书安装为受信任来轻松修复(1)。然后在您的代理中提供由CA签名的证书。您基本上告诉浏览器可以信任您的代理提供的证书。

(2)将更加困难,因为您必须提供具有正确CN的证书,然后才能读取HTTP标头以确定浏览器尝试访问的主机。此外,除非您已经知道可能需要的主机,否则您必须动态生成(并签名)匹配的证书。也许您可以为您的代理使用IP地址池并与您的欺骗DNS服务协调,以便您知道应该在哪个连接上显示哪个证书。

通常,HTTPS代理不是一个好主意。我会劝阻它,因为你真的会反对浏览器安全问题。

我喜欢this book作为SSL / TLS参考。您可以使用OpenSSL之类的工具来创建和签署自己的证书。