Руководство. Подготовка нескольких устройств X.509 с помощью групп регистрации

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

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

  • группы регистрации — используются для регистрации нескольких связанных устройств; В этом руководстве демонстрируется подготовка с группами регистрации.
  • Отдельные регистрации: используется для регистрации одного устройства.

Служба подготовки устройств Центр Интернета вещей Azure поддерживает три формы проверки подлинности для устройств подготовки:

  • Сертификаты X.509. В этом руководстве демонстрируется аттестация сертификатов X.509
  • Доверенный модуль платформы (TPM)
  • симметричные ключи;

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

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

  • Создание цепочки сертификатов для доверия для упорядочения набора устройств с помощью сертификатов X.509.
  • Создайте новую регистрацию группы, которая использует цепочку сертификатов.
  • Настройте среду разработки.
  • Подготовка устройств с помощью цепочки сертификатов с помощью примера кода в пакете SDK для устройств Интернета вещей Azure.

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

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

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

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

    Внимание

    Убедитесь, что предварительные требования Visual Studio (Visual Studio и рабочая нагрузка "Разработка компьютеров с помощью C++") устанавливаются на компьютере перед началом CMake установки. После установки компонентов и проверки загрузки установите систему сборки 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 в переменные среды, доступные в командном окне.

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

    Примечание.

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

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

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

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

  2. Скопируйте имя тега для последнего выпуска пакета SDK Для Интернета вещей Azure, например: lts_03_2024

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

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

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

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

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

    Замените <path абсолютным путем к клонированного пакета SDK для C.

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

    Совет

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

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

    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 ..
    -- 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 и клонируйте пакет SDK для устройств Интернета вещей Azure для репозитория GitHub для Python , выполнив следующую команду:

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 для репозитория 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 из трех сертификатов для тестирования каждого устройства с помощью этого руководства. Сертификаты имеют следующую иерархию.

Схема, показывающая связь корневых сертификатов C A, промежуточных C A и сертификатов устройств.

Корневой сертификат вы отправляете и проверяете корневой сертификат с помощью DPS. Эта проверка позволяет DPS доверять этому сертификату и проверять сертификаты, подписанные им.

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

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

Дополнительные сведения о цепочках сертификатов см. в разделе аттестации сертификатов X.509.

Настройка среды X.509 OpenSSL

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

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

  2. Создайте файл конфигурации OpenSSL с именем openssl_root_ca.cnf для корневого сертификата ЦС. Файлы конфигурации OpenSSL содержат политики и определения, используемые командами OpenSSL. Скопируйте и вставьте следующий текст в файл openssl_root_ca.cnf :

    # OpenSSL root CA configuration file.
    
    [ ca ]
    default_ca = CA_default
    
    [ CA_default ]
    # Directory and file locations.
    dir               = .
    certs             = $dir/certs
    crl_dir           = $dir/crl
    new_certs_dir     = $dir/newcerts
    database          = $dir/index.txt
    serial            = $dir/serial
    RANDFILE          = $dir/private/.rand
    
    # The root key and root certificate.
    private_key       = $dir/private/azure-iot-test-only.root.ca.key.pem
    certificate       = $dir/certs/azure-iot-test-only.root.ca.cert.pem
    
    # For certificate revocation lists.
    crlnumber         = $dir/crlnumber
    crl               = $dir/crl/azure-iot-test-only.intermediate.crl.pem
    crl_extensions    = crl_ext
    default_crl_days  = 30
    
    # SHA-1 is deprecated, so use SHA-2 instead.
    default_md        = sha256
    
    name_opt          = ca_default
    cert_opt          = ca_default
    default_days      = 375
    preserve          = no
    policy            = policy_loose
    
    [ policy_strict ]
    # The root CA should only sign intermediate certificates that match.
    countryName             = optional
    stateOrProvinceName     = optional
    organizationName        = optional
    organizationalUnitName  = optional
    commonName              = supplied
    emailAddress            = optional
    
    [ policy_loose ]
    # Allow the intermediate CA to sign a more diverse range of certificates.
    countryName             = optional
    stateOrProvinceName     = optional
    localityName            = optional
    organizationName        = optional
    organizationalUnitName  = optional
    commonName              = supplied
    emailAddress            = optional
    
    [ req ]
    default_bits        = 2048
    distinguished_name  = req_distinguished_name
    string_mask         = utf8only
    
    # SHA-1 is deprecated, so use SHA-2 instead.
    default_md          = sha256
    
    # Extension to add when the -x509 option is used.
    x509_extensions     = v3_ca
    
    [ req_distinguished_name ]
    # See <https://en.wikipedia.org/wiki/Certificate_signing_request>.
    countryName                     = Country Name (2 letter code)
    stateOrProvinceName             = State or Province Name
    localityName                    = Locality Name
    0.organizationName              = Organization Name
    organizationalUnitName          = Organizational Unit Name
    commonName                      = Common Name
    emailAddress                    = Email Address
    
    # Optionally, specify some defaults.
    countryName_default             = US
    stateOrProvinceName_default     = WA
    localityName_default            =
    0.organizationName_default      = My Organization
    organizationalUnitName_default  =
    emailAddress_default            =
    
    [ v3_ca ]
    # Extensions for a typical CA.
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:always,issuer
    basicConstraints = critical, CA:true
    keyUsage = critical, digitalSignature, cRLSign, keyCertSign
    
    [ v3_intermediate_ca ]
    # Extensions for a typical intermediate CA.
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:always,issuer
    basicConstraints = critical, CA:true
    keyUsage = critical, digitalSignature, cRLSign, keyCertSign
    
    [ usr_cert ]
    # Extensions for client certificates.
    basicConstraints = CA:FALSE
    nsComment = "OpenSSL Generated Client Certificate"
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer
    keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment
    extendedKeyUsage = clientAuth
    
    [ server_cert ]
    # Extensions for server certificates.
    basicConstraints = CA:FALSE
    nsComment = "OpenSSL Generated Server Certificate"
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer:always
    keyUsage = critical, digitalSignature, keyEncipherment
    extendedKeyUsage = serverAuth
    
    [ crl_ext ]
    # Extension for CRLs.
    authorityKeyIdentifier=keyid:always
    
    [ ocsp ]
    # Extension for OCSP signing certificates.
    basicConstraints = CA:FALSE
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer
    keyUsage = critical, digitalSignature
    extendedKeyUsage = critical, OCSPSigning
    
  3. Создайте файл конфигурации OpenSSL с именем openssl_device_intermediate_ca.cnf для использования для сертификатов промежуточных и устройств. Скопируйте и вставьте следующий текст в файл openssl_device_intermediate_ca.cnf :

    # OpenSSL root CA configuration file.
    
    [ ca ]
    default_ca = CA_default
    
    [ CA_default ]
    # Directory and file locations.
    dir               = .
    certs             = $dir/certs
    crl_dir           = $dir/crl
    new_certs_dir     = $dir/newcerts
    database          = $dir/index.txt
    serial            = $dir/serial
    RANDFILE          = $dir/private/.rand
    
    # The root key and root certificate.
    private_key       = $dir/private/azure-iot-test-only.intermediate.key.pem
    certificate       = $dir/certs/azure-iot-test-only.intermediate.cert.pem
    
    # For certificate revocation lists.
    crlnumber         = $dir/crlnumber
    crl               = $dir/crl/azure-iot-test-only.intermediate.crl.pem
    crl_extensions    = crl_ext
    default_crl_days  = 30
    
    # SHA-1 is deprecated, so use SHA-2 instead.
    default_md        = sha256
    
    name_opt          = ca_default
    cert_opt          = ca_default
    default_days      = 375
    preserve          = no
    policy            = policy_loose
    
    [ policy_strict ]
    # The root CA should only sign intermediate certificates that match.
    countryName             = optional
    stateOrProvinceName     = optional
    organizationName        = optional
    organizationalUnitName  = optional
    commonName              = supplied
    emailAddress            = optional
    
    [ policy_loose ]
    # Allow the intermediate CA to sign a more diverse range of certificates.
    countryName             = optional
    stateOrProvinceName     = optional
    localityName            = optional
    organizationName        = optional
    organizationalUnitName  = optional
    commonName              = supplied
    emailAddress            = optional
    
    [ req ]
    default_bits        = 2048
    distinguished_name  = req_distinguished_name
    string_mask         = utf8only
    
    # SHA-1 is deprecated, so use SHA-2 instead.
    default_md          = sha256
    
    # Extension to add when the -x509 option is used.
    x509_extensions     = v3_ca
    
    [ req_distinguished_name ]
    # See <https://en.wikipedia.org/wiki/Certificate_signing_request>.
    countryName                     = Country Name (2 letter code)
    stateOrProvinceName             = State or Province Name
    localityName                    = Locality Name
    0.organizationName              = Organization Name
    organizationalUnitName          = Organizational Unit Name
    commonName                      = Common Name
    emailAddress                    = Email Address
    
    # Optionally, specify some defaults.
    countryName_default             = US
    stateOrProvinceName_default     = WA
    localityName_default            =
    0.organizationName_default      = My Organization
    organizationalUnitName_default  =
    emailAddress_default            =
    
    [ v3_ca ]
    # Extensions for a typical CA.
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:always,issuer
    basicConstraints = critical, CA:true
    keyUsage = critical, digitalSignature, cRLSign, keyCertSign
    
    [ v3_intermediate_ca ]
    # Extensions for a typical intermediate CA.
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:always,issuer
    basicConstraints = critical, CA:true
    keyUsage = critical, digitalSignature, cRLSign, keyCertSign
    
    [ usr_cert ]
    # Extensions for client certificates.
    basicConstraints = CA:FALSE
    nsComment = "OpenSSL Generated Client Certificate"
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer
    keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment
    extendedKeyUsage = clientAuth
    
    [ server_cert ]
    # Extensions for server certificates.
    basicConstraints = CA:FALSE
    nsComment = "OpenSSL Generated Server Certificate"
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer:always
    keyUsage = critical, digitalSignature, keyEncipherment
    extendedKeyUsage = serverAuth
    
    [ crl_ext ]
    # Extension for CRLs.
    authorityKeyIdentifier=keyid:always
    
    [ ocsp ]
    # Extension for OCSP signing certificates.
    basicConstraints = CA:FALSE
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer
    keyUsage = critical, digitalSignature
    extendedKeyUsage = critical, OCSPSigning
    
  4. Создайте структуру каталогов, файл базы данных index.txt и сериализуемый серийный номер файла, которые используются командами OpenSSL в этом руководстве:

    mkdir certs csr newcerts private
    touch index.txt
    openssl rand -hex 16 > serial
    

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

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

  1. В терминале Git Bash создайте закрытый ключ корневого ЦС:

    openssl genrsa -aes256 -passout pass:1234 -out ./private/azure-iot-test-only.root.ca.key.pem 4096
    
  2. Создайте сертификат корневого ЦС:

    openssl req -new -x509 -config ./openssl_root_ca.cnf -passin pass:1234 -key ./private/azure-iot-test-only.root.ca.key.pem -subj '//CN=Azure IoT Hub CA Cert Test Only' -days 30 -sha256 -extensions v3_ca -out ./certs/azure-iot-test-only.root.ca.cert.pem
    

    Внимание

    Добавлять к имени субъекта (//CN=Azure IoT Hub CA Cert Test Only) дополнительную косую черту нужно только для того, чтобы строка экранировалась с помощью Git на платформах Windows. На платформах Linux укажите имя субъекта только с одной косой чертой (/CN=Azure IoT Hub CA Cert Test Only).

  3. Проверьте сертификат корневого ЦС:

    openssl x509 -noout -text -in ./certs/azure-iot-test-only.root.ca.cert.pem
    

    Обратите внимание, что издатель и тема являются корневым ЦС.

    Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number:
                1d:93:13:0e:54:07:95:1d:8c:57:4f:12:14:b9:5e:5f:15:c3:a9:d4
            Signature Algorithm: sha256WithRSAEncryption
            Issuer: CN = Azure IoT Hub CA Cert Test Only
            Validity
                Not Before: Jun 20 22:52:23 2022 GMT
                Not After : Jul 20 22:52:23 2022 GMT
            Subject: CN = Azure IoT Hub CA Cert Test Only
            Subject Public Key Info:
                Public Key Algorithm: rsaEncryption
                    RSA Public-Key: (4096 bit)
    

Создание промежуточного сертификата ЦС

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

  1. В терминале Git Bash создайте промежуточный закрытый ключ ЦС:

    openssl genrsa -aes256 -passout pass:1234 -out ./private/azure-iot-test-only.intermediate.key.pem 4096
    
  2. Создайте промежуточный запрос на подписывание сертификата ЦС (CSR):

    openssl req -new -sha256 -passin pass:1234 -config ./openssl_device_intermediate_ca.cnf -subj '//CN=Azure IoT Hub Intermediate Cert Test Only' -key ./private/azure-iot-test-only.intermediate.key.pem -out ./csr/azure-iot-test-only.intermediate.csr.pem
    

    Внимание

    Добавлять к имени субъекта (//CN=Azure IoT Hub Intermediate Cert Test Only) дополнительную косую черту нужно только для того, чтобы строка экранировалась с помощью Git на платформах Windows. На платформах Linux укажите имя субъекта с одной косой чертой (/CN=Azure IoT Hub Intermediate Cert Test Only).

  3. Подписыв промежуточный сертификат с помощью корневого сертификата ЦС

    openssl ca -batch -config ./openssl_root_ca.cnf -passin pass:1234 -extensions v3_intermediate_ca -days 30 -notext -md sha256 -in ./csr/azure-iot-test-only.intermediate.csr.pem -out ./certs/azure-iot-test-only.intermediate.cert.pem
    
  4. Проверьте промежуточный сертификат ЦС:

    openssl x509 -noout -text -in ./certs/azure-iot-test-only.intermediate.cert.pem
    

    Обратите внимание, что издатель является корневым ЦС, и субъект является промежуточным ЦС.

    Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number:
                d9:55:87:57:41:c8:4c:47:6c:ee:ba:83:5d:ae:db:39
            Signature Algorithm: sha256WithRSAEncryption
            Issuer: CN = Azure IoT Hub CA Cert Test Only
            Validity
                Not Before: Jun 20 22:54:01 2022 GMT
                Not After : Jul 20 22:54:01 2022 GMT
            Subject: CN = Azure IoT Hub Intermediate Cert Test Only
            Subject Public Key Info:
                Public Key Algorithm: rsaEncryption
                    RSA Public-Key: (4096 bit)
    

Создание сертификатов устройств

В этом разделе описано, как создать два сертификата устройства и их полные сертификаты цепочки. Полный сертификат цепочки содержит сертификат устройства, промежуточный сертификат ЦС и корневой сертификат ЦС. Устройство должно представить свой полный сертификат цепочки при регистрации в DPS.

  1. Создайте первый закрытый ключ устройства.

    openssl genrsa -out ./private/device-01.key.pem 4096
    
  2. Создайте CSR сертификата устройства.

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

    Общее имя субъекта задается с помощью -subj параметра. В следующей команде для общего имени задано значение device-01.

    openssl req -config ./openssl_device_intermediate_ca.cnf -key ./private/device-01.key.pem -subj '//CN=device-01' -new -sha256 -out ./csr/device-01.csr.pem
    

    Внимание

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

  3. Подписыв сертификат устройства.

    openssl ca -batch -config ./openssl_device_intermediate_ca.cnf -passin pass:1234 -extensions usr_cert -days 30 -notext -md sha256 -in ./csr/device-01.csr.pem -out ./certs/device-01.cert.pem
    
  4. Проверьте сертификат устройства:

    openssl x509 -noout -text -in ./certs/device-01.cert.pem
    

    Обратите внимание, что издатель является промежуточным ЦС, а субъектом является идентификатор регистрации устройства. device-01

    Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number:
                d9:55:87:57:41:c8:4c:47:6c:ee:ba:83:5d:ae:db:3a
            Signature Algorithm: sha256WithRSAEncryption
            Issuer: CN = Azure IoT Hub Intermediate Cert Test Only
            Validity
                Not Before: Jun 20 22:55:39 2022 GMT
                Not After : Jul 20 22:55:39 2022 GMT
            Subject: CN = device-01
            Subject Public Key Info:
                Public Key Algorithm: rsaEncryption
                    RSA Public-Key: (4096 bit)
    
  5. Устройство должно представить полную цепочку сертификатов при проверке подлинности с помощью DPS. Чтобы создать цепочку сертификатов, используйте следующую команду:

    cat ./certs/device-01.cert.pem ./certs/azure-iot-test-only.intermediate.cert.pem ./certs/azure-iot-test-only.root.ca.cert.pem > ./certs/device-01-full-chain.cert.pem
    
  6. Откройте файл цепочки сертификатов , /certs/device-01-full-chain.cert.pem в текстовом редакторе, чтобы проверить его. Текст цепочки сертификатов содержит полную цепочку всех трех сертификатов. Эта цепочка сертификатов используется далее в этом руководстве для подготовки device-01.

    Текст полной цепочки имеет следующий формат:

    -----BEGIN CERTIFICATE-----
        <Text for the device certificate includes public key>
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
        <Text for the intermediate certificate includes public key>
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
        <Text for the root certificate includes public key>
    -----END CERTIFICATE-----
    
  7. Чтобы создать закрытый ключ, сертификат X.509 и полный сертификат цепочки для второго устройства, скопируйте и вставьте этот скрипт в командную строку Git Bash. Чтобы создать сертификаты для дополнительных устройств, можно изменить переменную, объявленную registration_id в начале сценария.

    registration_id=device-02
    echo $registration_id
    openssl genrsa -out ./private/${registration_id}.key.pem 4096
    openssl req -config ./openssl_device_intermediate_ca.cnf -key ./private/${registration_id}.key.pem -subj "//CN=$registration_id" -new -sha256 -out ./csr/${registration_id}.csr.pem
    openssl ca -batch -config ./openssl_device_intermediate_ca.cnf -passin pass:1234 -extensions usr_cert -days 30 -notext -md sha256 -in ./csr/${registration_id}.csr.pem -out ./certs/${registration_id}.cert.pem
    cat ./certs/${registration_id}.cert.pem ./certs/azure-iot-test-only.intermediate.cert.pem ./certs/azure-iot-test-only.root.ca.cert.pem > ./certs/${registration_id}-full-chain.cert.pem
    

    Внимание

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

    Примечание.

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

    Предупреждение

    Текст сертификатов содержит только сведения об открытом ключе.

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

В остальной части этого руководства используются следующие файлы:

Сертификат Файл Description
сертификат корневого ЦС. certs/azure-iot-test-only.root.ca.cert.pem Отправлено в DPS и проверено.
промежуточный сертификат ЦС certs/azure-iot-test-only.intermediate.cert.pem Используется для создания группы регистрации в DPS.
закрытый ключ device-01 private/device-01.key.pem Используется устройством для проверки владения сертификатом устройства во время проверки подлинности с помощью DPS.
Сертификат полной цепочки device-01 certs/device-01-full-chain.cert.pem Представлено устройством для проверки подлинности и регистрации в DPS.
закрытый ключ device-02 private/device-02.key.pem Используется устройством для проверки владения сертификатом устройства во время проверки подлинности с помощью DPS.
Сертификат полной цепочки device-02 certs/device-02-full-chain.cert.pem Представлено устройством для проверки подлинности и регистрации в DPS.

Проверка принадлежности корневого сертификата

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

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

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

  3. Введите понятное отображаемое имя для сертификата. Перейдите к расположению файла certs/azure-iot-test-only.root.ca.cert.pemсертификата корневого ЦС. Выберите Отправить.

  4. Выберите поле, чтобы задать состояние сертификата для проверки при отправке.

    Снимок экрана: добавление корневого сертификата ЦС и состояние сертификата для проверки в выбранном поле отправки.

  5. Выберите Сохранить.

  6. Убедитесь, что сертификат отображается на вкладке сертификата с состоянием "Проверено".

    Снимок экрана: проверенный корневой сертификат C A в списке сертификатов.

Обновление хранилища сертификатов на устройствах с Windows

На устройствах с ОС, отличной от Windows, цепочку сертификатов можно передать из кода в качестве хранилища сертификатов.

На устройствах с Windows необходимо добавить сертификаты подписи (корневой и промежуточный) в хранилище сертификатов Windows. В противном случае сертификаты для подписи не будут перенесены в службу DPS по безопасному каналу, использующему протокол TLS.

Совет

Кроме того, можно использовать OpenSSL вместо безопасного канала (Schannel) с пакетом SDK для C. Дополнительные сведения об использовании OpenSSL в пакете SDK см. в этой статье.

Чтобы добавить сертификаты для подписи в хранилище сертификатов на устройствах с Windows, выполните следующие действия.

  1. В терминале Git Bash преобразуйте сертификаты .pfx подписи следующим образом.

    Сертификат корневого ЦС:

    openssl pkcs12 -inkey ./private/azure-iot-test-only.root.ca.key.pem -in ./certs/azure-iot-test-only.root.ca.cert.pem -export -passin pass:1234 -passout pass:1234 -out ./certs/root.pfx
    

    Промежуточный сертификат ЦС:

    openssl pkcs12 -inkey ./private/azure-iot-test-only.intermediate.key.pem -in ./certs/azure-iot-test-only.intermediate.cert.pem -export -passin pass:1234 -passout pass:1234 -out ./certs/intermediate.pfx
    
  2. Щелкните правой кнопкой мыши кнопку "Пуск Windows", а затем нажмите кнопку "Запустить". Введите certmgr.msc и нажмите кнопку "ОК ", чтобы запустить диспетчер сертификатов.

  3. В диспетчере сертификатов в разделе "Сертификаты — текущий пользователь" выберите доверенные корневые центры сертификации. Затем в меню выберите действие "Все>задачи>импорта".

  4. Выполните действия мастера импорта сертификатов для импорта root.pfx.

    • Выполните поиск файла обмена личной информацией (PFX).
    • Используйте 1234 в качестве пароля.
    • Поместите сертификат в хранилище сертификатов Доверенные корневые центры сертификации.
  5. Повторите эти действия диспетчера сертификатов для импорта intermediate.pfx.

    • Поместите сертификат в хранилище сертификатов Промежуточные центры сертификации.

Сертификаты для подписи теперь являются доверенными на устройстве с Windows, и в службу DPS может быть перенесена полная цепочка.

Создание группы регистрации

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

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

  3. В верхней части страницы выберите "Добавить группу регистрации".

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

    Поле Description
    Свидетельство Выберите промежуточные сертификаты X.509 в качестве механизма аттестации, если вы хотите передать промежуточные сертификаты, которые будут использоваться только для этой группы регистрации, или выберите сертификаты X.509, отправленные в эту службу подготовки устройств, если вы уже отправили промежуточные сертификаты.
    Параметры сертификата X.509 В зависимости от выбранного метода аттестации отправьте или выберите первичные и вторичные промежуточные сертификаты для этой группы регистрации.
    Имя группы Укажите имя группы устройств. Имя группы регистрации — это нечувствительная строка регистра (до 128 символов длиной) буквенно-цифровых символов, а также специальные символы: '-', '.', . '_'':' Последний символ должен быть буквенно-цифровым или дефисом ('-').
    Состояние подготовки Установите флажок "Включить эту регистрацию", если вы хотите, чтобы эта группа регистрации была доступна для подготовки устройств. Снимите этот флажок, если вы хотите, чтобы группа была отключена. При необходимости этот параметр можно изменить позже.
    Политика повторной подготовки Выберите политику повторной подготовки, которая отражает способ обработки устройств, запрашивающих повторную подготовку. Дополнительные сведения см. в разделе "Политики повторной подготовки"

    Снимок экрана: добавление группы регистрации для аттестации сертификатов X.509.

  5. Нажмите кнопку Далее: Центры Интернета вещей.

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

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

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

    Снимок экрана: подключение центров Интернета вещей к новой группе регистрации.

  7. Нажмите кнопку "Далее": параметры устройства

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  4. Найдите константу id_scope и замените ее значение ранее скопированным значением области идентификатора. Например:

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

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

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

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

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

Хотя оборудование HSM не требуется, рекомендуется защитить конфиденциальную информацию, например закрытый ключ сертификата. Если фактический модуль HSM вызывается примером, закрытый ключ не будет присутствовать в исходном коде. Размещение ключа в исходном коде предоставляет доступ к нему всем, кто может просмотреть код. Это делается только в этом руководстве, чтобы помочь в обучении.

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

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

  2. Замените строковое значение строковой константы COMMON_NAME общим именем, которое использовалось при создании сертификата устройства.

    static const char* const COMMON_NAME = "device-01";
    
  3. В терминале Git Bash выполните следующую команду, чтобы создать строку константы для сертификата устройства:

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

    Скопируйте выходные данные этой команды.

  4. Обновите строковое значение CERTIFICATE строки константы с помощью цепочки сертификатов, сохраненной в ./certs/device-01-full-chain.cert.pem после создания сертификатов. Используйте текст выходного сертификата из предыдущего шага для значения константы.

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

    // <Device/leaf cert>
    // <intermediates>
    // <root>
    static const char* const CERTIFICATE = "-----BEGIN CERTIFICATE-----\n"
    "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n"
        ...
    "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n"
    "-----END CERTIFICATE-----\n"
    "-----BEGIN CERTIFICATE-----\n"
    "MIIFPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQsFADAqMSgwJgYDVQQDDB9BenVy\n"
        ...
    "MTEyMjIxMzAzM1owNDEyMDAGA1UEAwwpQXp1cmUgSW9UIEh1YiBJbnRlcm1lZGlh\n"
    "-----END CERTIFICATE-----\n"
    "-----BEGIN CERTIFICATE-----\n"
    "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n"
        ...
    "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n"
    "-----END CERTIFICATE-----";        
    
  5. В Git Bash выполните следующую команду, чтобы создать строку константы для закрытого ключа устройства:

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

    Скопируйте выходные данные этой команды.

  6. Обновите строковое значение PRIVATE_KEY константы с закрытым ключом для сертификата устройства. Используйте выходной текст закрытого ключа из предыдущего шага для значения константы.

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

    static const char* const PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----\n"
    "MIIJJwIBAAKCAgEAtjvKQjIhp0EE1PoADL1rfF/W6v4vlAzOSifKSQsaPeebqg8U\n"
        ...
    "X7fi9OZ26QpnkS5QjjPTYI/wwn0J9YAwNfKSlNeXTJDfJ+KpjXBcvaLxeBQbQhij\n"
    "-----END RSA PRIVATE KEY-----";
    
  7. Сохранение изменений.

  8. Щелкните правой кнопкой мыши проект custom_hsm_example и выберите " Сборка".

    Внимание

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

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

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

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

    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-hub-2.azure-devices.net, deviceId: device-01
    Press enter key to exit:
    
  2. Повторите действия, описанные в разделе "Настройка пользовательского кода заглушки HSM" для второго устройства (device-02) и повторного запуска примера. Для этого устройства укажите следующие значения.

    Description Значение
    Общее имя "device-02"
    Полная цепочка сертификатов Создание текста с помощью ./certs/device-02-full-chain.cert.pem
    Закрытый ключ Создание текста с помощью ./private/device-02.key.pem

    Следующие выходные данные демонстрируют пример успешной загрузки имитированного устройства device-02 и его подключения к службе подготовки. Устройство назначено центру Интернета вещей и зарегистрировано.

    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-hub-2.azure-devices.net, deviceId: device-02
    Press enter key to exit:
    

Пример кода C# настроен для использования сертификатов X.509, хранящихся в файле, защищенном паролем PKCS#12 (PFX). Созданные ранее сертификаты цепочки находятся в формате PEM. Чтобы преобразовать полные сертификаты цепочки в формат PKCS#12, введите следующие команды в командной строке Git Bash из каталога, где ранее выполнялись команды OpenSSL.

  • device-01

    openssl pkcs12 -inkey ./private/device-01.key.pem -in ./certs/device-01-full-chain.cert.pem -export -passin pass:1234 -passout pass:1234 -out ./certs/device-01-full-chain.cert.pfx
    
  • device-02

    openssl pkcs12 -inkey ./private/device-02.key.pem -in ./certs/device-02-full-chain.cert.pem -export -passin pass:1234 -passout pass:1234 -out ./certs/device-02-full-chain.cert.pfx
    

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

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

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

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

  3. В командной строке Windows перейдите в каталог X509Sample . Этот каталог расположен в репозитории SDK, клонированного на предыдущем шаге: .\azure-iot-sdk-csharp\provisioning\device\samples\get started\X509Sample.

  4. Введите следующую команду, чтобы создать и запустить пример подготовки устройств X.509. Замените <id-scope> область идентификатора, скопированную из портал Azure. Замените <your-certificate-folder> путь к папке, в которой вы выполнили команды OpenSSL.

    dotnet run -- -s <id-scope> -c <your-certificate-folder>\certs\device-01-full-chain.cert.pfx -p 1234
    

    Устройство подключается к DPS и назначается центру Интернета вещей. Затем устройство отправляет сообщение телеметрии в Центр Интернета вещей. Выходные данные должны соответствовать следующему примеру.

    Loading the certificate...
    Found certificate: 3E5AA3C234B2032251F0135E810D75D38D2AA477 CN=Azure IoT Hub CA Cert Test Only; PrivateKey: False
    Found certificate: 81FE182C08D18941CDEEB33F53F8553BA2081E60 CN=Azure IoT Hub Intermediate Cert Test Only; PrivateKey: False
    Found certificate: 5BA1DB226D50EBB7A6A6071CED4143892855AE43 CN=device-01; PrivateKey: True
    Using certificate 5BA1DB226D50EBB7A6A6071CED4143892855AE43 CN=device-01
    Initializing the device provisioning client...
    Initialized for registration Id device-01.
    Registering with the device provisioning service...
    Registration status: Assigned.
    Device device-01 registered to contoso-hub-2.azure-devices.net.
    Creating X509 authentication for IoT Hub...
    Testing the provisioned device with IoT Hub...
    Sending a telemetry message...
    Finished.
    

    Примечание.

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

    Дополнительные параметры можно передать для изменения TransportType (-t) и GlobalDeviceEndpoint (-g). Полный список типов dotnet run -- --helpпараметров.

  5. Чтобы зарегистрировать второе устройство, повторно запустите пример с помощью полного сертификата цепочки.

    dotnet run -- -s <id-scope> -c <your-certificate-folder>\certs\device-02-full-chain.cert.pfx -p 1234
    

В следующих шагах используйте командную строку Windows.

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

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

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

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

    cd .\azure-iot-sdk-node\provisioning\device\samples
    npm install
    
  4. В папке подготовки\device\samples откройте register_x509.js и просмотрите код.

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

    var ProvisioningTransport = require('azure-iot-provisioning-device-mqtt').Mqtt;
    

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

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

    Метод ProvisioningDeviceClient.register() пытается зарегистрировать устройство.

  5. Добавьте переменные среды для глобальной конечной точки устройства и области идентификаторов. Замените <id-scope> значение, скопированное из портал Azure.

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

    set PROVISIONING_REGISTRATION_ID=device-01
    
  7. Задайте переменные среды для сертификата полной цепочки устройств и файлов закрытого ключа устройства, созданных ранее. Замените <your-certificate-folder> путь к папке, в которой вы выполнили команды OpenSSL.

    set CERTIFICATE_FILE=<your-certificate-folder>\certs\device-01-full-chain.cert.pem
    set KEY_FILE=<your-certificate-folder>\private\device-01.key.pem
    
  8. Запустите пример и убедитесь, что устройство было подготовлено успешно.

    node register_x509.js
    

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

    registration succeeded
    assigned hub=contoso-hub-2.azure-devices.net
    deviceId=device-01
    Client connected
    send status: MessageEnqueued
    
  9. Обновите переменные среды для второго устройства (device-02) в соответствии со следующей таблицей и снова запустите пример.

    Переменная среды Значение
    PROVISIONING_REGISTRATION_ID device-02
    CERTIFICATE_FILE <your-certificate-folder>\certs\device-02-full-chain.cert.pem
    KEY_FILE <your-certificate-folder>\private\device-02.key.pem

В следующих шагах используйте командную строку 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. В этом руководстве используйте глобальную конечную точку global.azure-devices-provisioning.net.
    PROVISIONING_IDSCOPE Область идентификатора для экземпляра DPS.
    DPS_X509_REGISTRATION_ID Идентификатор регистрации устройства. Он должен соответствовать общему имени субъекта в сертификате устройства.
    X509_CERT_FILE Путь к файлу сертификата полной цепочки устройства.
    X509_KEY_FILE Путь к файлу закрытого ключа сертификата устройства.
    PASS_PHRASE Парольная фраза, используемая для шифрования файла закрытого ключа (если используется). Не требуется для этого руководства.
  4. Добавьте переменные среды для глобальной конечной точки устройства и области идентификаторов. Для переменной области идентификатора используйте значение, скопированное из портал Azure.

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

    set DPS_X509_REGISTRATION_ID=device-01
    
  6. Задайте переменные среды для сертификата полной цепочки устройств и файлов закрытого ключа устройства, созданных ранее. Замените <your-certificate-folder> путь к папке, в которой вы выполнили команды OpenSSL.

    set X509_CERT_FILE=<your-certificate-folder>\certs\device-01-full-chain.cert.pem
    set X509_KEY_FILE=<your-certificate-folder>\private\device-01.key.pem
    
  7. Просмотрите код в файле provision_x509.py. Если вы не используете Python 3.7 или более поздней версии, внесите нужные изменения в код, чтобы заменить asyncio.run(main()).

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

    python provision_x509.py
    

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

    The complete registration result is
    device-01
    contoso-hub-2.azure-devices.net
    initialAssignment
    null
    Will send telemetry from the provisioned device
    sending message #1
    sending message #2
    sending message #3
    sending message #4
    sending message #5
    sending message #6
    sending message #7
    sending message #8
    sending message #9
    sending message #10
    done sending message #1
    done sending message #2
    done sending message #3
    done sending message #4
    done sending message #5
    done sending message #6
    done sending message #7
    done sending message #8
    done sending message #9
    done sending message #10
    
  9. Обновите переменные среды для второго устройства (device-02) в соответствии со следующей таблицей и снова запустите пример.

    Переменная среды Значение
    DPS_X509_REGISTRATION_ID device-02
    X509_CERT_FILE <your-certificate-folder>\certs\device-02-full-chain.cert.pem
    X509_KEY_FILE <your-certificate-folder>\private\device-02.key.pem

В следующих шагах вы используете командную строку 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. Обновите следующие значения. Для idScopeэтого используйте область идентификатора, скопированную ранее. Для глобальной конечной точки используйте глобальную конечную точку устройства. Эта конечная точка одинакова для каждого экземпляра global.azure-devices-provisioning.netDPS.

      private static final String idScope = "[Your ID scope here]";
      private static final String globalEndpoint = "[Your Provisioning Service Global Endpoint here]";
      
    3. Пример по умолчанию использует HTTPS в качестве транспортного протокола. Если вы хотите изменить протокол, закомментируйте следующую строку и раскомментируйте строку для протокола, который вы хотите использовать.

      private static final ProvisioningDeviceClientTransportProtocol PROVISIONING_DEVICE_CLIENT_TRANSPORT_PROTOCOL = ProvisioningDeviceClientTransportProtocol.HTTPS;
      
    4. Обновите значение константной строки со значением leafPublicPem сертификата устройства, device-01.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/$/"/' ./certs/device-01.cert.pem
      

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

    5. Обновите строковое значение 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/$/"/' ./private/device-01.key.pem
      

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

    6. Добавьте константную rootPublicPem строку со значением корневого сертификата ЦС, azure-iot-test-only.root.ca.cert.pem. Его можно добавить сразу после leafPrivateKey константы.

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

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

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

      sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' ./certs/azure-iot-test-only.root.ca.cert.pem
      

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

    7. Добавьте константную intermediatePublicPem строку со значением промежуточного сертификата ЦС azure-iot-test-only.intermediate.cert.pem. Его можно добавить сразу после предыдущей константы.

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

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

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

      sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' ./certs/azure-iot-test-only.intermediate.cert.pem
      

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

    8. Найдите следующие строки в методе main .

      // For group enrollment uncomment this line
      //signerCertificatePemList.add("<Your Signer/intermediate Certificate Here>");
      

      Добавьте эти две строки непосредственно под ними, чтобы добавить в цепочку подписывания промежуточные и корневые сертификаты ЦС. Цепочка подписывания должна включать всю цепочку сертификатов вплоть до сертификата, который вы проверили с помощью DPS.

      signerCertificatePemList.add(intermediatePublicPem);
      signerCertificatePemList.add(rootPublicPem);
      

      Примечание.

      Порядок добавления сертификатов подписи важен. Если этот пример изменился, образец завершится ошибкой.

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

  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-10-21 10:41:20,476 DEBUG (main) [com.microsoft.azure.sdk.iot.provisioning.device.ProvisioningDeviceClient] - Initialized a ProvisioningDeviceClient instance using SDK version 2.0.2
    2022-10-21 10:41:20,479 DEBUG (main) [com.microsoft.azure.sdk.iot.provisioning.device.ProvisioningDeviceClient] - Starting provisioning thread...
    Waiting for Provisioning Service to register
    2022-10-21 10:41:20,482 INFO (global.azure-devices-provisioning.net-4f8279ac-CxnPendingConnectionId-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Opening the connection to device provisioning service...
    2022-10-21 10:41:20,652 INFO (global.azure-devices-provisioning.net-4f8279ac-Cxn4f8279ac-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-10-21 10:41:20,680 INFO (global.azure-devices-provisioning.net-4f8279ac-Cxn4f8279ac-azure-iot-sdk-RegisterTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.RegisterTask] - Authenticating with device provisioning service using x509 certificates
    2022-10-21 10:41:21,603 INFO (global.azure-devices-provisioning.net-4f8279ac-Cxn4f8279ac-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Waiting for device provisioning service to provision this device...
    2022-10-21 10:41:21,605 INFO (global.azure-devices-provisioning.net-4f8279ac-Cxn4f8279ac-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Current provisioning status: ASSIGNING
    2022-10-21 10:41:24,868 INFO (global.azure-devices-provisioning.net-4f8279ac-Cxn4f8279ac-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Device provisioning service assigned the device successfully
    IotHUb Uri : contoso-hub-2.azure-devices.net
    Device ID : device-01
    2022-10-21 10:41:30,514 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-10-21 10:41:30,526 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-10-21 10:41:30,533 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Initialized a DeviceClient instance using SDK version 2.1.2
    2022-10-21 10:41:30,590 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - Opening MQTT connection...
    2022-10-21 10:41:30,625 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT CONNECT packet...
    2022-10-21 10:41:31,452 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT CONNECT packet was acknowledged
    2022-10-21 10:41:31,453 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT SUBSCRIBE packet for topic devices/device-01/messages/devicebound/#
    2022-10-21 10:41:31,523 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT SUBSCRIBE packet for topic devices/device-01/messages/devicebound/# was acknowledged
    2022-10-21 10:41:31,525 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - MQTT connection opened successfully
    2022-10-21 10:41:31,528 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - The connection to the IoT Hub has been established
    2022-10-21 10:41:31,531 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Updating transport status to new status CONNECTED with reason CONNECTION_OK
    2022-10-21 10:41:31,532 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceIO] - Starting worker threads
    2022-10-21 10:41:31,535 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Invoking connection status callbacks with new status details
    2022-10-21 10:41:31,536 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Client connection opened successfully
    2022-10-21 10:41:31,537 INFO (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Device client opened successfully
    Sending message from device to IoT Hub...
    2022-10-21 10:41:31,539 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Message was queued to be sent later ( Message details: Correlation Id [aaaa0000-bb11-2222-33cc-444444dddddd] Message Id [aaaa0000-bb11-2222-33cc-444444dddddd] )
    Press any key to exit...
    2022-10-21 10:41:31,540 DEBUG (contoso-hub-2.azure-devices.net-device-01-d7c67552-Cxn0bd73809-420e-46fe-91ee-942520b775db-azure-iot-sdk-IotHubSendTask) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Sending message ( Message details: Correlation Id [aaaa0000-bb11-2222-33cc-444444dddddd] Message Id [aaaa0000-bb11-2222-33cc-444444dddddd] )
    2022-10-21 10:41:31,844 DEBUG (MQTT Call: 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 [aaaa0000-bb11-2222-33cc-444444dddddd] Message Id [aaaa0000-bb11-2222-33cc-444444dddddd] )
    2022-10-21 10:41:31,846 DEBUG (contoso-hub-2.azure-devices.net-device-01-d7c67552-Cxn0bd73809-420e-46fe-91ee-942520b775db-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 [aaaa0000-bb11-2222-33cc-444444dddddd] Message Id [aaaa0000-bb11-2222-33cc-444444dddddd] ) with status OK
    Message sent!
    
  7. Обновите константы для второго устройства (device-02) в соответствии со следующей таблицей, перестройте и снова запустите пример.

    Константа Файл для использования
    leafPublicPem ./certs/device-02.cert.pem
    leafPrivateKey ./private/device-02.key.pem

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

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

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

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

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

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

    Снимок экрана: сведения о состоянии регистрации для группы регистрации на портал Azure.

  5. Вы можете выбрать одно из устройств, чтобы просмотреть дополнительные сведения об этом устройстве.

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

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

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

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

    Снимок экрана: устройства зарегистрированы в центре I O T в портал Azure.

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

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

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

Удаление группы регистрации

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

  2. Выберите экземпляр DPS.

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

  4. Перейдите на вкладку "Группы регистрации".

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

  6. На странице сведений о регистрации выберите "Сведения" рядом с состоянием регистрации. Установите флажок рядом с заголовком столбца идентификатора устройства, чтобы выбрать все записи регистрации для группы регистрации. Выберите "Удалить" в верхней части страницы, чтобы удалить записи регистрации.

    Внимание

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

  7. Вернитесь на страницу "Управление регистрацией" и убедитесь, что выбрана вкладка "Группы регистрации".

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

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

Удаление зарегистрированных сертификатов ЦС из DPS

  1. Выберите сертификаты из левого меню экземпляра DPS. Для каждого отправленного и проверенного в этом руководстве сертификата выберите сертификат и нажмите кнопку "Удалить " и подтвердите его удаление.

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

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

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

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

  4. Установите флажок рядом с идентификатором устройства устройств, зарегистрированных в этом руководстве. Например, device-01 и device-02.

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

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

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