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

本文关键字:TLS SSL 加密 C#XMPP 支持 | 更新日期: 2023-09-27 17:58:56

所以我一直在努力寻找一个合适的C#库来与XMPP一起使用,该库支持客户端和服务器之间的SSL或TSL加密。我希望有人能推荐我的图书馆,它满足了我的一些需求,并且得到了很好的支持/记录。也许有人可以证实我对我已经尝试过的一些图书馆的怀疑。

我第一次尝试使用Soapbox Studio SDK。从Conversant这里找到的,但从我所知,他们只支持SASL身份验证。我试图联系他们,但没有得到回应,论坛似乎不起作用,因为我无法在他们的论坛上发布我的问题。也许我对Soapbox库的SSL假设是错误的,如果有人能纠正我,那就太好了,因为这是我更喜欢使用的库。

接下来我转到矩阵,它是agXmpp的继任者。在浏览了他们的留言板和示例应用程序几天后,我甚至无法在我的openfire服务器上创建群聊。在ag软件表单上发布的几乎所有相关问题都会引导人们使用他们的示例应用程序来回答他们的问题。然而,除非我误解了什么,否则他们的许多样本申请似乎已经过时或不适合我的需求。下面的代码是我尝试使用他们的库创建群聊的一个示例。如果有人使用过他们的图书馆,也许他们可以指出我做错了什么。

这些是我的使用指令

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,但该库的成本似乎有些高。

我意识到我在这个问题上做了很多假设,但我已经研究了好几天了,这是我能得出的最好的结论。我希望有人能纠正我的假设,或者推荐一个不展示我一直面临的这些问题的图书馆。

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

大多数XmppClient都是异步工作的。当你打电话给像客户这样的人时。Open(),它会立即返回,但在使用mucManager执行任何操作之前,您需要等待它引发OnBind()事件。例如:

    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");
        }      
    }

因此,这个问题的答案似乎一直是我最初的首选库(Soapbox Studio SDK)实际上支持TLS加密,因此一直是最佳选择。TLS似乎没有很好的文档记录和/或我错过了这个功能。

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