Клиент MQTTnet не может подключить сертификат сервера

#c# #certificate #client #mqtt

#c# #сертификат #клиент #mqtt

Вопрос:

Я использую библиотеку MQTTnet для подключения к моему серверу MQTT, которому требуется сертификат сервера. Клиентский сертификат не нужен.

Я уже установил сертификат на свой компьютер, как я нашел в другом сообщении, и создал файл .pfx для создания сертификата, но программа мне его не выдает error..it просто не имеет отношения к теме.

Это мой пример кода

         //Create a new MQTT client
        var factory = new MqttFactory();
        var mqttClient = factory.CreateMqttClient();

        var caCert = new X509Certificate(@"C:caserverroot.pfx", "mypsw");
        var url = "mymqtt.com";
        var username = "user";
        var psw = "user";
        var port = 8885;

        var options = new MqttClientOptionsBuilder()
            .WithClientId(Guid.NewGuid().ToString())
            .WithTcpServer(url, port)
            .WithCredentials(username, psw)
            .WithTls(new MqttClientOptionsBuilderTlsParameters()
            {
                AllowUntrustedCertificates = true,
                UseTls = true,
                Certificates = new List<byte[]> { new X509Certificate2(caCert).Export(X509ContentType.Cert) },
                CertificateValidationCallback = delegate { return true; },
                IgnoreCertificateChainErrors = false,
                IgnoreCertificateRevocationErrors = false
            })
            .WithCleanSession()
            .WithProtocolVersion(MQTTnet.Serializer.MqttProtocolVersion.V311)
            .Build();

        // Connecting
        var result = await mqttClient.ConnectAsync(options);
  

// Подписаться на тему

         mqttClient.Connected  = async (s, e) =>
        {
            Console.WriteLine("### CONNECTED WITH SERVER ###");

            await mqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic("/mytopic").Build());

            Console.WriteLine("### SUBSCRIBED ###");
        };
  

Со всеми другими событиями, которые я нашел здесь: https://github.com/chkr1011/MQTTnet/wiki/Client

У кого-нибудь из вас был опыт работы с этой библиотекой? Как его отладить и найти ошибку?

Спасибо

Ответ №1:

Итак, я не знаю, почему я был неправ, но использование ManagedMqttClient спасло мою ситуацию.

Это код, который работает как шарм

  //Create a new MQTT client
            var mqttClient = new MqttFactory().CreateManagedMqttClient();

            var caCert = new X509Certificate(@"C:cert.pfx", "psw");
            var url = "myurl.com";
            var username = "user";
            var psw = "user";
            var port = 8885;

            var options = new ManagedMqttClientOptionsBuilder()
                .WithAutoReconnectDelay(TimeSpan.FromSeconds(30))
                .WithClientOptions(new MqttClientOptionsBuilder()
                    .WithClientId(Guid.NewGuid().ToString())
                    .WithTcpServer(url, port)
                    .WithCredentials(username, psw)
                    .WithTls(new MqttClientOptionsBuilderTlsParameters()
                    {
                        AllowUntrustedCertificates = false,
                        UseTls = true,
                        Certificates = new List<byte[]> { new X509Certificate2(caCert).Export(X509ContentType.Cert) },
                        CertificateValidationCallback = delegate { return true; },
                        IgnoreCertificateChainErrors = false,
                        IgnoreCertificateRevocationErrors = false
                    })
                    .WithCleanSession()
                    .WithProtocolVersion(MQTTnet.Serializer.MqttProtocolVersion.V311)
                    .Build())
                .Build();


            // Connecting
            await mqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic("$share:mygroup:/mytopic").Build());
            await mqttClient.StartAsync(options);
  

Комментарии:

1. При добавлении сертификата я получаю ошибку несоответствия типов.