2013-02-27 45 views
0

我正在尝试使用Boost ASIO编写简单的HTTP/HTTPS代理。 HTTP工作正常,但我在使用HTTPS时遇到了一些问题。为了记录,这是一个本地代理。无论如何,这里是一个交易如何与我的设置一起工作的例子。使用OpenSSL提升ASIO无法读取HTTP头文件

浏览器向Google.com
我骗了浏览器,并告诉它去127.0.0.1:443
浏览器插座连接到我的本地服务器上443
我尝试读取头,所以我可以做一个真正的主机查找并打开第二个上游套接字,因此我可以简单地转发请求。

这是事情立即失败的地方。当我尝试打印传入套接字的标题时,看起来它们已经被发出请求的浏览器加密了。我首先想到,也许混乱的控制台输出只是标题被压缩,但经过一些彻底的测试,情况并非如此。

所以我想知道是否有人可以指引我正确的方向,也许一些阅读材料,我可以更好地了解这里发生了什么。为什么在连接到“服务器”(我的代理)之前,头文件会立即加密,甚至完成并有机会与客户端进行通信?它是一个临时密钥吗?我是否需要忽略初始标题并发送一些命令,告诉客户端临时密钥要使用还是不要压缩/加密?非常感谢您的帮助,我一直坚持这一点。

+0

如果你发布了一些你有问题的代码,这将会很有帮助。 – 2013-02-28 04:42:11

+0

阅读asio ssl示例。你应该在任何发送/接收前做出async_handshake – PSIAlt 2013-02-28 13:31:22

+0

感谢球员的评论。问题是,如果我在客户端连接到代理时进行握手,浏览器就会意识到这一点,并且会抛出认证不是真实的以及其他所有内容。我试图制作一个本地透明代理,以便浏览器不知道通过SSL交换的内容正在被本地过滤。只是为了记录,这听起来可能是恶意的,但是对于客户端意识到本地代理正在运行的应用程序而言,没有恶意的意图。 :)我会看看我是否可以发布一些代码。 – Alexiie 2013-02-28 14:16:29

回答

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这样的工具来创建并签署自己的证书。

+0

rhashimoto你为你的系统设置代理的情况如何? – 2018-01-24 00:17:57