我正在尝试开发XMPP“代理”,它将位于标准Jabber通信的中间。

模式将是这样的:

Pidgin ---> Proxy <--- eJabberD
              |
              v
           Console


此代理的目的是记录通过网络传输的所有节。恕我直言,这在您开发基于XMPP的解决方案时非常方便。

我正在使用EventMachine和Ruby进行此操作,主要问题是要知道在TLS / SASL握手后如何解密流量。

在starttls之前,一切工作正常,服务器和客户端可以在它们之间进行对话,但是当tls握手开始时,尽管它可以工作,但是由于所有流量都经过加密,因此无法转储明文内容。

我不是TLS / SASL方面的专家,所以我不知道哪种方法是最好的方法。我认为实现此目的的一种方法应该是在握手中获取证书,并使用它来对通过代理的内容进行解密。

谢谢!

最佳答案

如果您可以按照自己的意愿去做(抓住网上的证书并用它来解密),那么TLS将毫无价值。这是TLS可以防止的主要攻击之一。

如果服务器允许,那就不要发送starttls。规格不需要。如果您的服务器需要使用starttls,则可以将其配置为使用空密码,这将使流量保持未加密状态。当然,并非所有服务器都支持。

您可以将中间人放在中间。用您自己的隧道响应到客户端,然后将单独的starttls协商发送到服务器。这会在客户端上生成证书警告,但是由于您控制了客户端,因此无论如何可以告诉它接受证书。

如果控制服务器,则可以使用其中的私钥解密流量。我不知道有任何现成的代码可以轻松做到这一点,但是它是可写的。

10-05 22:57