Клиент MQTTnet не может подключить сертификат сервера - PullRequest
0 голосов
/ 08 апреля 2019

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

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

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

        //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 Ответ

0 голосов
/ 08 апреля 2019

Итак, я не знаю, почему я был неправ, но использование 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);
...