Краткое руководство. Подготовка имитированного устройства с сертификатом X.509

В этом кратком руководстве вы создадите имитированное устройство на компьютере с Windows. Имитированное устройство настроено на использование аттестации сертификатов X.509 для проверки подлинности. После настройки устройства вы подготовите его к Центру Интернета вещей с помощью службы подготовки устройств Центр Интернета вещей Azure.

Если вы не знакомы с процессом подготовки, см. раздел Процесс подготовки. Кроме того, прежде чем продолжить, выполните инструкции по настройке службы "Подготовка устройств к добавлению в Центр Интернета вещей" на портале Azure.

В этом кратком руководстве показано решение для рабочей станции под управлением Windows. Но эти процедуры можно выполнить и в Linux. Пример Linux см. в руководстве по подготовке к географической задержке.

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

Приведенные ниже предварительные требования касаются среды разработки Windows. При использовании Linux или macOS ознакомьтесь с соответствующим разделом в статье Подготовка среды разработки из документации к пакету SDK.

  • Установите Visual Studio 2022 с включенной рабочей нагрузкой "Разработка компьютеров с помощью C++ ". Visual Studio 2015, Visual Studio 2017 и Visual Studio 19 также поддерживаются. При использовании Linux или macOS ознакомьтесь с соответствующим разделом в статье Подготовка среды разработки из документации к пакету SDK.

  • Установите последнюю систему сборки CMake. Убедитесь, что вы проверка параметр, который добавляет исполняемый файл CMake в путь.

    Внимание

    Перед установкой CMake важно установить на компьютер необходимые компоненты Visual Studio (Visual Studio и рабочую нагрузку "Разработка классических приложений на C++"). После установки компонентов и проверки загрузки установите систему сборки CMake. Кроме того, обратите внимание, что в предыдущих версиях системы сборки CMake нельзя создать файл решения, используемый в этой статье. Обязательно используйте последнюю версию CMake.

Приведенные ниже предварительные требования касаются среды разработки Windows. При использовании Linux или macOS ознакомьтесь с соответствующим разделом в статье Подготовка среды разработки из документации к пакету SDK.

  • Установите пакет SDK для .NET 6.0 или более поздней версии на компьютере под управлением Windows. Вы можете проверить установленную версию с помощью приведенной ниже команды.

    dotnet --info
    

Приведенные ниже предварительные требования касаются среды разработки Windows. При использовании Linux или macOS ознакомьтесь с соответствующим разделом в статье Подготовка среды разработки из документации к пакету SDK.

Приведенные ниже предварительные требования касаются среды разработки Windows.

Приведенные ниже предварительные требования касаются среды разработки Windows. При использовании Linux или macOS ознакомьтесь с соответствующим разделом в статье Подготовка среды разработки из документации к пакету SDK.

  • Установите последнюю версию Git. Обязательно добавьте GIT в переменные среды, доступные в командном окне. Последнюю версию средств git для установки, которая включает Git Bash (приложение командной строки для взаимодействия с локальным репозиторием GIT), можно найти на этой странице.

  • Убедитесь, что на компьютере установлен OpenSSL . В Windows установка Git включает установку OpenSSL. Вы можете получить доступ к OpenSSL из запроса Git Bash. Чтобы убедиться, что OpenSSL установлен, откройте запрос Git Bash и введите openssl version.

    Примечание.

    Если вы не знакомы с OpenSSL и уже установили его на компьютере с Windows, рекомендуется использовать OpenSSL из запроса Git Bash. Кроме того, можно скачать исходный код и создать OpenSSL. Дополнительные сведения см. на странице загрузки OpenSSL. Кроме того, вы можете скачать Предварительную версию OpenSSL из стороннего производителя. Дополнительные сведения см. вики-сайте OpenSSL. Корпорация Майкрософт не гарантирует допустимость пакетов, загруженных сторонними лицами. Если вы решили создать или скачать OpenSSL, убедитесь, что двоичный файл OpenSSL доступен в пути и OPENSSL_CNF что переменная среды задана в пути к файлу opensl.cnf .

  • Откройте командную строку Windows и строку Git Bash.

    В этом кратком руководстве предполагается, что вы используете компьютер Windows и установку OpenSSL, установленную в составе Git. Вы используете строку Git Bash для выдачи команд OpenSSL и командной строки Windows для всего остального. Если вы используете Linux, вы можете выдавать все команды из оболочки Bash.

Подготовка среды разработки

В этом разделе описана подготовка среды разработки, которая используется для создания пакета SDK для Azure IoT C. Пример кода пытается подготовить устройство во время последовательности загрузки устройства.

  1. Откройте веб-браузер и перейдите на страницу выпусков пакета SDK Интернета вещей Azure для C.

  2. Выберите вкладку Теги в верхней части страницы.

  3. Скопируйте имя тега для последнего выпуска пакета SDK Интернета вещей Azure для C.

  4. В командной строке Windows выполните следующие команды, чтобы клонировать последний выпуск пакета SDK для устройств Интернета вещей Azure для репозитория GitHub. Замените <release-tag> тегом, скопированным на предыдущем шаге, например: lts_01_2023

    git clone -b <release-tag> https://github.com/Azure/azure-iot-sdk-c.git
    cd azure-iot-sdk-c
    git submodule update --init
    

    Выполнение этой операции займет несколько минут.

  5. После завершения операции выполните следующие команды в каталоге azure-iot-sdk-c:

    mkdir cmake
    cd cmake
    
  6. В примере кода используется сертификат X.509, который обеспечивает аттестацию с помощью аутентификации на основе X.509. Выполните приведенную ниже команду, чтобы создать версию пакета SDK для используемой платформы разработки, которая включает в себя клиент подготовки устройств. Эта команда также создает решение Visual Studio для имитированного устройства в каталоге cmake.

    При указании пути, используемого в -Dhsm_custom_lib следующей команде, обязательно используйте абсолютный путь к библиотеке в созданном ранее каталоге cmake . Путь предполагает, что вы клонировали пакет SDK C в корневом каталоге диска C. Если вы использовали другой каталог, измените путь соответствующим образом.

    cmake -Duse_prov_client:BOOL=ON -Dhsm_custom_lib=c:/azure-iot-sdk-c/cmake/provisioning_client/samples/custom_hsm_example/Debug/custom_hsm_example.lib ..
    

Совет

Если cmake компилятор C++ не обнаружен, при выполнении приведенной выше команды могут возникнуть ошибки сборки. В этом случае попробуйте, выполнить эту команду в командной строке Visual Studio.

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

    -- Building for: Visual Studio 17 2022
    -- Selecting Windows SDK version 10.0.19041.0 to target Windows 10.0.22000.
    -- The C compiler identification is MSVC 19.32.31329.0
    -- The CXX compiler identification is MSVC 19.32.31329.0
    
    ...
    
    -- Configuring done
    -- Generating done
    -- Build files have been written to: C:/azure-iot-sdk-c/cmake
    

В командной строке Windows клонируйте репозиторий Azure IoT SDK для C# GitHub с помощью следующей команды:

git clone https://github.com/Azure/azure-iot-sdk-csharp.git

В командной строке Windows клонируйте пакет SDK Интернета вещей Azure для Node.js репозитория GitHub с помощью следующей команды:

git clone https://github.com/Azure/azure-iot-sdk-node.git

В командной строке Windows клонируйте репозиторий Azure IoT Device SDK для Python GitHub с помощью следующей команды:

git clone -b v2 https://github.com/Azure/azure-iot-sdk-python.git --recursive

Примечание.

Примеры, используемые в этом руководстве, находятся в ветви версии 2 репозитория azure-iot-sdk-python. Версия 3 пакета SDK для Python доступна для использования в бета-версии.

  1. В командной строке Windows клонируйте репозиторий Azure IoT Samples для Java GitHub с помощью следующей команды:

    git clone https://github.com/Azure/azure-iot-sdk-java.git --recursive
    
  2. Перейдите в корневой каталог azure-iot-sdk-java и создайте проект для скачивания всех необходимых пакетов.

    cd azure-iot-sdk-java
    mvn install -DskipTests=true
    

Создание самозаверяющего сертификата для устройства X.509

В этом разделе описано, как создать самозаверяющий сертификат X.509 и закрытый ключ с помощью OpenSSL. Этот сертификат отправляется в экземпляр службы подготовки и проверяется службой.

Внимание

Используйте сертификаты, созданные с помощью OpenSSL, в этом кратком руководстве только для тестирования разработки. Не используйте эти сертификаты в рабочей среде. Срок действия этих сертификатов истекает через 30 дней и может содержать жестко закодированные пароли, например 1234. Дополнительные сведения о получении сертификатов, подходящих для использования в рабочей среде, см. в статье о получении сертификата ЦС X.509 в документации по Центр Интернета вещей Azure.

Выполните действия, описанные в этом разделе, в командной строке Git Bash.

  1. В командной строке Git Bash перейдите в каталог, в котором вы хотите создать сертификаты.

  2. Выполните следующую команду:

    winpty openssl req -outform PEM -x509 -sha256 -newkey rsa:4096 -keyout device-key.pem -out device-cert.pem -days 30 -extensions usr_cert -addext extendedKeyUsage=clientAuth -subj "//CN=my-x509-device"
    

    Внимание

    Добавлять к имени субъекта (//CN=my-x509-device) дополнительную косую черту нужно только для того, чтобы строка экранировалась с помощью Git на платформах Windows.

  3. При появлении запроса на ввод парольной фразы PEM используйте 1234.

  4. При запросе на ввод парольной фразы PEM для проверки повторно используйте парольную фразу 1234.

    Теперь файл сертификата открытого ключа (device-cert.pem) и файл закрытого ключа (device-key.pem) должен быть создан в каталоге, где вы выполнили openssl команду.

    Файл сертификата имеет общее имя субъекта (CN).my-x509-device Для регистрации на основе X.509 идентификатор регистрации имеет общее имя. Идентификатор регистрации — это строка без учета регистра буквенно-цифровых символов, а также специальные символы: '-', '.', '_'. ':' Последний символ должен быть буквенно-цифровым или дефисом ('-'). Общее имя должно соответствовать этому формату. DPS поддерживает идентификаторы регистрации до 128 символов; Однако максимальная длина общего имени субъекта в сертификате X.509 составляет 64 символа. Таким образом, идентификатор регистрации ограничен 64 символами при использовании сертификатов X.509.

  5. Файл сертификата закодирован в кодировке Base 64. Чтобы просмотреть общее имя субъекта (CN) и другие свойства файла сертификата, введите следующую команду:

    winpty openssl x509 -in device-cert.pem -text -noout
    
    Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            77:3e:1d:e4:7e:c8:40:14:08:c6:09:75:50:9c:1a:35:6e:19:52:e2
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = my-x509-device
        Validity
            Not Before: May  5 21:41:42 2022 GMT
            Not After : Jun  4 21:41:42 2022 GMT
        Subject: CN = my-x509-device
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (4096 bit)
                Modulus:
                    00:d2:94:37:d6:1b:f7:43:b4:21:c6:08:1a:d6:d7:
                    e6:40:44:4e:4d:24:41:6c:3e:8c:b2:2c:b0:23:29:
                    ...
                    23:6e:58:76:45:18:03:dc:2e:9d:3f:ac:a3:5c:1f:
                    9f:66:b0:05:d5:1c:fe:69:de:a9:09:13:28:c6:85:
                    0e:cd:53
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                63:C0:B5:93:BF:29:F8:57:F8:F9:26:44:70:6F:9B:A4:C7:E3:75:18
            X509v3 Authority Key Identifier:
                keyid:63:C0:B5:93:BF:29:F8:57:F8:F9:26:44:70:6F:9B:A4:C7:E3:75:18
    
            X509v3 Extended Key Usage:
                TLS Web Client Authentication
    Signature Algorithm: sha256WithRSAEncryption
         82:8a:98:f8:47:00:85:be:21:15:64:b9:22:b0:13:cc:9e:9a:
         ed:f5:93:b9:4b:57:0f:79:85:9d:89:47:69:95:65:5e:b3:b1:
         ...
         cc:b2:20:9a:b7:f2:5e:6b:81:a1:04:93:e9:2b:92:62:e0:1c:
         ac:d2:49:b9:36:d2:b0:21
    
  1. Для примера кода требуется закрытый ключ, который не зашифрован. Выполните следующую команду, чтобы создать незашифрованный закрытый ключ:

    winpty openssl rsa -in device-key.pem -out unencrypted-device-key.pem
    
  2. Когда будет предложено ввести парольную фразу для device-key.pem:, используйте ту же парольную фразу, 1234что и вы ранее.

Откройте запрос Git Bash. Вам потребуется позже в этом кратком руководстве.

Пример кода C# настроен для использования сертификатов X.509, хранящихся в файле, защищенном паролем PKCS#12 (certificate.pfx). Вам по-прежнему нужен файлdevice-cert.pem сертификата сертификата открытого ключа (PEM), который вы только что создали для создания отдельной записи регистрации далее в этом кратком руководстве.

  1. Чтобы создать форматированный файл PKCS12, ожидаемый примером, введите следующую команду:

    winpty openssl pkcs12 -inkey device-key.pem -in device-cert.pem -export -out certificate.pfx
    
  2. Когда будет предложено ввести парольную фразу для device-key.pem:, используйте ту же парольную фразу, 1234что и вы ранее.

  3. При запросе ввести пароль экспорта:используйте пароль 1234.

  4. При появлении запроса на проверку — введите пароль экспорта:используйте пароль 1234 еще раз.

    Теперь файл сертификата с форматированием PKCS12 (certificate.pfx) должен быть создан в каталоге, где вы выполнили openssl команду.

  5. Скопируйте форматированный файл сертификата PKCS12 в каталог проекта для примера подготовки устройств X.509. Указанный путь относится к расположению, где вы скачали пример репозитория.

    cp certificate.pfx ./azure-iot-sdk-csharp/provisioning/device/samples/"Getting Started"/X509Sample
    

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

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

    winpty openssl rsa -in device-key.pem -out unencrypted-device-key.pem
    
  2. Когда будет предложено ввести парольную фразу для device-key.pem:, используйте ту же парольную фразу, 1234что и вы ранее.

  3. Скопируйте сертификат устройства и незашифрованный закрытый ключ в каталог проекта для примера подготовки устройств X.509. Указанный путь относится к расположению, в котором вы скачали пакет SDK.

    cp device-cert.pem ./azure-iot-sdk-node/provisioning/device/samples
    cp unencrypted-device-key.pem ./azure-iot-sdk-node/provisioning/device/samples
    

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

  1. Скопируйте сертификат устройства и закрытый ключ в каталог проекта для примера подготовки устройств X.509. Указанный путь относится к расположению, в котором вы скачали пакет SDK.

    cp device-cert.pem ./azure-iot-sdk-python/samples/async-hub-scenarios
    cp device-key.pem ./azure-iot-sdk-python/samples/async-hub-scenarios
    

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

  1. Для примера кода Java требуется закрытый ключ, который не зашифрован. Выполните следующую команду, чтобы создать незашифрованный закрытый ключ:

    winpty openssl pkey -in device-key.pem -out unencrypted-device-key.pem
    
  2. Когда будет предложено ввести парольную фразу для device-key.pem:, используйте ту же парольную фразу, 1234что и вы ранее.

Откройте запрос Git Bash. Вам потребуется позже в этом кратком руководстве.

Создание регистрации устройств

Служба подготовки устройств Интернета вещей Azure поддерживает два типа регистрации:

В этой статье описана отдельная регистрация для одного устройства, которое нужно подготовить с помощью центра Интернета вещей.

  1. Войдите на портал Azure и перейдите к своему экземпляру службы подготовки устройств.

  2. Выберите "Управление регистрацией" в разделе Параметры меню навигации.

  3. Перейдите на вкладку "Отдельные регистрации" , а затем нажмите кнопку "Добавить отдельную регистрацию".

    Снимок экрана: параметр добавления отдельной регистрации.

  4. На странице "Регистрация и подготовка" страницы "Добавление регистрации" укажите следующие сведения, чтобы настроить сведения о регистрации:

    Поле Description
    Аттестации Выберите сертификаты клиента X.509 в качестве механизма аттестации.
    Параметры сертификата X.509 Отправьте один или два сертификата, которые будут использоваться для проверки устройства для этой регистрации.
    Состояние подготовки Установите флажок "Включить эту регистрацию", если вы хотите, чтобы эта регистрация была доступна для подготовки устройства. Если вы хотите отключить регистрацию проверка это поле. Этот параметр можно изменить позже.
    Политика повторной подготовки Выберите политику повторной подготовки, которая отражает способ обработки устройств, запрашивающих повторную подготовку. Дополнительные сведения см. в разделе "Политики повторной подготовки".
  5. Нажмите кнопку Далее: Центры Интернета вещей.

  6. На вкладке Центров Интернета вещей на странице "Добавление регистрации" укажите следующие сведения, чтобы определить, какие центры Интернета вещей могут подготавливать устройства для:

    Поле Description
    Целевые центры Интернета вещей Выберите один или несколько связанных центров Интернета вещей или добавьте новую ссылку на Центр Интернета вещей. Дополнительные сведения о связывании центров Интернета вещей с экземпляром DPS см. в статье "Как связать центры Интернета вещей и управлять ими".
    Политика выделения Если выбрано несколько связанных центров Интернета вещей, выберите способ назначения устройств разным центрам. Дополнительные сведения о политиках выделения см. в статье "Использование политик выделения".

    Если выбран только один связанный центр Интернета вещей, рекомендуется использовать политику равномерного распределения .
  7. Нажмите кнопку "Далее": параметры устройства

  8. На вкладке "Параметры устройства" на странице "Добавление регистрации " укажите следующие сведения, чтобы определить, как будут настроены недавно подготовленные устройства:

    Поле Description
    Идентификатор устройства Укажите идентификатор устройства, который будет назначен подготовленному устройству в Центр Интернета вещей. Если идентификатор устройства не указан, будет использоваться идентификатор регистрации.
    IoT Edge Проверьте включение IoT Edge на подготовленных устройствах, если подготовленное устройство будет запускать Azure IoT Edge. Не проверка это поле, если эта регистрация используется для устройства с поддержкой IoT Edge.
    Теги устройств Используйте это текстовое поле для предоставления тегов, которые необходимо применить к двойнику устройства подготовленного устройства.
    Требуемые свойства Используйте это текстовое поле для предоставления необходимых свойств, которые необходимо применить к двойнику устройства подготовленного устройства.

    См. общие сведения о двойниках устройств и их использовании в Центре Интернета вещей.

  9. По завершении выберите Next: Отзыв и создание.

  10. На вкладке "Просмотр и создание " проверьте все значения и нажмите кнопку "Создать".

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

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

В этом разделе вы используете запрос Git Bash и интегрированную среду разработки Visual Studio.

Настройка кода подготовки устройства

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

  1. На портале Azure выберите вкладку Обзор службы подготовки устройств.

  2. Скопируйте значение параметра Область идентификатора.

    Снимок экрана: идентификатор область на портал Azure.

  3. Запустите Visual Studio и откройте новый файл решения, созданный в каталоге cmake, который вы создали в корне репозитория Git azure-iot-sdk-c. Файл решения называется azure_iot_sdks.sln.

  4. В Обозреватель решений для Visual Studio перейдите к Provision_Samples prov_dev_client_sample >> исходным файлам и откройте файл prov_dev_client_sample.c.

  5. Найдите константу и замените id_scope значение области идентификатора , скопированное на шаге 2.

    static const char* id_scope = "0ne00000A0A";
    
  6. Найдите определение функции main() в том же файле. Убедитесь, что для переменной hsm_type задано SECURE_DEVICE_TYPE_X509значение .

    SECURE_DEVICE_TYPE hsm_type;
    //hsm_type = SECURE_DEVICE_TYPE_TPM;
    hsm_type = SECURE_DEVICE_TYPE_X509;
    //hsm_type = SECURE_DEVICE_TYPE_SYMMETRIC_KEY;
    
  7. Сохранение изменений.

  8. Щелкните правой кнопкой мыши проект prov_dev_client_sample и выберите "Задать в качестве запускаемого проекта".

Настройка кода заглушки настраиваемого модуля HSM

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

Чтобы обновить пользовательский код заглушки HSM, чтобы имитировать удостоверение устройства с идентификатором my-x509-device:

  1. В Обозреватель решений для Visual Studio перейдите к Provision_Samples custom_hsm_example >> исходным файлам и откройте файл custom_hsm_example.c.

  2. Обновите строковое значение строковой COMMON_NAME константы с помощью общего имени, используемого при создании сертификата устройства. my-x509-device

    static const char* const COMMON_NAME = "my-x509-device";
    
  3. Обновите строковое значение CERTIFICATE константной строки с помощью сертификата устройства, device-cert.pem, созданного ранее.

    Синтаксис текста сертификата в примере должен соответствовать следующему шаблону без дополнительных пробелов или анализа, выполненных Visual Studio.

    static const char* const CERTIFICATE = "-----BEGIN CERTIFICATE-----\n"
    "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n"
        ...
    "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n"
    "-----END CERTIFICATE-----";        
    

    Обновление этого строкового значения вручную может быть подвержено ошибке. Чтобы создать правильный синтаксис, можно скопировать и вставить следующую команду в строку Git Bash и нажать клавишу ВВОД. Эта команда создает синтаксис для значения строковой CERTIFICATE константы и записывает его в выходные данные.

    sed -e 's/^/"/;$ !s/$/""\\n"/;$ s/$/"/' device-cert.pem
    

    Скопируйте и вставьте текст выходного сертификата для значения константы.

  4. Обновите строковое значение PRIVATE_KEY константы с незашифрованным закрытым ключом для сертификата устройства, незашифрованным-device-key.pem.

    Синтаксис текста закрытого ключа должен соответствовать следующему шаблону без дополнительных пробелов или анализа, выполненных Visual Studio.

    static const char* const PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----\n"
    "MIIJJwIBAAKCAgEAtjvKQjIhp0EE1PoADL1rfF/W6v4vlAzOSifKSQsaPeebqg8U\n"
        ...
    "X7fi9OZ26QpnkS5QjjPTYI/wwn0J9YAwNfKSlNeXTJDfJ+KpjXBcvaLxeBQbQhij\n"
    "-----END RSA PRIVATE KEY-----";
    

    Обновление этого строкового значения вручную может быть подвержено ошибке. Чтобы создать правильный синтаксис, можно скопировать и вставить следующую команду в строку Git Bash и нажать клавишу ВВОД. Эта команда создает синтаксис для значения строковой PRIVATE_KEY константы и записывает его в выходные данные.

    sed -e 's/^/"/;$ !s/$/""\\n"/;$ s/$/"/' unencrypted-device-key.pem
    

    Скопируйте и вставьте текст закрытого ключа вывода для значения константы.

  5. Сохранение изменений.

  6. Щелкните правой кнопкой мыши проект custom_hsm_-_example и выберите "Сборка".

    Внимание

    Перед сборкой остальной части решения в следующем разделе необходимо создать проект custom_hsm_example.

Запуск примера

  1. В меню Visual Studio выберите Отладка>Запуск без отладки, чтобы запустить решение. Если вам будет предложено перестроить проект, нажмите кнопку "Да ", чтобы перестроить проект перед запуском.

    Ниже приведен пример успешной загрузки имитированного устройства my-x509-device и подключения к службе подготовки. Устройство назначается центру Интернета вещей и зарегистрировано:

    Provisioning API Version: 1.8.0
    
    Registering Device
    
    Provisioning Status: PROV_DEVICE_REG_STATUS_CONNECTED
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    
    Registration Information received from service: contoso-iot-hub-2.azure-devices.net, deviceId: my-x509-device
    Press enter key to exit:
    

В этом разделе вы используете командную строку Windows.

  1. На портале Azure выберите вкладку Обзор службы подготовки устройств.

  2. Скопируйте значение параметра Область идентификатора.

    Снимок экрана: идентификатор область на портал Azure.

  3. В командной строке Windows перейдите в каталог X509Sample. Этот каталог находится в каталоге .\azure-iot-sdk-csharp\provisioning\device\samples\get started\X509Sample вне каталога, где вы клонировали примеры на компьютере.

  4. Введите следующую команду, чтобы создать и запустить пример подготовки устройств X.509 (замените <IDScope> значение областью идентификатора, скопированной в предыдущем разделе. Файл сертификата по умолчанию используется для ./certificate.pfx и запрашивает пароль PFX .

    dotnet run -- -s <IDScope>
    

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

    Примечание.

    При запуске приложения можно передать дополнительные параметры, чтобы изменить TransportType (-t) и GlobalDeviceEndpoint (-g).

    dotnet run -- -s 0ne00000A0A -c certificate.pfx -p 1234
    
  5. Устройство подключается к DPS и назначается центру Интернета вещей. Затем устройство отправляет сообщение телеметрии в Центр Интернета вещей.

    Loading the certificate...
    Enter the PFX password for certificate.pfx:
    ****
    Found certificate: A33DB11B8883DEE5B1690ACFEAAB69E8E928080B CN=my-x509-device; PrivateKey: True
    Using certificate A33DB11B8883DEE5B1690ACFEAAB69E8E928080B CN=my-x509-device
    Initializing the device provisioning client...
    Initialized for registration Id my-x509-device.
    Registering with the device provisioning service...
    Registration status: Assigned.
    Device my-x509-device registered to MyExampleHub.azure-devices.net.
    Creating X509 authentication for IoT Hub...
    Testing the provisioned device with IoT Hub...
    Sending a telemetry message...
    Finished.
    

В этом разделе вы используете командную строку Windows.

  1. На портале Azure выберите вкладку Обзор службы подготовки устройств.

  2. Скопируйте значение параметра Область идентификатора.

    Снимок экрана: идентификатор область на портал Azure.

  3. В командной строке Windows перейдите в пример каталога и установите пакеты, необходимые для примера. Показанный путь относится к расположению, в котором вы клонировали пакет SDK.

    cd .\azure-iot-sdk-node\provisioning\device\samples
    npm install
    

    В примере используются пять переменных среды для проверки подлинности и подготовки устройства Интернета вещей с помощью DPS. Ниже перечислены эти переменные среды:

    Имя переменной Description
    PROVISIONING_HOST Конечная точка, используемая для подключения к экземпляру DPS. В этом кратком руководстве используйте глобальную конечную точку global.azure-devices-provisioning.net.
    PROVISIONING_IDSCOPE Область идентификатора для экземпляра DPS.
    PROVISIONING_REGISTRATION_ID Идентификатор регистрации устройства. Он должен соответствовать общему имени субъекта в сертификате устройства.
    CERTIFICATE_FILE Путь к файлу сертификата устройства.
    KEY_FILE Путь к файлу закрытого ключа устройства.
  4. Добавьте переменные среды для глобальной конечной точки устройства и идентификатора область. Замените <id-scope> значение, скопированное на шаге 2.

    set PROVISIONING_HOST=global.azure-devices-provisioning.net
    set PROVISIONING_IDSCOPE=<id-scope>
    
  5. Задайте переменную среды для идентификатора регистрации устройства. Идентификатор регистрации устройства Интернета вещей должен совпадать с общим именем субъекта на сертификате устройства. Если вы выполнили действия, описанные в этом кратком руководстве по созданию самозаверяющего сертификата теста, my-x509-device это имя субъекта и идентификатор регистрации для устройства.

    set PROVISIONING_REGISTRATION_ID=my-x509-device
    
  6. Задайте переменные среды для сертификата устройства и (незашифрованных) файлов закрытого ключа устройства.

    set CERTIFICATE_FILE=.\device-cert.pem
    set KEY_FILE=.\unencrypted-device-key.pem
    
  7. Запустите пример и убедитесь, что устройство было подготовлено успешно.

    node register_x509.js
    

    Выходные данные должны соответствовать следующему примеру.

    registration succeeded
    assigned hub=contoso-hub-2.azure-devices.net
    deviceId=my-x509-device
    Client connected
    send status: MessageEnqueued
    

В этом разделе вы используете командную строку Windows.

  1. На портале Azure выберите вкладку Обзор службы подготовки устройств.

  2. Скопируйте значения параметров Область идентификатора и Глобальная конечная точка устройства.

    Снимок экрана: идентификатор область и глобальная конечная точка устройства на портал Azure.

  3. В командной строке Windows перейдите в каталог примера provision_x509.py . Показанный путь относится к расположению, в котором вы клонировали пакет SDK.

    cd ./azure-iot-sdk-python/samples/async-hub-scenarios
    

    В этом примере для аутентификации и подготовки устройства Интернета вещей с помощью DPS используются шесть переменных среды. Ниже перечислены эти переменные среды:

    Имя переменной Description
    PROVISIONING_HOST Глобальная конечная точка, используемая для подключения к экземпляру DPS.
    PROVISIONING_IDSCOPE Область идентификатора для экземпляра DPS.
    DPS_X509_REGISTRATION_ID Идентификатор регистрации устройства. Он также должен соответствовать имени субъекта на сертификате устройства.
    X509_CERT_FILE Путь к файлу сертификата устройства.
    X509_KEY_FILE Путь к файлу закрытого ключа сертификата устройства.
    PASS_PHRASE Парольная фраза, которая использовалась для шифрования файлов сертификата и закрытого ключа (1234).
  4. Добавьте переменные среды для глобальной конечной точки устройства и области идентификаторов.

    set PROVISIONING_HOST=global.azure-devices-provisioning.net
    set PROVISIONING_IDSCOPE=<ID scope for your DPS resource>
    
  5. Задайте переменную среды для идентификатора регистрации. Идентификатор регистрации для устройства Интернета вещей должен совпадать с именем субъекта в сертификате устройства. Если вы выполнили действия, описанные в этом кратком руководстве по созданию самозаверяющего сертификата теста, my-x509-device это имя субъекта и идентификатор регистрации для устройства.

    set DPS_X509_REGISTRATION_ID=my-x509-device
    
  6. Задайте переменные среды для файла сертификата, файла закрытого ключа и фразы.

    set X509_CERT_FILE=./device-cert.pem
    set X509_KEY_FILE=./device-key.pem
    set PASS_PHRASE=1234
    
  7. Просмотрите код в файле provision_x509.py. Если вы не используете Python версии 3.7 или более поздней, измените код упоминание здесь, чтобы заменить asyncio.run(main()) и сохранить изменения.

  8. Запустите образец. Пример подключается к DPS, который подготавливает устройство к Центру Интернета вещей. После подготовки устройства пример отправляет тестовые сообщения в Центр Интернета вещей.

    $ python azure-iot-sdk-python/samples/async-hub-scenarios/provision_x509.py
    RegistrationStage(RequestAndResponseOperation): Op will transition into polling after interval 2.  Setting timer.
    The complete registration result is
    my-x509-device
    TestHub12345.azure-devices.net
    initialAssignment
    null
    Will send telemetry from the provisioned device
    sending message #4
    sending message #7
    sending message #2
    sending message #8
    sending message #5
    sending message #9
    sending message #1
    sending message #6
    sending message #10
    sending message #3
    done sending message #4
    done sending message #7
    done sending message #2
    done sending message #8
    done sending message #5
    done sending message #9
    done sending message #1
    done sending message #6
    done sending message #10
    done sending message #3
    

В этом разделе вы используете командную строку Windows и строку Git Bash.

  1. На портале Azure выберите вкладку Обзор службы подготовки устройств.

  2. Скопируйте значения параметров Область идентификатора и Глобальная конечная точка устройства.

    Снимок экрана: идентификатор область и глобальная конечная точка устройства на портал Azure.

  3. В командной строке Windows перейдите к образцу папки проекта. Показанный путь относится к расположению, в котором клонирован пакет SDK

    cd .\azure-iot-sdk-java\provisioning\provisioning-device-client-samples\provisioning-X509-sample
    
  4. Введите службу подготовки и сведения об удостоверениях X.509 в примере кода. Эта информация используется во время подготовки для аттестации имитированного устройства до регистрации устройства.

    1. Откройте файл .\src\main\java\samples\com\microsoft\azure\sdk\iot\ProvisioningX509Sample.java в избранном редакторе.

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

      private static final String idScope = "[Your ID scope here]";
      private static final String globalEndpoint = "[Your Provisioning Service Global Endpoint here]";
      private static final ProvisioningDeviceClientTransportProtocol PROVISIONING_DEVICE_CLIENT_TRANSPORT_PROTOCOL = ProvisioningDeviceClientTransportProtocol.HTTPS;
      
      
    3. Обновите значение константной строки со значением leafPublicPem сертификата, device-cert.pem.

      Синтаксис текста сертификата должен соответствовать следующему шаблону без дополнительных пробелов или символов.

      private static final String leafPublicPem = "-----BEGIN CERTIFICATE-----\n" +
      "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n" +
          ...
      "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n" +
      "-----END CERTIFICATE-----";        
      

      Обновление этого строкового значения вручную может быть подвержено ошибке. Чтобы создать правильный синтаксис, можно скопировать и вставить следующую команду в строку Git Bash и нажать клавишу ВВОД. Эта команда создает синтаксис для значения строковой leafPublicPem константы и записывает его в выходные данные.

      sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' device-cert.pem
      

      Скопируйте и вставьте текст выходного сертификата для значения константы.

    4. Обновите строковое значение leafPrivateKey константы с незашифрованным закрытым ключом для сертификата устройства, незашифрованным-device-key.pem.

      Синтаксис текста закрытого ключа должен соответствовать следующему шаблону без дополнительных пробелов или символов.

      private static final String leafPrivateKey = "-----BEGIN PRIVATE KEY-----\n" +
      "MIIJJwIBAAKCAgEAtjvKQjIhp0EE1PoADL1rfF/W6v4vlAzOSifKSQsaPeebqg8U\n" +
          ...
      "X7fi9OZ26QpnkS5QjjPTYI/wwn0J9YAwNfKSlNeXTJDfJ+KpjXBcvaLxeBQbQhij\n" +
      "-----END PRIVATE KEY-----";
      

      Обновление этого строкового значения вручную может быть подвержено ошибке. Чтобы создать правильный синтаксис, можно скопировать и вставить следующую команду в строку Git Bash и нажать клавишу ВВОД. Эта команда создает синтаксис для значения строковой leafPrivateKey константы и записывает его в выходные данные.

      sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' unencrypted-device-key.pem
      

      Скопируйте и вставьте текст закрытого ключа вывода для значения константы.

    5. Сохранение изменений.

  5. Создайте пример и перейдите в папку target .

    mvn clean install
    cd target
    
  6. Сборка выводит файл .jar в папке target со следующим форматом файла: например: provisioning-x509-sample-{version}-with-deps.jarprovisioning-x509-sample-1.8.1-with-deps.jar Выполните файл .jar. Возможно, потребуется заменить версию в следующей команде.

    java -jar ./provisioning-x509-sample-1.8.1-with-deps.jar
    

    Пример подключается к DPS, который подготавливает устройство к Центру Интернета вещей. После подготовки устройства пример отправляет тестовые сообщения в Центр Интернета вещей.

    Starting...
    Beginning setup.
    WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance.
    2022-05-11 09:42:05,025 DEBUG (main) [com.microsoft.azure.sdk.iot.provisioning.device.ProvisioningDeviceClient] - Initialized a ProvisioningDeviceClient instance using SDK version 2.0.0
    2022-05-11 09:42:05,027 DEBUG (main) [com.microsoft.azure.sdk.iot.provisioning.device.ProvisioningDeviceClient] - Starting provisioning thread...
    Waiting for Provisioning Service to register
    2022-05-11 09:42:05,030 INFO (global.azure-devices-provisioning.net-6255a8ba-CxnPendingConnectionId-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Opening the connection to device provisioning service...
    2022-05-11 09:42:05,252 INFO (global.azure-devices-provisioning.net-6255a8ba-Cxn6255a8ba-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Connection to device provisioning service opened successfully, sending initial device registration message
    2022-05-11 09:42:05,286 INFO (global.azure-devices-provisioning.net-6255a8ba-Cxn6255a8ba-azure-iot-sdk-RegisterTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.RegisterTask] - Authenticating with device provisioning service using x509 certificates
    2022-05-11 09:42:06,083 INFO (global.azure-devices-provisioning.net-6255a8ba-Cxn6255a8ba-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Waiting for device provisioning service to provision this device...
    2022-05-11 09:42:06,083 INFO (global.azure-devices-provisioning.net-6255a8ba-Cxn6255a8ba-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Current provisioning status: ASSIGNING
    Waiting for Provisioning Service to register
    2022-05-11 09:42:15,685 INFO (global.azure-devices-provisioning.net-6255a8ba-Cxn6255a8ba-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Device provisioning service assigned the device successfully
    IotHUb Uri : MyExampleHub.azure-devices.net
    Device ID : java-device-01
    2022-05-11 09:42:25,057 INFO (main) [com.microsoft.azure.sdk.iot.device.transport.ExponentialBackoffWithJitter] - NOTE: A new instance of ExponentialBackoffWithJitter has been created with the following properties. Retry Count: 2147483647, Min Backoff Interval: 100, Max Backoff Interval: 10000, Max Time Between Retries: 100, Fast Retry Enabled: true
    2022-05-11 09:42:25,080 INFO (main) [com.microsoft.azure.sdk.iot.device.transport.ExponentialBackoffWithJitter] - NOTE: A new instance of ExponentialBackoffWithJitter has been created with the following properties. Retry Count: 2147483647, Min Backoff Interval: 100, Max Backoff Interval: 10000, Max Time Between Retries: 100, Fast Retry Enabled: true
    2022-05-11 09:42:25,087 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Initialized a DeviceClient instance using SDK version 2.0.3
    2022-05-11 09:42:25,129 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - Opening MQTT connection...
    2022-05-11 09:42:25,150 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT CONNECT packet...
    2022-05-11 09:42:25,982 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT CONNECT packet was acknowledged
    2022-05-11 09:42:25,983 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT SUBSCRIBE packet for topic devices/java-device-01/messages/devicebound/#
    2022-05-11 09:42:26,068 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT SUBSCRIBE packet for topic devices/java-device-01/messages/devicebound/# was acknowledged
    2022-05-11 09:42:26,068 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - MQTT connection opened successfully
    2022-05-11 09:42:26,070 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - The connection to the IoT Hub has been established
    2022-05-11 09:42:26,071 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Updating transport status to new status CONNECTED with reason CONNECTION_OK
    2022-05-11 09:42:26,071 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceIO] - Starting worker threads
    2022-05-11 09:42:26,073 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Invoking connection status callbacks with new status details
    2022-05-11 09:42:26,074 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Client connection opened successfully
    2022-05-11 09:42:26,075 INFO (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Device client opened successfully
    Sending message from device to IoT Hub...
    2022-05-11 09:42:26,077 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Message was queued to be sent later ( Message details: Correlation Id [54d9c6b5-3da9-49fe-9343-caa6864f9a02] Message Id [28069a3d-f6be-4274-a48b-1ee539524eeb] )
    Press any key to exit...
    2022-05-11 09:42:26,079 DEBUG (MyExampleHub.azure-devices.net-java-device-01-ee6c362d-Cxn7a1fb819-e46d-4658-9b03-ca50c88c0440-azure-iot-sdk-IotHubSendTask) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Sending message ( Message details: Correlation Id [54d9c6b5-3da9-49fe-9343-caa6864f9a02] Message Id [28069a3d-f6be-4274-a48b-1ee539524eeb] )
    2022-05-11 09:42:26,422 DEBUG (MQTT Call: java-device-01) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - IotHub message was acknowledged. Checking if there is record of sending this message ( Message details: Correlation Id [54d9c6b5-3da9-49fe-9343-caa6864f9a02] Message Id [28069a3d-f6be-4274-a48b-1ee539524eeb] )
    2022-05-11 09:42:26,425 DEBUG (MyExampleHub.azure-devices.net-java-device-01-ee6c362d-Cxn7a1fb819-e46d-4658-9b03-ca50c88c0440-azure-iot-sdk-IotHubSendTask) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Invoking the callback function for sent message, IoT Hub responded to message ( Message details: Correlation Id [54d9c6b5-3da9-49fe-9343-caa6864f9a02] Message Id [28069a3d-f6be-4274-a48b-1ee539524eeb] ) with status OK
    Message sent!
    

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

Чтобы узнать, в каком центре Интернета вещей было подготовлено устройство, ознакомьтесь с сведениями о регистрации созданной ранее отдельной регистрации:

  1. В портал Azure перейдите в службу подготовки устройств.

  2. В меню Параметры выберите Управление регистрациями.

  3. Выберите Индивидуальные регистрации. Запись регистрации X.509, созданная ранее, my-x509-device, должна появиться в списке.

  4. Выберите запись регистрации. Центр Интернета вещей, которому было назначено устройство, и его идентификатор устройства отображается в разделе "Состояние регистрации".

Чтобы проверить устройство в Центре Интернета вещей, выполните следующие действия.

  1. В портал Azure перейдите в Центр Интернета вещей, которому было назначено ваше устройство.

  2. В меню управления устройствами выберите "Устройства".

  3. Если устройство было подготовлено успешно, его идентификатор устройства, my-x509-device, должен отображаться в списке с включенным набором состояния. Если устройство не отображается, нажмите кнопку "Обновить".

    Снимок экрана: устройство зарегистрировано в Центре Интернета вещей в портал Azure.

Внимание

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

Очистка ресурсов

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

Удаление регистрации устройства

  1. Закройте окно выходных данных примера клиентского устройства на компьютере.

  2. На портале Azure в меню слева выберите элемент Все ресурсы.

  3. Выберите службу Подготовки устройств.

  4. В меню Параметры выберите Управление регистрациями.

  5. Перейдите на вкладку "Отдельные регистрации ".

  6. Выберите поле проверка рядом с идентификатором регистрации устройства, зарегистрированного в этом кратком руководстве.

  7. В верхней части страницы выберите команду Удалить.

Удаление регистрации устройства из Центра Интернета вещей

  1. На портале Azure в меню слева выберите элемент Все ресурсы.

  2. Выберите нужный Центр Интернета вещей.

  3. В меню Обозреватели выберите Устройства Интернета вещей.

  4. Выберите поле проверка рядом с идентификатором устройства, зарегистрированного в этом кратком руководстве.

  5. В верхней части страницы выберите команду Удалить.

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

В этом кратком руководстве вы подготовили одно устройство в Центре Интернета вещей с помощью отдельной регистрации. Далее вы узнаете, как подготовить несколько устройств в нескольких центрах.