我已经看过几个在Ruby中编写HTTP代理的例子,例如: this gist by Torsten Becker,但我如何扩展它以处理HTTPS,又称为“中间人”SSL代理?
我正在寻找一个简单的源代码框架,我可以根据自己的日志记录和测试需求进行扩展。
我已经使用类似于Fiddler的Charles, a nifty HTTPS proxy app,它基本上是我想要的,除了它已经打包在应用程序中。我想写自己的,因为我有过滤和演示的特定需求。
在探索过后,我对术语的理解有所改善。我不是在完整的“中间人”SSL代理之后。相反,它将在我的机器上本地运行,因此我可以尊重它提供的任何SSL证书。但是,我需要查看请求的数据包的解密内容和响应的解密内容。
答案 0 :(得分:6)
仅用于背景信息,普通HTTP代理通过CONNECT
方法处理HTTPS请求:它读取主机名和端口,在此端口上建立与此目标服务器的TCP连接,返回200 OK
然后只是隧道连接到初始客户端的TCP连接(在TCP连接之上交换SSL / TLS的事实几乎不相关)。
这是do_CONNECT
方法WEBrick::HTTPProxyServer
。
如果您想要MITM代理,即如果您希望能够查看SSL / TLS流量,您当然可以使用WEBrick::HTTPProxyServer
,但您需要更改do_CONNECT completely
:
CONNECT
请求时,您需要生成一个对该主机名有效的证书(最好使用该主机名的Suject Alt。名称,或者在主题DN' ■Common Name),并将套接字升级为SSL / TLS服务器套接字(使用该证书)。如果浏览器接受信任该证书,那么您在此SSL / TLS套接字上从中获得的是纯文本流量。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