如何在Ruby中编写简单的HTTPS代理服务器?

时间:2012-08-29 22:41:51

标签: ruby ssl https proxy

我已经看过几个在Ruby中编写HTTP代理的例子,例如: this gist by Torsten Becker,但我如何扩展它以处理HTTPS,又称为“中间人”SSL代理?

我正在寻找一个简单的源代码框架,我可以根据自己的日志记录和测试需求进行扩展。

更新

我已经使用类似于Fiddler的Charles, a nifty HTTPS proxy app,它基本上是我想要的,除了它已经打包在应用程序中。我想写自己的,因为我有过滤和演示的特定需求。

更新II

在探索过后,我对术语的理解有所改善。我不是在完整的“中间人”SSL代理之后。相反,它将在我的机器上本地运行,因此我可以尊重它提供的任何SSL证书。但是,我需要查看请求的数据包的解密内容和响应的解密内容。

4 个答案:

答案 0 :(得分:6)

仅用于背景信息,普通HTTP代理通过CONNECT方法处理HTTPS请求:它读取主机名和端口,在此端口上建立与此目标服务器的TCP连接,返回200 OK然后只是隧道连接到初始客户端的TCP连接(在TCP连接之上交换SSL / TLS的事实几乎不相关)。

这是do_CONNECT方法WEBrick::HTTPProxyServer

如果您想要MITM代理,即如果您希望能够查看SSL / TLS流量,您当然可以使用WEBrick::HTTPProxyServer,但您需要更改do_CONNECT completely

  • 首先,您的代理服务器需要嵌入一个能够动态生成证书的小型CA(如果您愿意绕过警告消息,则可能会使用自签名证书)浏览器)。然后,您可以将该CA证书导入浏览器。
  • 当您收到CONNECT请求时,您需要生成一个对该主机名有效的证书(最好使用该主机名的Suject Alt。名称,或者在主题DN' ■Common Name),并将套接字升级为SSL / TLS服务器套接字(使用该证书)。如果浏览器接受信任该证书,那么您在此SSL / TLS套接字上从中获得的是纯文本流量。
  • 然后您必须处理请求(获取请求行,标题和实体)并使其通过普通的HTTPS客户端库使用它。您可以将该流量发送到WEBrick::HTTPProxyServer的第二个实例,但必须进行调整以发出传出的HTTPS请求,而不是普通的HTTP请求。

答案 1 :(得分:0)

该博客无法编写代理。这很简单:你只需接受一个连接,读一行告诉你要连接的内容,尝试上游连接,如果失败则发送相应的响应并关闭套接字,否则只是开始在两个方向上复制字节,同时,直到EOS发生在两个方向。 HTTPS的唯一区别是你必须说SSL而不是明文。

答案 2 :(得分:0)

根据我的经验,HTTPS远不是“简单”。您是否需要能够从您自己的机器捕获流量的代理?有几个应用程序,如Fiddler。或谷歌替代品。提供调试网络流量所需的一切。

答案 3 :(得分:0)

Webrick可以代理ssl:

require 'webrick'
require 'webrick/httpproxy'
WEBrick::HTTPProxyServer.new(:Port => 8080).start