好的 C# XMPP 库,支持群聊和 TLS 或 SSL 加密。

4

我一直在寻找一个可靠的C#库,用于XMPP客户端和服务器之间的SSL或TSL加密。希望有人能推荐一个满足我的需求并且有良好支持和文档的库。同时,也希望有人能够确认我对已经尝试过的库的猜测是否正确。

我的第一个尝试是使用Soapbox Studio SDK。可以从Conversant这里找到,然而据我所知,他们只支持SASL身份验证。我试图联系他们,但没有得到回应,他们的论坛似乎也无法工作,因为我无法在其论坛上发布我的问题。如果有人能纠正我关于Soapbox库的SSL假设,那将是太好了,因为那是我想要使用的库。

我接下来转向Matrix,它是agXmpp的后继者。在浏览他们的消息板和样例应用程序几天后,我甚至不能在我的openfire服务器上创建一个群聊。几乎所有相关问题发布在ag Software forum,并引导人们使用他们的样例应用程序来回答问题。然而,除非我误解了什么,他们的许多样例应用程序似乎已经过时或不适合我的需求。以下代码是我尝试使用他们的库创建群聊的示例。如果有人使用过他们的库,也许他们可以指出我哪里做错了。
这些是我的使用指令。
using System;
using Matrix.Xmpp.Disco;
using Matrix.Xmpp.Client;
using Matrix.Xmpp.Session;
using Matrix.Xmpp;
using Matrix;

这里是连接到Xmpp客户端的代码

readonly XmppClient _xmppClient = new XmppClient();

public string Connect() {
   try
   {
       _xmppClient.SetUsername(OPENFIRE_USER_NAME);
       _xmppClient.Password = OPENFIRE_PASSWORD;
       _xmppClient.SetXmppDomain(OPENFIRE_SERVER);

       _xmppClient.Show = Matrix.Xmpp.Show.chat;
       _xmppClient.AutoRoster = true;
       _xmppClient.Open();

                return "Connection Succesful";
    }
    catch (Exception ex)
    {
       _logger.LogError("SessionManager", "Connect", "Could not connect to Openfire                     Server", ex.ToString());
                        return "Could not Connect to Openfire Server";
    }
}

这是应该创建新聊天室的代码

public string CreateRoom(string roomName, string serverName, string userName)
{
    Jid groupJid = new Jid(userName, serverName, "gec2o");

    using (MucManager mucManager = new MucManager(_xmppClient))
    {
        mucManager.EnterRoom(groupJid, roomName, true);
        mucManager.RequestInstantRoom(groupJid);
    }

    return "";
}

然而,在服务器上没有创建任何聊天室,也没有抛出任何异常。此外,我知道可以使用他们的库连接到我的服务器,因为我可以看到我的登录名出现在openfire的用户列表中。虽然他们在文件中记录了所有类的文档,但该库几乎没有对每个类/方法实际执行的操作以及如何使用它的注释。同样,他们的论坛大多告诉人们查看示例代码,这在很大程度上是没有帮助的,就像soapbox一样,这个库似乎也没有得到很好的支持(看起来只有一个开发者回答每一个问题)。
我简要地研究了其他库,例如jabber-net,但在支持和文档方面与Soapbox和Matrix相同。
我还发现IP * Works Internet Toolkit,但该库似乎有些成本限制。

我意识到在这个问题中我做了很多假设,但是我已经研究了几天,这是我能得出的最好结论。我希望有人能够纠正我的假设或推荐一个不会出现我一直面临的问题的库。


MatriX在这方面表现良好,我正在尝试使用OpenFire完成同样的操作。您能否发布打开XmppClient连接的代码部分? - jlew
@jlew 我刚刚在我的问题中包含了连接的代码。 - pat8719
2个回答

3

大部分XmppClient都是异步工作的。当你调用像client.Open()这样的方法时,它会立即返回,但你需要等待它触发OnBind()事件后才能对mucManager进行任何操作。例如:

    public class ChatRoom
    {
        private readonly ILogger _logger;
        private XmppClient _client;
        private MucManager _mucManager;

        public ChatRoom(ILogger logger)
        {
            _logger = logger;           
        }

        public string UserName { get; set; }
        public string Password { get; set; }
        public string XmppDomain { get; set; }
        public System.Uri BoshUri { get; set; }
        public string RoomJid { get; set; }
        public string RoomNick { get; set; }

        public void Start()
        {
            _client = new XmppClient(UserName, XmppDomain, Password);               
            _client.OnBind += (o, e) => _CreateChatRoom(_client, RoomJid, RoomNick);
            _client.OnSendXml += (o, e) => Trace(ConsoleColor.DarkGreen, "Sending:\n {0}", e.Text);
            _client.OnReceiveXml += (o, e) => Trace(ConsoleColor.DarkMagenta, "Receiving:\n {0}", e.Text);
            _client.OnError += (o, e) => Trace(ConsoleColor.Red, "Error: {0}", e.Exception);
            _client.Open();
            _client.Close(); 
        }
        private void Trace(ConsoleColor color, string msg, params object[] args)
        {
            var oldColor = _logger.Color;
            _logger.Color = color;
            _logger.Log(msg, args);
            _logger.Color = oldColor;
            Debug.WriteLine(msg, args);
        }

        private void _CreateChatRoom(XmppClient client, string chatRoomName, string roomNick)
        {
            _mucManager = new MucManager(client);
            _mucManager.EnterRoom(chatRoomName, roomNick);            
        }

        public void SendMessage(string text)
        {
            _client.Send(new Message("muc@conference.dgwbhbm1", MessageType.groupchat, text));
        }

        public void End()
        {
            _client.Close();
        }

        public void Invite(Jid[] user)
        {
            _mucManager.Invite(user, RoomJid, "Come chat");
        }      
    }

那么,在“OnBind”事件触发时创建聊天室是“安全”的唯一方法吗? - pat8719
我基本上复制了你创建聊天室的方法,并获得了相同的结果。是否还有其他可能导致我做错事情的“陷阱”? - pat8719
你使用的是哪个XMPP服务器?通常查看发送和接收的消息(OnSendXml/OnReceiveXml)会很有帮助,以确定是否发生了任何问题或失败。 - jlew
+1 对于发现我的矩阵实现有什么问题非常有帮助。 - pat8719

0

看起来一直以来,这个问题的答案是我的原始首选库(Soapbox Studio SDK)实际上支持TLS加密,因此一直是我最好的选择。看起来TLS只是没有很好地记录和/或我错过了这个功能。

根据您的服务器配置(我正在使用Openfire服务器),您应该能够配置您的服务器仅接受加密连接。与使用SSL(Openfire正在从其服务器中弃用)并尝试通过SSL端口5223连接不同,只需连接到默认端口(5222)并要求加密连接即可强制客户端使用TLS发送数据并自动协商握手。此外,可以配置服务器防止客户端创建其他用户。通过控制哪些客户端能够在您的服务器上创建XMPP用户,而不是发放SSL证书,您因此基本上确保了安全通信。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接