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
Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
Conclua as etapas em Configurar o Serviço de Provisionamento de Dispositivos no Hub IoT com o portal do Azure.
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.
- Instale o Node.js v4.0 ou superior em seu computador.
Os pré-requisitos a seguir são para um ambiente de desenvolvimento do Windows.
- Python 3.6 ou posterior em seu computador.
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 Java SE Development Kit 8 ou posterior em seu computador.
Baixe e instale o Maven.
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.
Em um navegador da Web, acesse a página de versão do SDK do Azure IoT para C.
Copie o nome da marca para a versão mais recente do SDK de C de Azure IoT, por exemplo:
lts_03_2024
.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.
Quando a operação for concluída, execute os seguintes comandos no diretório
azure-iot-sdk-c
:mkdir cmake cd cmake
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.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.
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
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.
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.
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.
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
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
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.
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
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
).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.
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
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
).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
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.
Crie a primeira chave privada do dispositivo.
openssl genrsa -out ./private/device-01.key.pem 4096
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
).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
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)
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
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-----
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:
No portal do Azure, navegue até sua instância do Serviço de Provisionamento de Dispositivos.
Abra Certificados no menu à esquerda e selecione Adicionar para adicionar um novo certificado.
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.Marque a caixa ao lado de Definir status do certificado como verificado no momento do upload.
Selecione Salvar.
Verifique se o certificado é mostrado na guia do certificado com o status Verificado.
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:
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
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.
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.
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.
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
Entre no portal do Azure e navegue até instância do Serviço de Provisionamento de Dispositivos.
Selecione Gerenciar registros na seção Configurações do menu de navegação.
Na parte superior da página, selecione Adicionar grupo de registro.
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 Selecione Avançar: Hubs IoT.
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.Selecione Avançar: Configurações do dispositivo
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.
Selecione Avançar: Revisar + criar.
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.
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.
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 é chamadoazure_iot_sdks.sln
.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.
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";
Encontre a definição da função
main()
no mesmo arquivo. Verifique se a variávelhsm_type
está definida comoSECURE_DEVICE_TYPE_X509
e se todas as outras linhashsm_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;
Salve suas alterações.
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
:
No Gerenciador de Soluções para Visual Studio, acesse Provision_Samples > custom_hsm_example > Arquivos de Origem e abra custom_hsm_example.c.
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";
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.
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-----";
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.
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-----";
Salve suas alterações.
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
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:
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.
No portal do Azure, selecione a guia Visão Geral do seu serviço de Provisionamento de Dispositivos.
Copie o valor de Escopo da ID.
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.
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
.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.
No portal do Azure, selecione a guia Visão Geral do seu serviço de Provisionamento de Dispositivos.
Copie o valor de Escopo da ID.
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
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.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>
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
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
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
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.
No portal do Azure, selecione a guia Visão Geral do seu serviço de Provisionamento de Dispositivos.
Copie o Escopo da ID.
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. 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>
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
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
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())
.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
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.
No portal do Azure, selecione a guia Visão Geral do seu serviço de Provisionamento de Dispositivos.
Copie o Escopo da ID.
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
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.
Abra o arquivo
.\src\main\java\samples\com\microsoft\azure\sdk\iot\ProvisioningX509Sample.java
no seu editor favorito.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]";
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;
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.
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.
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 constanteleafPrivateKey
.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.
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.
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.
Salve suas alterações.
Compile o exemplo e acesse a pasta
target
.mvn clean install cd target
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!
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:
No Portal do Azure, vá até a sua instância do Serviço de Provisionamento de Dispositivos.
No menu Configurações, selecione Gerenciar registros.
Selecione Grupos de registro. A entrada do grupo de registro X.509 que você criou anteriormente deve aparecer na lista.
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.
Você pode selecionar um dos dispositivos para ver mais detalhes desse dispositivo.
Para verificar os dispositivos no hub IoT:
No portal do Azure, acesse o hub IoT ao qual seu dispositivo foi atribuído.
No menu Gerenciamento de dispositivo, selecione Dispositivos.
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.
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.
- Feche a janela de saída de exemplo de dispositivo cliente em seu computador.
Excluir seu grupo de registros
No menu à esquerda no portal do Azure, selecione Todos os recursos.
Selecione sua instância do DPS.
No menu Configurações, selecione Gerenciar registros.
Selecione a guia Grupos de registro.
Selecione o grupo de registro usado para este tutorial.
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.
Volte para a página Gerenciar registros e verifique se a guia Grupos de registro está selecionada.
Marque a caixa de seleção ao lado do nome do grupo do grupo de registro que você usou para este tutorial.
Na parte superior da página, selecione Excluir.
Excluir certificados de autoridade de certificação registrados do DPS
- 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
No menu à esquerda no portal do Azure, selecione Todos os recursos.
Selecione seu Hub IoT.
No menu Gerenciadores, selecione Dispositivos IoT.
Marque a caixa de seleção ao lado da ID do dispositivo dos dispositivos registrados neste tutorial. Por exemplo, device-01 e device-02.
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.