【问题标题】:How do I write a simple HTTPS proxy server in Ruby?如何在 Ruby 中编写一个简单的 HTTPS 代理服务器?
【发布时间】:2012-08-24 15:05:04
【问题描述】:

我见过几个用 Ruby 编写 HTTP 代理的例子,例如this gist by Torsten Becker,但我将如何扩展它以处理 HTTPS,也就是“中间人”SSL 代理?

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

更新

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

更新二

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

【问题讨论】:

    标签: ruby ssl https proxy


    【解决方案1】:

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

    【讨论】:

    • 将单个请求代理到单个服务器可能没问题,但代理来自现代浏览器的真实流量更加复杂。
    • @pguardiario 代理浏览器或服务器可以发送的任何内容都可以。如果您有反证,请提供。
    • 很明显它需要多线程,通过保持活动等来跟踪连接等等。
    【解决方案2】:

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

    如果WEBrick::HTTPProxyServer,这就是do_CONNECT 方法。

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

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

    【讨论】:

    • 这很有帮助,谢谢!在摸索这个之后,我能够创建一个自定义的WEBrick::HTTPProxyServer 子类,它只是注释掉the original do_CONNECT 方法的一部分以避免发送 CONNECT 握手,然后让我将ProxyURI 参数指向 a 的端口具有自签名证书的标准WEBrick::HTTPServer 实例(因为我在我的用例中跳过了验证)。这很好用,我可以将第一个服务器用作 HTTPS 代理,第二个用作可以劫持响应的 MITM 服务器。
    【解决方案3】:

    Webrick 可以代理 ssl:

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

    【讨论】:

    • 这看起来不像 MITM 代理,而是像普通的 HTTP(S) 代理。
    • 是的,我不确定 webrick 是否可以伪造证书或任何类似的东西,我从未尝试过。
    • 我不是 Ruby 专家,但 do_CONNECT 的代码似乎只处理普通 TCP 中继,与处理证书或传出 HTTPS 连接所需的代码完全不同。
    【解决方案4】:

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

    【讨论】:

    • 我更新了我的 OP 以澄清:我已经在使用 Charles(它就像 OS X 的 Fiddler),它非常适合调试网络流量。但我希望对过滤和呈现进行更细粒度的控制。
    • @fearless_fool “细粒度控制”是什么意思?
    • 非常具体:我想检查每个传出请求的表单、查询字符串和 cookie,然后确定这些值源自的先前响应。够细吗? :)
    • @fearless_fool,不确定您在 Charles 中有哪些功能,但 Fiddler 让您看到所有这些,即表单、查询字符串和 cookie。对于每个请求,您可以查看所有请求标头(从您这边发送的内容)和响应标头(已收到的内容)。 IE。您可以看到正在传输的所有内容。不确定“识别先前的响应”是什么意思,因为仅发送(未收到)查询字符串和表单。无论如何,构建这样一个工具将花费大量时间。我建议寻找已经建成的东西。
    • @fearless_fool 无论如何 - 让我们知道进展如何 - 这绝对是一个非常有趣的话题。
    猜你喜欢
    • 1970-01-01
    • 2011-01-13
    • 2023-04-07
    • 2010-09-21
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多