Как использовать файлы PEM в функции Azure с помощью MqttNET

Я надеюсь, что вы можете помочь мне здесь. Я пытаюсь создать клиент MQTT (функция Azure в среде службы приложений), который извлекает данные из брокера MQTT (hivemq), но я немного теряюсь, когда дело доходит до сертификатов (я не эксперт).

Так или иначе, я получил 3 файла (см. ниже) от нашего партнера (это они с брокером MQTT), но вопрос. Как мне использовать эти файлы PEM в приложении??

  • Сертификат клиента == mqtt-client-cert.pem
  • Ключ клиента == mqtt-client-key_nopass.pem
  • Сертификат CA == server.pem

Вот приложение, а вот пример, где я протестировал его локально (с сертификатом crt) на тестовом брокере (test.mosquitto.org). Это сработало отлично, но теперь мне нужно то же самое, только с 3 файлами PEM.

Я также подозреваю, что мне нужно что-то сделать в Azure (либо на уровне приложения-функции, либо на уровне среды службы приложений), чтобы использовать эти сертификаты?

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

            // Load certificate 
            X509Certificate caCertificate = new X509Certificate(@"..\mosquitto.org.crt");

            // Create TLS based parameters.
            var tlsParameters = new MqttClientOptionsBuilderTlsParameters
            {
                UseTls = true,
                Certificates = new List<X509Certificate> { caCertificate },
                SslProtocol = System.Security.Authentication.SslProtocols.Tls12
            };

            // Create TCP based options using the builder.
            var connectOptions = new MqttClientOptionsBuilder() 
                .WithTcpServer("test.mosquitto.org", 8883)
                .WithProtocolVersion(MQTTnet.Formatter.MqttProtocolVersion.V311)
                .WithTls(tlsParameters)
                .Build();

            var conResult = await mqttClient.ConnectAsync(connectOptions);
                              
            mqttClient.UseConnectedHandler(e =>
            {
                Console.Write("Connected successfully with MQTT Brokers.");
            });
            mqttClient.UseDisconnectedHandler(e =>
            {
                Console.Write("Disconnected from MQTT Brokers.");
            });
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 070
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

.crt файлы обычно содержат ключи/сертификаты в кодировке PEM, поэтому в этом случае расширение файла не имеет значения.

Вы должны быть в состоянии заменить mosquitto.org.crt на server.pem.

Остальные 2 файла предназначены для так называемой взаимной аутентификации TLS. Для большинства подключений TLS (например, при выполнении HTTPS-запроса к веб-странице) только одна сторона подключения нуждается в сертификате/закрытом ключе. Это сервер. Клиент использует коллекцию сертификатов ЦС для подтверждения того, что служба является тем, за что себя выдает. (Это то, что вы делаете, используя файл mosquitto.org.crt).

В других случаях мы хотим аутентифицировать оба конца соединения (клиент хочет знать, что такое сервер, а сервер хочет знать, кто такой клиент). Для этого клиент также должен предоставить серверу сертификат, для этого предназначены два других файла.

Документация MQTTNet включает пример настройки соединения с использованием клиентских сертификатов здесь, но при этом используется .pfx (pfx — это просто другое имя контейнера PKCS12, при необходимости вы можете преобразовать файлы .pem в .pfx/.p12 файл с использованием openssl, например openssl pkcs12 -export -out mqtt-client.p12 -inkey mqtt-client-key_nopass.pem -in mqtt-client-cert.pem -CAfile server.pem)

List<X509Certificate> certs = new List<X509Certificate>
{
    new X509Certificate2("myCert.pfx")
};

var options = new MqttClientOptionBuilder()
    .WithTcpServer(broker, port)
    .WithTls(new MqttClientOptionsBuilderTlsParameters
    {
        UseTls = true,
        Certificates = certs
    })
    .Build();

Привет hardillb, Спасибо за вашу помощь. Это мне очень помогло и дало более глубокое понимание. Теперь я пытаюсь преобразовать файлы .pem в файл pfx/.p12, как вы указали в своем примере, но здесь я получаю сообщение об ошибке: непризнанный флаг CAFile?

Zaz 25.12.2020 23:17

@Zaz извините, была опечатка, так и должно быть -CAfile. я обновил ответ

hardillb 25.12.2020 23:23

Привет @hardillb, спасибо за помощь и извините за поздний ответ. Из-за коронавируса мы были закрыты, но теперь мы снова в игре.

Zaz 01.03.2021 14:04

Может быть, я должен был быть более ясным. Функция Azure — это триггер времени, который срабатывает каждые 5 секунд для получения нового контента с сервера. Вы все еще думаете, что мне следует использовать взаимную аутентификацию TLS? Я последовал вашему примеру и преобразовал файлы в файл .pfx/.p12, используя openssl, например. openssl pkcs12 -export -out mqtt-client.p12 -inkey mqtt-client-key_nopass.pem -in mqtt-client-cert.pem -CAfile server.pem, но здесь я получаю исключение: «Учетные данные, предоставленные пакету не были признаны"???

Zaz 01.03.2021 14:04

Другие вопросы по теме