Tutorial: Provisionar vários dispositivos X.509 usando grupos de registro

Neste tutorial, você aprenderá a provisionar grupos de dispositivos IoT que usam certificados X.509 para autenticação. Um exemplo de código de dispositivo do SDK do Azure IoT será executado no computador de desenvolvimento para simular o provisionamento de dispositivos X.509. Em dispositivos reais, o código do dispositivo seria implantado e executado no dispositivo IoT.

O Serviço de Provisionamento de Dispositivos no Hub IoT do Azure dá suporte a dois tipos de registros para provisionar dispositivos:

  • Grupos de registros: usados para inscrever vários dispositivos relacionados. Este tutorial demonstra o provisionamento com grupos de registro.
  • Registros individuais: usados para inscrever um único dispositivo.

O Serviço de Provisionamento de Dispositivos no Hub IoT do Azure dá suporte a três formas de autenticação para dispositivos de provisionamento:

  • Certificados X.509 – Este tutorial demonstra o atestado do certificado X.509
  • Trusted Platform Module (TPM)
  • Chaves simétricas

Em cenários de produção, um HSM (módulo de segurança de hardware) é usado para o armazenamento seguro baseado em hardware dos segredos do dispositivo. Um HSM pode ser usado com uma chave simétrica, um certificado X.509 ou um atestado do TPM para fornecer armazenamento seguro para os segredos. O armazenamento baseado em hardware dos segredos do dispositivo é recomendado para ajudar a proteger informações confidenciais, como a chave privada do certificado do dispositivo.

Neste tutorial, você concluirá os seguintes objetivos:

  • Criar uma cadeia de certificados de confiança para organizar um conjunto de dispositivos usando certificados X.509.
  • Criar um registro de grupo que usa a cadeia de certificados.
  • Configurar o ambiente de desenvolvimento.
  • Provisionar dispositivos usando a cadeia de certificados com o código de exemplo no SDK do dispositivo IoT do Azure.

Pré-requisitos

Os pré-requisitos a seguir são para um ambiente de desenvolvimento do Windows usado para simular os dispositivos. Para Linux ou macOS, confira a seção apropriada em Preparar seu ambiente de desenvolvimento na documentação do SDK.

  • Instale o Visual Studio 2022 com a carga de trabalho "Desenvolvimento para desktop com C++" habilitada. Também há suporte para o Visual Studio 2015, Visual Studio 2017 e o Visual Studio 19.

  • Instale o sistema de build CMake mais recente. Certifique-se de marcar a opção que adiciona o executável CMake ao seu caminho.

    Importante

    Confirme se os pré-requisitos do Visual Studio (o Visual Studio e a carga de trabalho “Desenvolvimento para Desktop com C++”) estão instalados no computador antes de iniciar a instalação do CMake. Após a instalação dos pré-requisitos e verificação do download, instale o sistema de compilação CMake. Além disso, esteja ciente de que as versões mais antigas do sistema de build CMake não geram o arquivo de solução usado neste tutorial. Use a versão mais recente do CMake.

Os pré-requisitos a seguir são para um ambiente de desenvolvimento do Windows. Para Linux ou macOS, confira a seção apropriada em Preparar seu ambiente de desenvolvimento na documentação do SDK.

  • Instale o SDK do .NET 6.0 ou posterior no computador baseado no Windows. Use o comando a seguir para verificar a versão.

    dotnet --info
    

Os pré-requisitos a seguir são para um ambiente de desenvolvimento do Windows. Para Linux ou macOS, confira a seção apropriada em Preparar seu ambiente de desenvolvimento na documentação do SDK.

Os pré-requisitos a seguir são para um ambiente de desenvolvimento do Windows.

Os pré-requisitos a seguir são para um ambiente de desenvolvimento do Windows. Para Linux ou macOS, confira a seção apropriada em Preparar seu ambiente de desenvolvimento na documentação do SDK.

  • Instale a versão mais recente do Git. Verifique se o Git foi adicionado às variáveis de ambiente que podem ser acessadas pela janela de comando.

  • Verifique se o OpenSSL está instalado no computador. No Windows, a instalação do Git inclui uma instalação do OpenSSL. É possível acessar o OpenSSL no prompt do Git Bash. Para verificar se o OpenSSL está instalado, abra um prompt do Git Bash e insira openssl version.

    Observação

    A menos que você esteja familiarizado com o OpenSSL e já o tenha instalado em seu computador Windows, recomendamos usar o OpenSSL no prompt do Git Bash. Como alternativa, você pode optar por baixar o código-fonte e compilar o OpenSSL. Se você optar por compilar ou baixar o OpenSSL, verifique se o binário OpenSSL está acessível no seu caminho e se a variável de ambiente OPENSSL_CNF está definida como o caminho do arquivo openssl.cnf.

Preparar seu ambiente de desenvolvimento

Nesta seção, você vai preparar um ambiente de desenvolvimento usado para criar o SDK do IoT do Azure para C. O SDK inclui o código de exemplo e as ferramentas usadas pelo provisionamento de dispositivos com o DPS.

  1. Em um navegador da Web, acesse a página de versão do SDK do Azure IoT para C.

  2. Copie o nome da marca para a versão mais recente do SDK de C de Azure IoT, por exemplo: lts_03_2024.

  3. Abra o prompt de comando do Windows e execute os seguintes comandos para clonar a última versão do repositório GitHub do SDK do dispositivo IoT do Azure para C. Substitua <release-tag> pela marca que você copiou na etapa anterior.

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

    Essa operação pode levar vários minutos para ser concluída.

  4. Quando a operação for concluída, execute os seguintes comandos no diretório azure-iot-sdk-c:

    mkdir cmake
    cd cmake
    
  5. O exemplo de código usa um certificado X.509 para fornecer comprovação por meio da autenticação X.509. Execute o comando a seguir para criar uma versão do SDK específica para sua plataforma de desenvolvimento que inclui o cliente de provisionamento de dispositivos. Uma solução do Visual Studio para o dispositivo simulado é gerada no diretório cmake.

    Substitua <path pelo caminho absoluto do SDK para C que você clonou.

    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 ..
    

    Dica

    Se cmake não encontrar o compilador do C++, você poderá obter erros de build ao executar o comando acima. Se isso acontecer, tente executar o comando no prompt de comando do Visual Studio.

  6. Quando o build tiver êxito, as últimas linhas da saída terão aparência semelhante à seguinte saída:

    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
    

Abra um prompt de comando do Windows e clone o repositório do GitHub SDK do IoT do Azure para C# usando o seguinte comando:

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

Abra um prompt de comando do Windows e clone o repositório do GitHub SDK do IoT do Azure para Node.js usando o seguinte comando:

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

Abra um prompt de comando do Windows e clone o repositório do GitHub SDK do dispositivo IoT do Azure para Python usando o seguinte comando:

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

Observação

Os exemplos usados neste tutorial estão na ramificação v2 do repositório azure-iot-sdk-python. A V3 do SDK do Python está disponível para uso na versão beta.

  1. Abra um prompt de comando do Windows e clone o repositório do GitHub Amostras do IoT do Azure para Java usando o seguinte comando:

    git clone https://github.com/Azure/azure-iot-sdk-java.git --recursive
    
  2. Acesse o diretório azure-iot-sdk-java raiz e crie o projeto para baixar todos os pacotes necessários.

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

Criar uma cadeia de certificados X.509

Nesta seção, você vai gerar uma cadeia de certificados X.509 de três certificados para testar cada dispositivo com este tutorial. Os certificados têm a hierarquia a seguir.

Diagrama que mostra a relação entre AC raiz, AC intermediária e certificados de dispositivos.

Certificado raiz: você carrega e verifica o certificado raiz com o DPS. Essa verificação permite que o DPS confie nesse certificado e verifique os certificados assinados por ele.

Certificado intermediário: é comum usar certificados intermediários para agrupar dispositivos por linhas de produtos, divisões da empresa ou outros critérios. Este tutorial usa uma cadeia de certificados com um certificado intermediário, mas em um cenário de produção você pode ter vários. O certificado intermediário nessa cadeia será assinado pelo certificado raiz. Esse certificado é fornecido ao grupo de registro criado no DPS. Essa configuração permite gerenciar um grupo inteiro de dispositivos que têm certificados de dispositivo assinados pelo mesmo certificado intermediário.

Certificados do dispositivo: o certificado de um dispositivo (às vezes chamado de certificado folha) é assinado pelo certificado intermediário e armazenado no dispositivo, junto com a respectiva chave privada. Idealmente, esses itens confidenciais seriam armazenados com segurança com um HSM. Vários certificados de dispositivo podem ser assinados pelo mesmo certificado intermediário. Cada dispositivo apresenta o certificado e a chave privada dele, juntamente com a cadeia de certificados ao tentar realizar o provisionamento.

Para obter mais informações sobre cadeias de certificados, confira Atestado de certificado X.509.

Configurar o ambiente X.509 OpenSSL

Nesta seção, você vai criar os arquivos de configuração do OpenSSL, a estrutura de diretório e outros arquivos usados pelos comandos do OpenSSL.

  1. Abra um prompt de comando do Git Bash e vá para uma pasta na qual você deseja gerar os certificados X.509 e as chaves para este tutorial.

  2. Crie um arquivo de configuração do OpenSSL chamado openssl_root_ca.cnf para o Certificado de Autoridade de Certificação raiz. Os arquivos de configuração OpenSSL contêm políticas e definições consumidas por comandos OpenSSL. Copie e cole o seguinte texto no arquivo 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. Crie um arquivo de configuração do OpenSSL chamado openssl_device_intermediate_ca.cnf a ser usado para certificados intermediários e de dispositivo. Copie e cole o seguinte texto no arquivo 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. Crie a estrutura de diretório, o arquivo de banco de dados index.txt e o arquivo de número de série serial usados pelos comandos do OpenSSL neste tutorial:

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

Criar um certificado de AC raiz

Execute os comandos a seguir para criar uma chave privada de AC raiz e um Certificado de Autoridade de Certificação raiz. Você usará esse certificado e a chave para assinar o certificado intermediário.

  1. No terminal do Git Bash, crie uma chave privada de AC raiz:

    openssl genrsa -aes256 -passout pass:1234 -out ./private/azure-iot-test-only.root.ca.key.pem 4096
    
  2. Crie um Certificado de Autoridade de Certificação raiz:

    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
    

    Importante

    A barra "/" extra fornecida para o nome da entidade (//CN=Azure IoT Hub CA Cert Test Only) só é necessária para escapar a cadeia de caracteres com o Git em plataformas Windows. Nas plataformas Linux, forneça o nome da entidade com apenas uma barra "/" (/CN=Azure IoT Hub CA Cert Test Only).

  3. Examine o Certificado de Autoridade de Certificação raiz:

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

    Observe que o Emissor e a Entidade são a AC raiz.

    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)
    

Criar um Certificado de Autoridade de Certificação intermediária

Execute os comandos a seguir para criar uma chave privada de AC intermediária e um Certificado de Autoridade de Certificação intermediária. Você usará esse certificado e a chave para assinar os certificados de dispositivo.

  1. No terminal do Git Bash, crie uma chave privada de AC intermediária:

    openssl genrsa -aes256 -passout pass:1234 -out ./private/azure-iot-test-only.intermediate.key.pem 4096
    
  2. Crie um CSR (solicitação de assinatura de certificado) da Autoridade de Certificação intermediária:

    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
    

    Importante

    A barra "/" extra fornecida para o nome da entidade (//CN=Azure IoT Hub Intermediate Cert Test Only) só é necessária para escapar a cadeia de caracteres com o Git em plataformas Windows. Nas plataformas Linux, forneça o nome da entidade com apenas uma barra "/" (/CN=Azure IoT Hub Intermediate Cert Test Only).

  3. Assine o certificado intermediário com o Certificado de Autoridade de Certificação raiz

    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. Examine o Certificado de Autoridade de Certificação intermediário:

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

    Observe que o Emissor é a AC raiz e a Entidade é a AC intermediária.

    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)
    

Criar certificados do dispositivo

Nesta seção, você criará dois certificados de dispositivo e seus certificados de cadeia completa. O certificado de cadeia completa contém o certificado do dispositivo, o Certificado de Autoridade de Certificação intermediário e o Certificado de Autoridade de Certificação raiz. O dispositivo precisa apresentar o certificado de cadeia completa ao se registrar no DPS.

  1. Crie a primeira chave privada do dispositivo.

    openssl genrsa -out ./private/device-01.key.pem 4096
    
  2. Crie a CSR do certificado de dispositivo.

    O CN (nome comum) da entidade do certificado de dispositivo precisa ser definido como a ID de registro usado pelo seu dispositivo para se registrar no DPS. A ID de registro é uma cadeia de caracteres alfanuméricos que não diferencia maiúsculas de minúsculas e caracteres especiais: '-', '.', '_' e ':'. O último caractere deve ser alfanumérico ou um traço ('-'). O nome comum deve aderir a esse formato. O DPS dá suporte a IDs de registro com até 128 caracteres; no entanto, o comprimento máximo do nome comum da entidade em um certificado X.509 é 64 caracteres. Portanto, a ID de registro é limitada a 64 caracteres ao usar certificados X.509. Para registros de grupo, a ID de registro também é usada como a identificação de dispositivo do Hub IoT.

    O nome comum da entidade é definido usando o parâmetro -subj. No comando a seguir, o nome comum é definido como 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
    

    Importante

    A barra "/" extra fornecida para o nome da entidade (//CN=device-01) só é necessária para escapar a cadeia de caracteres com o Git em plataformas Windows. Nas plataformas Linux, forneça o nome da entidade com apenas uma barra "/" (/CN=device-01).

  3. Assine o certificado do dispositivo.

    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. Examine o certificado do dispositivo:

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

    Observe que o Emissor é a AC raiz e a Entidade é a ID de registro do dispositivo, 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. O dispositivo precisa apresentar a cadeia de certificados completa quando se autenticar com o DPS. Use o seguinte comando para criar a cadeia de certificados:

    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. Abra o arquivo da cadeia de certificados, ./certs/device-01-full-chain.cert.pem, em um editor de texto para examiná-la. O texto da cadeia de certificados contém a cadeia completa de todos os três certificados. Você usará essa cadeia de certificados mais adiante neste tutorial para provisionar o device-01.

    O texto da cadeia completa tem o seguinte formato:

    -----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. Para criar a chave privada, o certificado X.509 e o certificado de cadeia completa para o segundo dispositivo, copie e cole este script no prompt de comando do Git Bash. Para criar certificados para mais dispositivos, você pode modificar a variável declarada registration_id no início do script.

    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
    

    Importante

    A barra "/" extra fornecida para o nome da entidade (//CN=$registration_id) só é necessária para escapar a cadeia de caracteres com o Git em plataformas Windows. Nas plataformas Linux, forneça o nome da entidade com apenas uma barra "/" (/CN=$registration_id).

    Observação

    Esse script usa a ID de registro como o nome de arquivo base para os arquivos de chave privada e de certificado. Se a sua ID de registro contiver caracteres que não são caracteres de nome de arquivo válidos, você precisará modificar o script adequadamente.

    Aviso

    O texto dos certificados contém apenas informações da chave pública.

    No entanto, o dispositivo também precisa ter acesso à chave privada do certificado do dispositivo. Isso é necessário porque o dispositivo precisa executar a verificação usando essa chave em runtime ao tentar realizar o provisionamento. A confidencialidade dessa chave é um dos principais motivos pelos quais recomendamos usar o armazenamento baseado em hardware em um HSM real para ajudar a proteger as chaves privadas.

Você usará os seguintes arquivos no restante deste tutorial:

Certificado Arquivo Descrição
Certificado de Autoridade de Certificação raiz. certs/azure-iot-test-only.root.ca.cert.pem Carregado no DPS e verificado.
Certificado de Autoridade de Certificação intermediário certs/azure-iot-test-only.intermediate.cert.pem Usado para criar um grupo de registro no DPS.
chave privada device-01 private/device-01.key.pem Usado pelo dispositivo para verificar a propriedade do certificado do dispositivo durante a autenticação com o DPS.
Certificado de cadeia completa device-01 certs/device-01-full-chain.cert.pem Apresentado pelo dispositivo para autenticar e registrar-se no DPS.
chave privada device-02 private/device-02.key.pem Usado pelo dispositivo para verificar a propriedade do certificado do dispositivo durante a autenticação com o DPS.
Certificado de cadeia completa device-02 certs/device-02-full-chain.cert.pem Apresentado pelo dispositivo para autenticar e registrar-se no DPS.

Verificar a propriedade do certificado raiz

Para que o DPS possa validar a cadeia de certificados do dispositivo durante a autenticação, você precisa carregar e verificar a propriedade do certificado de autoridade de certificação raiz. Para adicionar o Certificado de Autoridade de Certificação raiz à instância do DPS, siga estas etapas:

  1. No portal do Azure, navegue até sua instância do Serviço de Provisionamento de Dispositivos.

  2. Abra Certificados no menu à esquerda e selecione Adicionar para adicionar um novo certificado.

  3. Insira um nome de exibição fácil para o certificado. Navegue até a localização do arquivo do Certificado de Autoridade de Certificação raiz certs/azure-iot-test-only.root.ca.cert.pem. Escolha Carregar.

  4. Marque a caixa ao lado de Definir status do certificado como verificado no momento do upload.

    Captura de tela que mostra como adicionar o Certificado de Autoridade de Certificação raiz e definir o status do certificado como verificado na caixa de upload selecionada.

  5. Selecione Salvar.

  6. Verifique se o certificado é mostrado na guia do certificado com o status Verificado.

    Captura de tela que mostra o Certificado de Autoridade de Certificação raiz verificado na lista de certificados.

Atualizar o repositório de certificados em dispositivos baseados no Windows

Em dispositivos não Windows, você pode passar a cadeia de certificados por meio do código como o repositório de certificados.

Em dispositivos baseados no Windows, você precisará adicionar os certificados de autenticação (raiz e intermediário) a um repositório de certificados do Windows. Caso contrário, os certificados de autenticação não serão transportados para o DPS por um canal seguro com o protocolo TLS.

Dica

Também é possível usar o OpenSSL em vez de um Schannel (canal seguro) com o SDK C. Para obter mais informações sobre como usar o OpenSSL, confira Usar o OpenSSL no SDK.

Para adicionar os certificados de autenticação ao repositório de certificados em dispositivos baseados no Windows:

  1. No terminal do Git Bash, converta seus certificado de autenticação em .pfx, conforme mostrado a seguir.

    Certificado de AC Raiz:

    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
    

    Certificado de Autoridade de Certificação intermediário:

    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. Clique com o botão direito do mouse no botão Iniciar do Windows e selecione Executar. Insira certmgr.msc e selecione OK para iniciar o gerenciador de certificados.

  3. No gerenciador de certificados, em Certificados – Usuário Atual, selecione Autoridades de Certificação Raiz Confiáveis. Em seguida, no menu, selecione Ação>Todas as Tarefas>Importar.

  4. Siga as etapas do Assistente de Importação de Certificados para importar o root.pfx.

    • Lembre-se de pesquisar Troca de Informações Pessoais (.pfx)
    • Use 1234 como a senha.
    • Coloque o certificado no repositório de certificados Autoridades de Certificação Raiz Confiáveis.
  5. Repita essas etapas do gerenciador de certificados para importar o intermediate.pfx.

    • Coloque o certificado no repositório de certificados Autoridades de Certificação Intermediárias.

Os certificados de autenticação agora são confiáveis no dispositivo baseado no Windows, e a cadeia completa pode ser transportada para o DPS.

Criar um grupo de registro

  1. Entre no portal do Azure e navegue até instância do Serviço de Provisionamento de Dispositivos.

  2. Selecione Gerenciar registros na seção Configurações do menu de navegação.

  3. Na parte superior da página, selecione Adicionar grupo de registro.

  4. Na guia Registro + provisionamento da página Adicionar grupo de registro, forneça as seguintes informações para configurar os detalhes do grupo de registro:

    Campo Descrição
    Atestado Selecione certificados intermediários X.509 como o mecanismo de atestado se quiser carregar certificados intermediários a serem usados apenas para esse grupo de registro ou selecione certificados X.509 carregados neste Serviço de Provisionamento de Dispositivos se você já tiver carregado certificados intermediários.
    Configurações de certificado X.509 Dependendo do método de atestado escolhido, carregue ou selecione os certificados intermediários primário e secundário para esse grupo de registro.
    Nome do grupo Forneça um nome para o grupo de dispositivos. O nome do grupo de registro é uma cadeia de caracteres que não diferencia maiúsculas de minúsculas (até 128 caracteres) de caracteres alfanuméricos mais os caracteres especiais: '-', '.', '_', ':'. O último caractere deve ser alfanumérico ou um traço ('-').
    Status do provisionamento Marque a caixa Habilitar este registro se quiser que esse grupo de registro esteja disponível para provisionar dispositivos. Desmarque essa caixa se quiser que o grupo seja desabilitado. Você poderá alterar essa configuração mais tarde.
    Reprovisionar política Escolha uma política de reprovisionamento que reflita como você deseja que o DPS manipule os dispositivos que solicitam o reprovisionamento. Para obter mais informações, veja Políticas de reprovisionamento

    Captura de tela que mostra a adição de um grupo de registro para o atestado de certificado X.509.

  5. Selecione Avançar: Hubs IoT.

  6. Na guia hubs IoT da página Adicionar grupo de registro, forneça as seguintes informações para determinar para quais hubs IoT o grupo de registro pode provisionar dispositivos:

    Campo Descrição
    Hubs IoT de destino Selecione um ou mais dos hubs IoT vinculados ou adicione um novo link a um hub IoT. Para saber mais sobre como vincular hubs IoT à instância do DPS, confira Como vincular e gerenciar hubs IoT.
    Política de alocação Se você selecionou mais de um hub IoT vinculado, selecione como deseja atribuir dispositivos aos diferentes hubs. Para saber mais sobre políticas de alocação, confira Como usar políticas de alocação.

    Se você selecionou apenas um hub IoT vinculado, recomendamos usar a política de distribuição uniformemente ponderada.

    Captura de tela que mostra a conexão de hubs IoT ao novo grupo de registro.

  7. Selecione Avançar: Configurações do dispositivo

  8. Na guia Configurações do dispositivo da página Adicionar grupo de registro, forneça as seguintes informações para definir como os dispositivos provisionados recentemente serão configurados:

    Campo Descrição
    IoT Edge Marque a caixa Habilitar IoT Edge em dispositivos provisionados se todos os dispositivos provisionados por meio desse grupo executarão o Azure IoT Edge. Desmarque essa caixa se esse grupo for somente para dispositivos não habilitados para IoT Edge. Todos os dispositivos em um grupo serão habilitados para IoT Edge ou nenhum poderá ser.
    Marcas de dispositivo Use esta caixa de texto para fornecer as marcas que deseja aplicar aos dispositivos gêmeos dos dispositivos provisionados.
    Propriedades desejadas Use esta caixa de texto para fornecer as propriedades desejadas que você quer aplicar aos dispositivos gêmeos dos dispositivos provisionados.

    Para saber mais, veja Noções básicas e uso de dispositivos gêmeos no Hub IoT.

  9. Selecione Avançar: Revisar + criar.

  10. Na guia Examinar + criar, verifique todos os valores e selecione Criar.

Preparar e executar o código de provisionamento de dispositivos

Nesta seção, você atualizará o código de exemplo com informações da instância do Serviço de Provisionamento de Dispositivos. Se um dispositivo for autenticado, ele será atribuído a um hub IoT vinculado à instância do Serviço de Provisionamento de Dispositivos configurado nesta seção.

Nesta seção, você usa o prompt do Git Bash e o IDE do Visual Studio.

Configurar o código do dispositivo de provisionamento

Nesta seção, você atualizará o código de exemplo com informações da instância do Serviço de Provisionamento de Dispositivos.

  1. No portal do Azure, selecione a guia Visão Geral da sua instância do Serviço de Provisionamento de Dispositivos e anote o valor do Escopo da ID.

    Captura de tela que mostra o escopo da ID no painel de visão geral do DPS.

  2. Inicie o Visual Studio e abra o arquivo de solução criado no diretório cmake que você criou na raiz do repositório Git azure-iot-sdk-c. O arquivo de solução é chamado azure_iot_sdks.sln.

  3. No Gerenciador de Soluções para Visual Studio, acesse Provisioning_Samples > prov_dev_client_sample > Arquivos de Origem e abra prov_dev_client_sample.c.

  4. Localize a constante id_scope e substitua o valor pelo seu valor de Escopo de ID copiado anteriormente. Por exemplo:

    static const char* id_scope = "0ne00000A0A";
    
  5. Encontre a definição da função main() no mesmo arquivo. Verifique se a variável hsm_type está definida como SECURE_DEVICE_TYPE_X509 e se todas as outras linhas hsm_type foram comentadas. Por exemplo:

    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. Salve suas alterações.

  7. Clique com botão direito do mouse no projeto prov_dev_client_sample e selecione Definir como Projeto de Inicialização.

Configurar o código de stub do HSM personalizado

As especificidades de interação com o armazenamento baseado em hardware seguro real variam conforme o hardware do dispositivo. As cadeias de certificados usadas pelos dispositivos simulados neste tutorial serão embutidas no código de stub do HSM personalizado. Em um cenário do mundo real, a cadeia de certificados é armazenada no hardware do HSM real a fim de fornecer melhor segurança para as informações confidenciais. Depois, métodos semelhantes aos métodos de stub usados neste exemplo são implementados para ler os segredos desse armazenamento baseado em hardware.

Embora o hardware HSM não seja necessário, é recomendável proteger informações confidenciais, como a chave privada do certificado. Se um HSM real estivesse sendo chamado pelo exemplo, a chave privada não estaria presente no código-fonte. Ter essa chave no código-fonte a expõe a qualquer pessoa que possa ver o código. Isso só é feito neste tutorial para ajudar você a aprender.

Para atualizar o código de stub do HSM personalizado para simular a identidade do dispositivo com a ID device-01:

  1. No Gerenciador de Soluções para Visual Studio, acesse Provision_Samples > custom_hsm_example > Arquivos de Origem e abra custom_hsm_example.c.

  2. Atualize o valor de cadeia de caracteres da constante de cadeia de caracteres COMMON_NAME usando o nome comum usado ao gerar o certificado do dispositivo.

    static const char* const COMMON_NAME = "device-01";
    
  3. No terminal do Git Bash, execute o seguinte comando para gerar a constante de cadeia de caracteres para o certificado do dispositivo:

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

    Copie a saída desse comando.

  4. Atualize o valor da cadeia de caracteres constante CERTIFICATE usando a cadeia de certificados salva em ./certs/device-01-full-chain.cert.pem depois de gerar os certificados. Use o texto do certificado de saída da etapa anterior para o valor da constante.

    A sintaxe do texto do certificado precisa corresponder ao padrão a seguir sem nenhum espaço extra ou análise feita pelo 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. No Git Bash, execute o seguinte comando para gerar a constante de cadeia de caracteres para a chave privada do dispositivo:

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

    Copie a saída desse comando.

  6. Atualize o valor da constante PRIVATE_KEY com a chave privada do certificado do dispositivo. Use o texto da chave privada de saída da etapa anterior para o valor da constante.

    A sintaxe do texto da chave privada precisa corresponder ao padrão a seguir sem nenhum espaço extra ou análise feita pelo 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. Salve suas alterações.

  8. Clique com o botão direito do mouse no projeto custom_hsm_example e selecione Criar.

    Importante

    Compile o projeto custom_hsm_example antes de compilar o restante da solução na próxima seção.

Execute o exemplo

  1. No menu do Visual Studio, selecione Depurar>Iniciar sem depuração para executar a solução. Quando a recompilação do projeto for solicitada, selecione Sim para recompilar o projeto antes da execução.

    A saída a seguir é um exemplo da inicialização bem-sucedida do dispositivo simulado device-01 e da conexão dele com o serviço de provisionamento. O dispositivo foi atribuído a um hub IoT e registrado:

    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. Repita as etapas em Configurar o código de stub do HSM personalizado para seu segundo dispositivo (device-02) e execute o exemplo novamente. Use os seguintes valores para esse dispositivo:

    Descrição Valor
    Nome comum "device-02"
    Cadeia de certificados completa Gerar o texto usando ./certs/device-02-full-chain.cert.pem
    Chave privada Gerar o texto usando ./private/device-02.key.pem

    A saída a seguir é um exemplo da inicialização bem-sucedida do dispositivo simulado device-02 e da conexão dele com o serviço de provisionamento. O dispositivo foi atribuído a um hub IoT e registrado:

    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:
    

O código de exemplo C# está configurado para usar os certificados X.509 armazenados em um arquivo formatado em PKCS nº 12 protegido por senha (.pfx). Os certificados de cadeia completa criados anteriormente estão no formato PEM. Para converter os certificados de cadeia completa no formato PKCS nº 12, insira os comandos a seguir no prompt do Git Bash por meio do diretório em que você executou anteriormente os comandos do 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
    

No restante desta seção, use o prompt de comando do Windows.

  1. No portal do Azure, selecione a guia Visão Geral do seu serviço de Provisionamento de Dispositivos.

  2. Copie o valor de Escopo da ID.

    Captura de tela do escopo da ID no portal do Azure.

  3. No prompt de comando do Windows, mude para o diretório X509Sample. Esse diretório está localizado no repositório do SDK que você clonou em uma etapa anterior: .\azure-iot-sdk-csharp\provisioning\device\samples\getting started\X509Sample.

  4. Insira o comando a seguir para compilar e executar a amostra de provisionamento de dispositivos X.509. Substitua <id-scope> pelo Escopo da ID copiado do portal do Azure. Substitua <your-certificate-folder> pelo caminho para a pasta em que você executou os comandos do OpenSSL.

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

    O dispositivo se conectará ao DPS e receberá um Hub IoT. Depois, o dispositivo enviará uma mensagem de telemetria ao hub IoT. Você deverá ver uma saída semelhante ao seguinte exemplo:

    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.
    

    Observação

    Se você não especificar o certificado e a senha na linha de comando, o arquivo de certificado usará ./certificate.pfx como padrão e você precisará fornecer sua senha.

    Parâmetros adicionais podem ser transmitidos na execução do aplicativo para alterar o TransportType (-t) e o GlobalDeviceEndpoint (-g). Para ver a lista completa de parâmetros, digite dotnet run -- --help.

  5. Para registrar seu segundo dispositivo, execute novamente a amostra usando seu certificado de cadeia completa.

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

Nas etapas a seguir, use o prompt de comando do Windows.

  1. No portal do Azure, selecione a guia Visão Geral do seu serviço de Provisionamento de Dispositivos.

  2. Copie o valor de Escopo da ID.

    Captura de tela do escopo da ID no portal do Azure.

  3. No prompt de comando do Windows, vá para o diretório de exemplo e instale os pacotes necessários para o exemplo. O caminho mostrado é relativo ao local em que você clonou o SDK.

    cd .\azure-iot-sdk-node\provisioning\device\samples
    npm install
    
  4. Na pasta provisioning\device\samples, abra register_x509.js e analise o código.

    O exemplo é padrão usa MQTT como o protocolo de transporte. Se você quiser usar um protocolo diferente, comente a linha a seguir e remova a marca de comentário da linha para o protocolo apropriado.

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

    O exemplo usa cinco variáveis de ambiente para autenticar e provisionar um dispositivo IoT usando o DPS. Essas variáveis de ambiente são:

    Nome da variável Descrição
    PROVISIONING_HOST O ponto de extremidade a ser usado para se conectar à instância do DPS. Para este tutorial, use o ponto de extremidade global, global.azure-devices-provisioning.net.
    PROVISIONING_IDSCOPE O escopo da ID da instância do DPS.
    PROVISIONING_REGISTRATION_ID A ID do registro do dispositivo. Ele precisa corresponder ao nome comum da entidade no certificado do dispositivo.
    CERTIFICATE_FILE O caminho para o arquivo de certificado de cadeia completa do dispositivo.
    KEY_FILE O caminho para o arquivo de chave privada do certificado do dispositivo.

    O método ProvisioningDeviceClient.register() tenta registrar seu dispositivo.

  5. Adicione as variáveis de ambiente para o ponto de extremidade de dispositivo global e o escopo da ID. Substitua <id-scope> pelo valor copiado do portal do Azure.

    set PROVISIONING_HOST=global.azure-devices-provisioning.net
    set PROVISIONING_IDSCOPE=<id-scope>
    
  6. Defina a variável de ambiente para a ID de registro do dispositivo. A ID de registro do dispositivo IoT precisa corresponder ao nome comum da entidade no respectivo certificado de dispositivo. Neste tutorial, device-01 é o nome da entidade e a ID de registro do dispositivo.

    set PROVISIONING_REGISTRATION_ID=device-01
    
  7. Defina as variáveis de ambiente para o certificado de cadeia completa do dispositivo e os arquivos de chave privada do dispositivo gerados anteriormente. Substitua <your-certificate-folder> pelo caminho para a pasta em que você executou os comandos do 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. Execute o exemplo e verifique se o dispositivo foi provisionado com êxito.

    node register_x509.js
    

    Você deverá ver uma saída semelhante ao seguinte exemplo:

    registration succeeded
    assigned hub=contoso-hub-2.azure-devices.net
    deviceId=device-01
    Client connected
    send status: MessageEnqueued
    
  9. Atualize as variáveis de ambiente para o segundo dispositivo (device-02) de acordo com a tabela a seguir e execute a amostra novamente.

    Variável de ambiente Valor
    PROVISIONING_REGISTRATION_ID device-02
    CERTIFICATE_FILE <pasta-do-certificado>\certs\device-02-full-chain.cert.pem
    KEY_FILE <pasta-do-certificado>\private\device-02.key.pem

Nas etapas a seguir, use o prompt de comando do Windows.

  1. No portal do Azure, selecione a guia Visão Geral do seu serviço de Provisionamento de Dispositivos.

  2. Copie o Escopo da ID.

    Captura de tela do escopo da ID no portal do Azure.

  3. No prompt de comando do Windows, vá para o diretório do exemplo provision_x509.py. O caminho mostrado é relativo ao local em que você clonou o SDK.

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

    Esse exemplo usa seis variáveis de ambiente para autenticar e provisionar um dispositivo IoT usando o DPS. Essas variáveis de ambiente são:

    Nome da variável Descrição
    PROVISIONING_HOST O ponto de extremidade a ser usado para se conectar à instância do DPS. Para este tutorial, use o ponto de extremidade global, global.azure-devices-provisioning.net.
    PROVISIONING_IDSCOPE O escopo da ID da instância do DPS.
    DPS_X509_REGISTRATION_ID A ID do registro do dispositivo. Ele precisa corresponder ao nome comum da entidade no certificado do dispositivo.
    X509_CERT_FILE O caminho para o arquivo de certificado de cadeia completa do dispositivo.
    X509_KEY_FILE O caminho para o arquivo de chave privada do certificado do dispositivo.
    PASS_PHRASE A frase secreta usada para criptografar o arquivo de chave privada (se usado). Não necessário neste tutorial.
  4. Adicione as variáveis de ambiente para o ponto de extremidade de dispositivo global e o Escopo da ID. Para a variável de escopo da ID, use o valor copiado do portal do Azure.

    set PROVISIONING_HOST=global.azure-devices-provisioning.net
    set PROVISIONING_IDSCOPE=<ID scope for your DPS resource>
    
  5. Defina a variável de ambiente para a ID de registro do dispositivo. A ID de registro do dispositivo IoT precisa corresponder ao nome comum da entidade no respectivo certificado de dispositivo. Neste tutorial, device-01 é o nome da entidade e a ID de registro do dispositivo.

    set DPS_X509_REGISTRATION_ID=device-01
    
  6. Defina as variáveis de ambiente para o certificado de cadeia completa do dispositivo e os arquivos de chave privada do dispositivo gerados anteriormente. Substitua <your-certificate-folder> pelo caminho para a pasta em que você executou os comandos do 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. Examine o código para provision_x509.py. Se você não estiver usando o Python versão 3.7 ou posterior, realize a alteração de código mencionada aqui para substituir asyncio.run(main()).

  8. Execute o exemplo. O exemplo se conectará ao DPS, que provisionará o dispositivo em um hub IoT. Depois que o dispositivo for provisionado, o exemplo enviará algumas mensagens de teste para o hub IoT.

    python provision_x509.py
    

    Você deverá ver uma saída semelhante ao seguinte exemplo:

    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. Atualize as variáveis de ambiente para o segundo dispositivo (device-02) de acordo com a tabela a seguir e execute a amostra novamente.

    Variável de ambiente Valor
    DPS_X509_REGISTRATION_ID device-02
    X509_CERT_FILE <pasta-do-certificado>\certs\device-02-full-chain.cert.pem
    X509_KEY_FILE <pasta-do-certificado>\private\device-02.key.pem

Nas etapas a seguir, você usará o prompt de comando do Windows e o prompt do Git Bash.

  1. No portal do Azure, selecione a guia Visão Geral do seu serviço de Provisionamento de Dispositivos.

  2. Copie o Escopo da ID.

    Captura de tela do escopo da ID no portal do Azure.

  3. No prompt de comando do Windows, navegue até a pasta do projeto de exemplo. O caminho mostrado é relativo ao local em que você clonou o SDK

    cd .\azure-iot-sdk-java\provisioning\provisioning-device-client-samples\provisioning-X509-sample
    
  4. Insira as informações de identidade de X.509 e do serviço de provisionamento no código de exemplo. Isso é usado durante o provisionamento, para atestado do dispositivo simulado, antes do registro do dispositivo.

    1. Abra o arquivo .\src\main\java\samples\com\microsoft\azure\sdk\iot\ProvisioningX509Sample.java no seu editor favorito.

    2. Atualize os valores a seguir. Para idScope, use o Escopo da ID copiado anteriormente. Para o ponto de extremidade global, use o Ponto de extremidade do dispositivo global. Esse ponto de extremidade é o mesmo para todas as instâncias do DPS, global.azure-devices-provisioning.net.

      private static final String idScope = "[Your ID scope here]";
      private static final String globalEndpoint = "[Your Provisioning Service Global Endpoint here]";
      
    3. O exemplo usa o HTTPS como o protocolo de transporte padrão. Se você quiser alterar o protocolo, comente a linha a seguir e remova o comentário da linha do protocolo que deseja usar.

      private static final ProvisioningDeviceClientTransportProtocol PROVISIONING_DEVICE_CLIENT_TRANSPORT_PROTOCOL = ProvisioningDeviceClientTransportProtocol.HTTPS;
      
    4. Atualize o valor da cadeia de caracteres constante leafPublicPem com o certificado do dispositivo, device-01.cert.pem.

      A sintaxe do texto do certificado precisa corresponder ao padrão a seguir sem nenhum espaço ou caractere extra.

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

      Atualizar esse valor da cadeia de caracteres manualmente pode ser propenso a erros. Para gerar a sintaxe adequada, você pode copiar e colar o seguinte comando no prompt do Git Bash e pressionar ENTER. Esse comando vai gerar a sintaxe para o valor da constante da cadeia de caracteres leafPublicPem e gravá-la na saída.

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

      Copie e cole o texto do certificado de saída para o valor da constante.

    5. Atualize o valor da cadeia de caracteres da constante leafPrivateKey com a chave privada não criptografada para o certificado do dispositivo, unencrypted-device-key.pem.

      A sintaxe do texto da chave privada precisa corresponder ao padrão a seguir sem nenhum espaço ou caractere extra.

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

      Para gerar a sintaxe adequada, você pode copiar e colar o seguinte comando no prompt do Git Bash e pressionar ENTER. Esse comando vai gerar a sintaxe para o valor da constante da cadeia de caracteres leafPrivateKey e gravá-la na saída.

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

      Copie e cole o texto da chave privada de saída para o valor da constante.

    6. Adicione uma cadeia de caracteres constante rootPublicPem com o valor do Certificado de Autoridade de Certificação raiz, azure-iot-test-only.root.ca.cert.pem. Você pode adicioná-lo logo após a constante leafPrivateKey.

      A sintaxe do texto do certificado precisa corresponder ao padrão a seguir sem nenhum espaço ou caractere extra.

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

      Para gerar a sintaxe adequada, você pode copiar e colar o seguinte comando no prompt do Git Bash e pressionar ENTER. Esse comando vai gerar a sintaxe para o valor da constante da cadeia de caracteres rootPublicPem e gravá-la na saída.

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

      Copie e cole o texto do certificado de saída para o valor da constante.

    7. Adicione uma cadeia de caracteres constante intermediatePublicPem com o valor do Certificado de Autoridade de Certificação intermediário, azure-iot-test-only.intermediate.cert.pem. Você pode adicioná-lo logo após a constante anterior.

      A sintaxe do texto do certificado precisa corresponder ao padrão a seguir sem nenhum espaço ou caractere extra.

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

      Para gerar a sintaxe adequada, você pode copiar e colar o seguinte comando no prompt do Git Bash e pressionar ENTER. Esse comando vai gerar a sintaxe para o valor da constante da cadeia de caracteres intermediatePublicPem e gravá-la na saída.

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

      Copie e cole o texto do certificado de saída para o valor da constante.

    8. Encontre as linhas a seguir no método main.

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

      Adicione estas duas linhas diretamente abaixo delas para adicionar seus certificados de AC intermediários e raiz à cadeia de assinatura. Sua cadeia de assinatura deve incluir toda a cadeia de certificados, incluindo um certificado que você verificou com o DPS.

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

      Observação

      A ordem em que os certificados de autenticação são adicionados é importante. O exemplo falhará se isso for alterado.

    9. Salve suas alterações.

  5. Compile o exemplo e acesse a pasta target.

    mvn clean install
    cd target
    
  6. A compilação gera o arquivo .jar na pasta target com o seguinte formato de arquivo: provisioning-x509-sample-{version}-with-deps.jar; por exemplo: provisioning-x509-sample-1.8.1-with-deps.jar. Execute o arquivo .jar. Talvez seja necessário substituir a versão no comando a seguir.

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

    A amostra se conecta ao DPS, que provisiona o dispositivo a um hub IoT. Depois que o dispositivo for provisionado, o exemplo enviará algumas mensagens de teste para o hub IoT.

    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. Atualize as constantes do segundo dispositivo (device-02) de acordo com a tabela a seguir, recompile-o e execute a amostra novamente.

    Constante Arquivo a ser usado
    leafPublicPem ./certs/device-02.cert.pem
    leafPrivateKey ./private/device-02.key.pem

Confirmar o registro de provisionamento de dispositivos

Examine os registros do grupo de registro para ver os detalhes do registro de seus dispositivos:

  1. No Portal do Azure, vá até a sua instância do Serviço de Provisionamento de Dispositivos.

  2. No menu Configurações, selecione Gerenciar registros.

  3. Selecione Grupos de registro. A entrada do grupo de registro X.509 que você criou anteriormente deve aparecer na lista.

  4. Selecione a entrada do registro. Em seguida, selecione Detalhes ao lado de Status de registro para ver os dispositivos que foram registrados por meio do grupo de registro. O hub IoT ao qual cada um dos dispositivos foi atribuído, suas IDs de dispositivo e as datas e horas às quais foram registrados aparecem na lista.

    Captura de tela que mostra os detalhes do status de registro para o grupo de registro no portal do Azure.

  5. Você pode selecionar um dos dispositivos para ver mais detalhes desse dispositivo.

Para verificar os dispositivos no hub IoT:

  1. No portal do Azure, acesse o hub IoT ao qual seu dispositivo foi atribuído.

  2. No menu Gerenciamento de dispositivo, selecione Dispositivos.

  3. Se os seus dispositivos foram provisionados com êxito, as IDs do dispositivo, device-01 e device-02, devem aparecer na lista, com Status definido como habilitado. Se você não encontrar seus dispositivos, selecione Atualizar.

    Captura de tela que mostra os dispositivos registrados com o hub IoT no portal do Azure.

Limpar os recursos

Quando terminar de testar e explorar este exemplo do cliente de dispositivo, use as etapas a seguir para excluir todos os recursos criados por este tutorial.

  1. Feche a janela de saída de exemplo de dispositivo cliente em seu computador.

Excluir seu grupo de registros

  1. No menu à esquerda no portal do Azure, selecione Todos os recursos.

  2. Selecione sua instância do DPS.

  3. No menu Configurações, selecione Gerenciar registros.

  4. Selecione a guia Grupos de registro.

  5. Selecione o grupo de registro usado para este tutorial.

  6. Na página Detalhes do registro, selecione Detalhes ao lado de Status de registro. Em seguida, marque a caixa de seleção ao lado do cabeçalho da coluna ID do Dispositivo para selecionar todos os registros do grupo de registro. Selecione Excluir na parte superior da página para excluir os registros.

    Importante

    Excluir um grupo de registros não exclui os registros de registro associados a ele. Esses registros órfãos serão contabilizados para a cota de registros da instância do DPS. Por esse motivo, é uma prática recomendada excluir todos os registros de registro associados a um grupo antes de excluir o grupo de registros propriamente dito.

  7. Volte para a página Gerenciar registros e verifique se a guia Grupos de registro está selecionada.

  8. Marque a caixa de seleção ao lado do nome do grupo do grupo de registro que você usou para este tutorial.

  9. Na parte superior da página, selecione Excluir.

Excluir certificados de autoridade de certificação registrados do DPS

  1. Selecione Certificados no menu à esquerda da instância do DPS. Para cada certificado carregado e verificado neste tutorial, selecione o certificado, escolha Excluir e confirme sua escolha para removê-lo.

Excluir os registros do dispositivo do Hub IoT

  1. No menu à esquerda no portal do Azure, selecione Todos os recursos.

  2. Selecione seu Hub IoT.

  3. No menu Gerenciadores, selecione Dispositivos IoT.

  4. Marque a caixa de seleção ao lado da ID do dispositivo dos dispositivos registrados neste tutorial. Por exemplo, device-01 e device-02.

  5. Na parte superior da página, selecione Excluir.

Próximas etapas

Neste tutorial, você provisionou vários dispositivos X.509 para seu hub IoT usando um grupo de registro. A seguir, aprenda como provisionar dispositivos IoT em vários hubs.