Поделиться через


Connect a downstream device to an Azure IoT Edge gateway (Подключение подчиненного устройства к шлюзу Azure IoT Edge)

Область применения: Значок IoT Edge 1.1

Внимание

Дата окончания поддержки IoT Edge 1.1 была 13 декабря 2022 г. Чтобы получить сведения о поддержке определенного продукта, службы, технологии или API, перейдите на страницу Политика жизненного цикла поддержки Майкрософт. Дополнительные сведения об обновлении до последней версии IoT Edge см. в разделе "Обновление IoT Edge".

В этой статье приводятся инструкции по установке доверительного соединения между подчиненными устройствами и прозрачными шлюзами IoT Edge. В сценарии прозрачного использования шлюзов одно или несколько устройств передают сообщения через одно устройство шлюза, которое поддерживает подключение к Центру Интернета вещей.

Для настройки успешного подключения к прозрачному шлюзу необходимо выполнить три шага. Эта статья посвящена третьему шагу:

  1. Настройте устройство шлюза в качестве сервера, чтобы подчиненные устройства могли безопасно подключаться к нему. Настройте шлюз для приема сообщений от подчиненных устройств и направьте передачу данных из них в нужное место назначения. Описание шагов из этого раздела см. в статье Настройка устройства IoT Edge для использования в качестве прозрачного шлюза.

  2. Создание удостоверения устройства для подчиненного устройства, чтобы оно могло проходить проверку подлинности в Центре Интернета вещей. Настройте подчиненное устройство для отправки сообщений через устройство шлюза. Дополнительные сведения см. в разделе Аутентификация подчиненного устройства в Центре Интернета вещей.

  3. Подключите подчиненное устройство к устройству шлюза и начните отправку сообщений.

В этой статье описаны основные концепции подключения подчиненных устройств и приведены инструкции по настройке подчиненных устройств:

  • принципы работы безопасности транспортного уровня (TLS) и сертификатов;
  • сведения о работе библиотек TLS и использовании сертификатов в разных операционных системах;
  • пошаговое руководство по примерам Azure IoT на нескольких языках, которые помогут вам быстро приступить к работе.

В этой статье под терминами шлюз и шлюз IoT Edge подразумевается устройство IoT Edge, которое настроенное в качестве прозрачного шлюза.

Примечание.

Нижестоящему устройству выдаются данные непосредственно в Интернет или на устройства шлюза (с поддержкой IoT Edge или нет). Дочернее устройство может быть подчиненным устройством или устройством шлюза в вложенной топологии.

Необходимые компоненты

Подготовка подчиненного устройства

Роль подчиненного устройства может выполнять любое приложение или платформа с идентификатором, созданным с помощью облачной службы Центра Интернета вещей Azure. Часто для этих приложений применяется пакет SDK для устройств Azure IoT. В качестве подчиненного устройства можно использовать даже приложение, запущенное на самом устройстве шлюза IoT Edge. Однако другое устройство IoT Edge не может быть подчиненным по отношению к шлюзу IoT Edge.

Примечание.

Устройства Интернета вещей, зарегистрированные в Центре Интернета вещей, могут использовать двойники модуля для изоляции различных процессов, оборудования или функций на одном устройстве. Шлюзы IoT Edge поддерживают подключения подчиненных модулей с помощью проверки подлинности с симметричным ключом, но не с сертификатом X.509.

Чтобы подключить подчиненное устройство к шлюзу Azure IoT Edge, вам потребуются следующие два компонента:

  • Устройство или приложение, в настройках которого указана строка подключения устройств Центра Интернета вещей с данными для подключения к шлюзу.

    Этот шаг был выполнен в предыдущей статье: Проверка подлинности подчиненного устройства в Центре Интернета вещей Azure.

  • Устройство или приложение должно доверять сертификату корневого ЦС шлюза, чтобы проверять TLS-подключения к устройству шлюза.

    Этот шаг подробно описан ниже. Этот шаг можно выполнить одним из двух способов: установить сертификат ЦС в хранилище сертификатов операционной системы или (только для некоторых языков) добавить в приложения ссылку на сертификат с помощью пакетов SDK для Azure IoT.

Основные сведения о TLS и сертификатах

При создании безопасного подключения между подчиненными устройствами и IoT Edge возникают такие же трудности, как и при любом обмене данными через Интернет в режиме "клиент — сервер". Клиент и сервер безопасно обмениваются данными через Интернет по протоколу TLS. Протокол TLS основан на конструкциях стандарта инфраструктуры открытых ключей (PKI), называемых сертификатами. Протокол TLS является довольно распространенным и предназначен для широкого спектра тем, относящихся к защите двух конечных точек. В этом разделе перечислены основные понятия, относящиеся к безопасному подключению устройств к шлюзу IoT Edge.

Когда клиент подключается к серверу, сервер предоставляет ему цепочку сертификатов сервера. Такая цепочка обычно состоит из сертификата корневого ЦС, одного или нескольких сертификатов промежуточных ЦС, и сертификата самого сервера. Клиент устанавливает отношения доверия с сервером, криптографически проверяя всю цепочку сертификатов сервера. Процесс проверки цепочки сертификатов сервера на клиенте называется проверкой цепочки сервера. Клиент ждет, что сервер докажет наличие закрытого ключа, связанного с сертификатом сервера, в рамках процесса, который называется доказательством владения. Сочетание проверки цепочки сервера и доказательства владения называется проверкой подлинности сервера. Чтобы проверить цепочку сертификатов сервера, клиенту нужна копия сертификата корневого ЦС, который использовался для создания (выдачи) этого сертификата сервера. Обычно браузеры при подключении к веб-сайтам используют предварительно настроенный набор часто используемых сертификатов ЦС, оптимизируя работу клиента.

Когда устройство подключается к Центру Интернета вещей, оно выполняет роль клиента облачной службы, а служба Центра Интернета вещей представляет собой сервер. Облачная служба Центра Интернета вещей поддерживается сертификатом корневого ЦС с именем Baltimore CyberTrust Root, который является общедоступным и широко распространенным. Так как сертификат ЦС для Центра Интернета вещей уже установлен на большинстве устройств, во многих реализациях TLS (OpenSSL, Schannel, LibreSSL) он автоматически используется для проверки сертификата сервера. Возможна ситуация, когда устройство успешно подключается к Центру Интернета вещей, но при попытке подключения к шлюзу IoT Edge возникают проблемы.

Когда устройство подключается к шлюзу IoT Edge, подчиненное устройство выполняет роль клиента, а устройство шлюза представляет собой сервер. Azure IoT Edge позволяет по своему усмотрению создавать любые цепочки сертификатов шлюза. Вы можете использовать сертификат общедоступного ЦС, например Baltimore, или самозаверяющий сертификат внутреннего корневого ЦС. Сертификаты общедоступных ЦС часто предоставляются за плату, что делает их использование более оправданным для рабочих сценариев. Самозаверяющие сертификаты удобны для разработки и тестирования. Если вы используете демонстрационные сертификаты, это самозаверяющие сертификаты корневого ЦС.

Если вы используете для шлюза IoT Edge самозаверяющий корневой сертификат, он должен быть установлен или предоставлен для всех подчиненных устройств, которые будут подключаться к этому шлюзу.

Установка сертификата шлюза

Дополнительные сведения о сертификатах IoT Edge и некоторых ограничениях для рабочей среды см. в статье Сведения об использовании сертификатов Azure IoT Edge.

Предоставление сертификата корневого ЦС

Чтобы проверить сертификаты устройства шлюза, подчиненному устройству требуется собственная копия сертификата корневого ЦС. Если вы использовали скрипты, предоставленные в репозитории git IoT Edge, для создания тестовых сертификатов, сертификат корневого ЦС называется azure-iot-test-only.root.ca.cert.pem. Если вы еще не сделали это в рамках других этапов подготовки подчиненных устройств, переместите этот файл сертификата в любой каталог на подчиненном устройстве. Для перемещения файлов сертификатов можно использовать службу, например Azure Key Vault, или функцию, такую как протокол защищенного копирования.

Установка сертификатов в операционной системе

Когда сертификат корневого ЦС появится на подчиненном устройстве, необходимо убедиться, что приложения, подключающиеся к шлюзу, имеют доступ к сертификату.

Установка сертификата корневого ЦС в хранилище сертификатов операционной системы обычно позволяет большинству приложений использовать сертификат корневого ЦС. Но есть и некоторые исключения, например: приложения NodeJS используют не хранилище сертификатов ОС, а внутреннее хранилище сертификатов среды выполнения Node. Если вы не можете установить сертификат на уровне операционной системы, перейдите к разделу Использование сертификатов с пакетами SDK для Интернета вещей Azure.

Ubuntu

Команды из следующего примера устанавливают сертификат ЦС на узле под управлением ОС Ubuntu. В этом примере предполагается, что вы используете сертификат azure-iot-test-only.root.ca.cert.pem из статей, указанных в предварительных требованиях, и этот сертификат вы скопировали в локальное расположение на подчиненном устройстве.

sudo cp <path>/azure-iot-test-only.root.ca.cert.pem /usr/local/share/ca-certificates/azure-iot-test-only.root.ca.cert.pem.crt
sudo update-ca-certificates

Должно отобразиться следующее сообщение: "Updating certificates in /etc/ssl/certs... 1 added, 0 removed; done."

Windows

В следующих шагах описано, как установить сертификат ЦС на узле под управлением ОС Windows. В этом примере предполагается, что вы используете сертификат azure-iot-test-only.root.ca.cert.pem из статей, указанных в предварительных требованиях, и этот сертификат вы скопировали в локальное расположение на подчиненном устройстве.

Сертификаты можно установить с помощью Import-Certificate в PowerShell в качестве администратора:

import-certificate  <file path>\azure-iot-test-only.root.ca.cert.pem -certstorelocation cert:\LocalMachine\root

Сертификаты также можно установить с помощью служебной программы certlm:

  1. В меню "Пуск" выполните поиск по элементу Управление сертификатами компьютеров. Откроется служебная программа certlm.
  2. Выберите Сертификаты - локальный компьютер>Доверенные корневые центры сертификации.
  3. Щелкните правой кнопкой мыши пункт Сертификаты и выберите Все задачи>Импорт. Откроется мастер импорта сертификатов.
  4. Выполните действия по его подсказкам и импортируйте файл сертификата <path>/azure-iot-test-only.root.ca.cert.pem. По завершении вы увидите сообщение "Импорт выполнен".

Можно также установить сертификаты программным способом с помощью API .NET, как показано в примере кода для .NET далее в этой статье.

Обычно приложения используют стек TLS Schannel, предоставляемый ОС Windows, для безопасного подключения через TLS. При использовании Schannel требуется, чтобы все сертификаты были установлены в хранилище сертификатов Windows перед попыткой установить TLS-подключение.

Использование сертификатов с пакетами SDK для Azure IoT

В этом разделе на примере простых приложений описывается, как пакеты SDK для Azure IoT подключаются к устройству IoT Edge. Все эти примеры пытаются подключить клиент устройства и отправить сообщения телеметрии в шлюз, а затем закрывают подключение и завершают работу.

Прежде чем использовать примеры уровня приложения, следует подготовить следующие два компонента:

  • Строка подключения к Центру Интернета вещей подчиненного устройства, измененная для указания на устройство шлюза, и все сертификаты, необходимые для проверки подлинности подчиненного устройства в Центре Интернета вещей. Дополнительные сведения см. в разделе Проверка подлинности подчиненного устройства в Центре Интернета вещей.

  • Полный путь к сертификату корневого ЦС, который вы скопировали (сохранили) на подчиненное устройство.

    Например, <path>/azure-iot-test-only.root.ca.cert.pem.

NodeJS

Этот раздел содержит пример приложения для подключения клиентского устройства Azure IoT NodeJS к шлюзу IoT Edge. Для приложений Node.js необходимо установить сертификат корневого ЦС на уровне приложения, как показано здесь. Приложения Node.js не используют хранилище сертификатов системы.

  1. Получите пример файла edge_downstream_device.js из репозитория примеров использования пакета SDK для устройств Azure IoT для Node.js.
  2. Убедитесь, что у вас есть все необходимые компоненты для запуска примера (см. файл readme.md).
  3. В файле edge_downstream_device.js измените переменные connectionString и edge_ca_cert_path.
  4. В документации по пакету SDK вы найдете инструкции по запуску примера на конкретном устройстве.

Чтобы помочь вам разобраться в выполняемом примере, мы приводим ниже фрагмент кода, в котором клиентский пакет SDK считывает файл сертификата и использует его для создания безопасного TLS-подключения:

// Provide the Azure IoT device client via setOptions with the X509
// Edge root CA certificate that was used to setup the Edge runtime
var options = {
    ca : fs.readFileSync(edge_ca_cert_path, 'utf-8'),
};

.NET

Этот раздел знакомит вас с примером приложения для подключения клиентского устройства Azure IoT .NET к шлюзу IoT Edge. Приложения .NET могут автоматически применять любые сертификаты, установленные в хранилище сертификатов операционной системы на узлах Windows и Linux.

  1. Получите пример для EdgeDownstreamDevice из папки примеров .NET для IoT Edge.
  2. Убедитесь, что у вас есть все необходимые компоненты для запуска примера (см. файл readme.md).
  3. В файле Properties/launchSettings.json измените переменные DEVICE_CONNECTION_STRING и CA_CERTIFICATE_PATH. Если вы хотите использовать сертификат, установленный в хост-системе в хранилище доверенных сертификатов, оставьте значение этой переменной пустым.
  4. В документации по пакету SDK вы найдете инструкции по запуску примера на конкретном устройстве.

Чтобы установить доверенный сертификат в хранилище сертификатов программным способом с помощью приложения .NET, воспользуйтесь функцией InstallCACert(), которая определена в файле EdgeDownstreamDevice/Program.cs. Эта операция является идемпотентной, то есть ее можно безопасно выполнять несколько раз и получать одинаковые значения без побочных эффектов.

C

Этот раздел знакомит вас с примером приложения для подключения клиентского устройства Azure IoT C к шлюзу IoT Edge. Пакет SDK для C поддерживает множество библиотек TLS, включая OpenSSL, WolfSSL и Schannel. См. дополнительные сведения о пакете SDK для Azure IoT C.

  1. Получите приложение iotedge_downstream_device_sample из набора примеров использования пакета SDK для устройств Azure IoT для С.
  2. Убедитесь, что у вас есть все необходимые компоненты для запуска примера (см. файл readme.md).
  3. В файле iotedge_downstream_device_sample.c измените переменные connectionString и edge_ca_cert_path.
  4. В документации по пакету SDK вы найдете инструкции по запуску примера на конкретном устройстве.

Пакет SDK для устройств Azure IoT для C предоставляет возможность зарегистрировать сертификат ЦС при настройке клиента. Эта операция не устанавливает сертификат, а просто использует сертификат в текстовом формате прямо из памяти. Сохраненный сертификат предоставляется базовому стеку TLS при установке подключения.

(void)IoTHubDeviceClient_SetOption(device_handle, OPTION_TRUSTED_CERT, cert_string);

Примечание.

Метод регистрации сертификата ЦС при настройке клиента может измениться при использовании управляемого пакета или библиотеки. Например, для библиотеки на базе Arduino IDE потребуется добавление сертификата ЦС в массив сертификатов, определенный в глобальном файле certs.c, вместо использования операции IoTHubDeviceClient_LL_SetOption.

Если вы не используете OpenSSL или другую библиотеку TLS, на узлах Windows пакет SDK по умолчанию применяет Schannel. Чтобы обеспечить правильную работу Schannel, сертификат корневого ЦС для IoT Edge должен быть установлен в хранилище сертификатов Windows, а не с помощью операции IoTHubDeviceClient_SetOption.

Java

Этот раздел знакомит вас с примером приложения для подключения клиентского устройства Azure IoT Java к шлюзу IoT Edge.

  1. Получите пример Send-event из набора примеров использования пакета SDK для устройств Интернета Azure IoT для Java.
  2. Убедитесь, что у вас есть все необходимые компоненты для запуска примера (см. файл readme.md).
  3. В документации по пакету SDK вы найдете инструкции по запуску примера на конкретном устройстве.

Python

Этот раздел знакомит вас с примером приложения для подключения клиентского устройства Azure IoT Python к шлюзу IoT Edge.

  1. Получите пример send_message_downstream из набора примеров использования пакета SDK для устройств Azure IoT для Python.
  2. Задайте переменные среды IOTHUB_DEVICE_CONNECTION_STRING и IOTEDGE_ROOT_CA_CERT_PATH, как указано в комментариях к скрипту Python.
  3. В документации по пакету SDK вы найдете дополнительные инструкции по запуску примера на конкретном устройстве.

Тестирование подключения к шлюзу

Используйте этот пример команды на подчиненном устройстве, чтобы проверить возможность подключения к устройству шлюза:

openssl s_client -connect mygateway.contoso.com:8883 -CAfile <CERTDIR>/certs/azure-iot-test-only.root.ca.cert.pem -showcerts

Эта команда проверяет подключения через MQTTS (порт 8883). Если вы используете другой протокол, настройте команду по мере необходимости для AMQPS (5671) или HTTPS (443)

Выходные данные этой команды могут быть длинными, включая сведения обо всех сертификатах в цепочке. Если подключение установлено успешно, вы увидите строку, например Verification: OK или Verify return code: 0 (ok).

Проверка подключения шлюза

Устранение неполадок с подключением шлюза

Если нижнее устройство имеет периодические подключения к устройству шлюза, выполните следующие действия по разрешению.

  1. Имя узла шлюза в строке подключения совпадает со значением имени узла в файле конфигурации IoT Edge на устройстве шлюза?
  2. Имя узла шлюза разрешается в IP-адресе? Можно разрешить периодические подключения с помощью DNS или путем добавления записи файла узла на нижнем устройстве.
  3. Открыты ли порты связи в брандмауэре? Между подчиненным устройством и прозрачным шлюзом IoT Edge должна быть возможность взаимодействия по используемому протоколу (MQTTS:8883/AMQPS:5671/HTTPS:433).

Следующие шаги

Узнайте, как IoT Edge расширяет возможности автономной работы для подчиненных устройств.