6

我已经看过几个用 Ruby 编写 HTTP 代理的示例,例如Torsten Becker 的这个要点,但是我将如何扩展它来处理 HTTPS,也就是“中间人”SSL 代理?

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

更新

我已经在使用Charles,这是一个类似于 Fiddler 的漂亮 HTTPS 代理应用程序,它基本上是我想要的,只是它被打包在一个应用程序中。我想自己写,因为我对过滤和呈现有特定的需求。

更新二

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

4

4 回答 4

7

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

这就是do_CONNECTif 的方法WEBrick::HTTPProxyServer

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

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

那个博客是没有办法写代理的。这很容易:您只需接受一个连接,读取一条告诉您要连接什么的行,尝试上游连接,如果失败则发送适当的响应并关闭套接字,否则只需同时开始双向复制字节,直到EOS 发生在两个方向。HTTPS 的唯一区别是您必须使用 SSL 而不是纯文本。

于 2012-08-29T23:31:21.147 回答
0

根据我的经验,HTTPS 远非“简单”。您是否需要一个可以从您自己的机器上捕获流量的代理?有几个应用程序,例如Fiddler。或谷歌寻找替代品。附带调试网络流量所需的一切。

于 2012-08-29T23:35:49.833 回答
0

Webrick 可以代理 ssl:

require 'webrick'
require 'webrick/httpproxy'
WEBrick::HTTPProxyServer.new(:Port => 8080).start
于 2012-08-29T23:43:18.827 回答