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. O código de dispositivo de exemplo do SDK do Azure IoT será executado em sua máquina de desenvolvimento para simular o provisionamento de dispositivos X.509. Em dispositivos reais, o código do dispositivo seria implantado e executado a partir do dispositivo IoT.
O Serviço de Provisionamento de Dispositivo do Hub IoT do Azure dá suporte a dois tipos de registros para dispositivos de provisionamento:
- Grupos de inscrição: utilizados para inscrever vários dispositivos relacionados. Este tutorial demonstra o provisionamento com grupos de inscrição.
- Inscrições individuais: usadas para registrar um único dispositivo.
O Serviço de Provisionamento de Dispositivo do 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 de certificado X.509
- Módulo de plataforma confiável (TPM)
- Chaves simétricas
Em cenários de produção, um HSM (Hardware Security Module) é usado para armazenamento seguro e baseado em hardware de segredos de dispositivos. Um HSM pode ser usado com chave simétrica, certificado X.509 ou atestado TPM para fornecer armazenamento seguro para segredos. Recomenda-se o armazenamento baseado em hardware de segredos do dispositivo para ajudar a proteger informações confidenciais, como a chave privada do certificado do dispositivo.
Neste tutorial, você conclui os seguintes objetivos:
- Crie uma cadeia de confiança de certificados para organizar um conjunto de dispositivos usando certificados X.509.
- Crie um novo registro de grupo que use a cadeia de certificados.
- Configure o ambiente de desenvolvimento.
- Provisione dispositivos usando a cadeia de certificados usando código de exemplo no SDK de dispositivo IoT do Azure.
Pré-requisitos
Se não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar.
Conclua as etapas em Configurar o Serviço de Provisionamento de Dispositivo do 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, consulte a seção apropriada em Prepare your development environment na documentação do SDK.
Instale o Visual Studio 2022 com a carga de trabalho 'Desenvolvimento de área de trabalho com C++' habilitada. Visual Studio 2015, Visual Studio 2017 e Visual Studio 19 também são suportados.
Instale o sistema de compilação 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 (Visual Studio e a carga de trabalho 'Desenvolvimento de área de trabalho com C++') estão instalados em sua máquina antes de iniciar a
CMake
instalação. Depois de os pré-requisitos estarem assegurados e a transferência verificada, instale o sistema de compilação CMake. Além disso, esteja ciente de que as versões mais antigas do sistema de compilação CMake não conseguem gerar o arquivo de solução usado neste tutorial. Certifique-se de usar 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, consulte a seção apropriada em Prepare your development environment na documentação do SDK.
Instale o .NET SDK 6.0 ou posterior em sua máquina baseada no Windows. Você pode usar o seguinte comando para verificar sua versão.
dotnet --info
Os pré-requisitos a seguir são para um ambiente de desenvolvimento do Windows. Para Linux ou macOS, consulte a seção apropriada em Prepare your development environment na documentação do SDK.
- Instale Node.js v4.0 ou superior na sua máquina.
Os pré-requisitos a seguir são para um ambiente de desenvolvimento do Windows.
- Python 3.6 ou posterior na sua máquina.
Os pré-requisitos a seguir são para um ambiente de desenvolvimento do Windows. Para Linux ou macOS, consulte a seção apropriada em Prepare your development environment na documentação do SDK.
Instale o Java SE Development Kit 8 ou posterior na sua máquina.
Transfira e instale o Maven.
Instale a versão mais recente do Git. Certifique-se de que o Git é adicionado às variáveis de ambiente acessíveis à janela de comando.
Certifique-se de que o OpenSSL está instalado na sua máquina. No Windows, sua instalação do Git inclui uma instalação do OpenSSL. Você pode acessar o OpenSSL a partir do prompt do Git Bash. Para verificar se o OpenSSL está instalado, abra um prompt do Git Bash e digite
openssl version
.Nota
A menos que você esteja familiarizado com o OpenSSL e já o tenha instalado em sua máquina Windows, recomendamos usar o OpenSSL no prompt do Git Bash. Como alternativa, você pode optar por baixar o código-fonte e construir OpenSSL. Se você optar por construir ou baixar o OpenSSL, certifique-se de que o binário OpenSSL esteja acessível em seu caminho e que a
OPENSSL_CNF
variável de ambiente esteja definida como o caminho do arquivo openssl.cnf .
Preparar o ambiente de desenvolvimento
Nesta seção, você prepara um ambiente de desenvolvimento usado para criar o SDK do Azure IoT C. O SDK inclui código de exemplo e ferramentas usadas pelo provisionamento de dispositivos com DPS.
Em um navegador da Web, vá para a página Versão do SDK do Azure IoT C.
Copie o nome da marca para a versão mais recente do Azure IoT C SDK, por exemplo:
lts_03_2024
.Abra um prompt de comando do Windows e execute os seguintes comandos para clonar a versão mais recente do SDK do Dispositivo IoT do Azure para o repositório C GitHub. Substitua
<release-tag>
pela tag copiada 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
Esta operação pode levar vários minutos para ser concluída.
Quando a operação estiver concluída, execute os seguintes comandos a
azure-iot-sdk-c
partir do diretório:mkdir cmake cd cmake
O exemplo de código utiliza um certificado X.509 para fornecer um atestado através 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 inclua o cliente de provisionamento de dispositivo. Uma solução do Visual Studio para o dispositivo simulado
cmake
é gerada no diretório.Substitua
<path
pelo caminho absoluto para o C SDK 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 ..
Gorjeta
Se
cmake
não encontrar seu compilador C++, você pode obter erros de compilação ao executar o comando acima. Se isso acontecer, tente executar o comando no prompt de comando do Visual Studio.Quando a compilação é bem-sucedida, as últimas linhas de saída são semelhantes à 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 GitHub do SDK do Azure IoT 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 SDK do Azure IoT para Node.js repositório GitHub 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 SDK do Dispositivo IoT do Azure para o repositório GitHub do Python usando o seguinte comando:
git clone -b v2 https://github.com/Azure/azure-iot-sdk-python.git --recursive
Nota
Os exemplos usados neste tutorial estão na ramificação v2 do repositório azure-iot-sdk-python. V3 do Python SDK está disponível para uso em beta.
Abra um prompt de comando do Windows e clone o repositório Azure IoT Samples for Java GitHub usando o seguinte comando:
git clone https://github.com/Azure/azure-iot-sdk-java.git --recursive
Vá para o diretório raiz
azure-iot-sdk-java
e construa 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ê gera uma cadeia de certificados X.509 de três certificados para testar cada dispositivo com este tutorial. Os certificados têm a seguinte hierarquia.
Certificado raiz Você carrega e verifica o certificado raiz com 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 logicamente 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 nesta cadeia é assinado pelo certificado raiz. Este certificado é fornecido ao grupo de inscrição 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 de dispositivo: um certificado de dispositivo (às vezes chamado de certificado folha) é assinado pelo certificado intermediário e armazenado no dispositivo junto com sua chave privada. Idealmente, esses itens sensíveis seriam armazenados de forma segura com um HSM. Vários certificados de dispositivo podem ser assinados pelo mesmo certificado intermediário. Cada dispositivo apresenta seu certificado e chave privada, juntamente com a cadeia de certificados, ao tentar o provisionamento.
Para obter mais informações sobre cadeias de certificados, consulte Atestado de certificado X.509.
Configurar o ambiente X.509 OpenSSL
Nesta seção, você cria os arquivos de configuração do Openssl, a estrutura de diretórios e outros arquivos usados pelos comandos do Openssl.
Abra um prompt de comando do Git Bash e navegue até uma pasta onde você deseja gerar os certificados e chaves X.509 para este tutorial.
Crie um arquivo de configuração OpenSSL chamado openssl_root_ca.cnf para seu certificado de autoridade de certificação raiz. Os arquivos de configuração OpenSSL contêm políticas e definições que são consumidas pelos 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 OpenSSL chamado openssl_device_intermediate_ca.cnf para usar 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órios, o arquivo de banco de dados index.txt e o arquivo de número de série serial que são usados pelos comandos OpenSSL neste tutorial:
mkdir certs csr newcerts private touch index.txt openssl rand -hex 16 > serial
Criar um certificado de autoridade de certificação raiz
Execute os seguintes comandos para criar uma chave privada de autoridade de certificação raiz e um certificado de autoridade de certificação raiz. Você usa esse certificado e essa chave para assinar seu certificado intermediário.
No seu terminal Git Bash, crie uma chave privada de CA 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 dada para o nome do assunto (
//CN=Azure IoT Hub CA Cert Test Only
) só é necessária para escapar da cadeia de caracteres com o Git em plataformas Windows. Em plataformas Linux, forneça o nome do assunto com apenas uma barra (/CN=Azure IoT Hub CA Cert Test Only
).Examine o certificado da autoridade de certificação raiz:
openssl x509 -noout -text -in ./certs/azure-iot-test-only.root.ca.cert.pem
Observe que o Emissor e o Sujeito são ambos a autoridade de certificação 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ário
Execute os comandos a seguir para criar uma chave privada de autoridade de certificação intermediária e um certificado de autoridade de certificação intermediário. Você usa esse certificado e essa chave para assinar os certificados do dispositivo.
No seu terminal Git Bash, crie uma chave privada de CA intermediária:
openssl genrsa -aes256 -passout pass:1234 -out ./private/azure-iot-test-only.intermediate.key.pem 4096
Crie uma CSR (solicitação de assinatura de certificado de CA) 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 dada para o nome do assunto (
//CN=Azure IoT Hub Intermediate Cert Test Only
) só é necessária para escapar da cadeia de caracteres com o Git em plataformas Windows. Em plataformas Linux, forneça o nome do assunto com uma única 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 autoridade de certificação raiz e o Sujeito é a autoridade de certificação 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 de dispositivo
Nesta seção, você cria dois certificados de dispositivo e seus certificados de cadeia completa. O certificado de cadeia completa contém o certificado de dispositivo, o certificado de autoridade de certificação intermediário e o certificado de autoridade de certificação raiz. O dispositivo deve apresentar o seu certificado de cadeia completa quando se regista no DPS.
Crie a primeira chave privada do dispositivo.
openssl genrsa -out ./private/device-01.key.pem 4096
Crie o CSR do certificado do dispositivo.
O nome comum da entidade (CN) do certificado do dispositivo deve ser definido como a ID de registo que o dispositivo utiliza para se registar no DPS. O ID de registo é uma cadeia de carateres alfanuméricos que não diferencia maiúsculas de minúsculas mais os carateres especiais:
'-'
,'.'
,'_'
,':'
. O último caractere deve ser alfanumérico ou traço ('-'
). O nome comum deve aderir a este formato. O DPS suporta IDs de registro de até 128 caracteres; no entanto, o comprimento máximo do nome comum da entidade em um certificado X.509 é de 64 caracteres. O ID de registro, portanto, é limitado a 64 caracteres ao usar certificados X.509. Para inscrições de grupo, a ID de registro também é usada como a ID do dispositivo no Hub IoT.O nome comum do assunto é definido usando o
-subj
parâmetro. 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 dada para o nome do assunto (
//CN=device-01
) só é necessária para escapar da cadeia de caracteres com o Git em plataformas Windows. Em plataformas Linux, forneça o nome do assunto com uma única 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 intermediária, e o Assunto é o 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 deve apresentar a cadeia de certificados completa quando for autenticado com 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 de cadeia de certificados, ./certs/device-01-full-chain.cert.pem, em um editor de texto para examiná-lo. O texto da cadeia de certificados contém a cadeia completa dos três certificados. Você usa essa cadeia de certificados posteriormente neste tutorial para provisionar
device-01
o .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 esse script no prompt de comando do Git Bash. Para criar certificados para mais dispositivos, você pode modificar a
registration_id
variável declarada 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 dada para o nome do assunto (
//CN=$registration_id
) só é necessária para escapar da cadeia de caracteres com o Git em plataformas Windows. Em plataformas Linux, forneça o nome do assunto com uma única barra (/CN=$registration_id
).Nota
Esse script usa a ID de registro como o nome de arquivo base para a chave privada e os arquivos de certificado. Se o seu ID de registo contiver carateres que não são carateres de nome de ficheiro válidos, terá de modificar o script em conformidade.
Aviso
O texto dos certificados contém apenas informações de chave pública.
No entanto, o dispositivo também deve ter acesso à chave privada para o certificado do dispositivo. Isso é necessário porque o dispositivo deve executar a verificação usando essa chave em tempo de execução quando tenta provisionar. A sensibilidade dessa chave é uma das principais razões pelas quais é recomendado usar armazenamento baseado em hardware em um HSM real para ajudar a proteger chaves privadas.
Você usa os seguintes arquivos no restante deste tutorial:
Certificado | Ficheiro | Description |
---|---|---|
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ária | certs/azure-iot-test-only.intermediate.cert.pem | Usado para criar um grupo de inscrição no DPS. |
device-01 chave privada | privado/device-01.key.pem | Usado pelo dispositivo para verificar a propriedade do certificado do dispositivo durante a autenticação com DPS. |
certificado de cadeia completa device-01 | certs/dispositivo-01-full-chain.cert.pem | Apresentado pelo dispositivo para autenticar e registrar com DPS. |
device-02 chave privada | privado/device-02.key.pem | Usado pelo dispositivo para verificar a propriedade do certificado do dispositivo durante a autenticação com DPS. |
certificado de cadeia completa device-02 | certs/dispositivo-02-full-chain.cert.pem | Apresentado pelo dispositivo para autenticar e registrar com DPS. |
Verificar a propriedade do certificado raiz
Para que o DPS possa validar a cadeia de certificados do dispositivo durante a autenticação, você deve carregar e verificar a propriedade do certificado da autoridade de certificação raiz. Para adicionar o certificado de autoridade de certificação raiz à sua instância DPS, siga estas etapas:
No portal do Azure, navegue até sua instância do Serviço de Provisionamento de Dispositivo.
Abra Certificados no menu à esquerda e selecione Adicionar para adicionar um novo certificado.
Insira um nome de exibição amigável para seu certificado. Navegue até o local do arquivo
certs/azure-iot-test-only.root.ca.cert.pem
de certificado de autoridade de certificação raiz. Selecione Carregar.Marque a caixa para Definir o status do certificado como verificado ao carregar.
Selecione Guardar.
Verifique se o certificado é mostrado na guia certificado com o status Verificado.
Atualizar o armazenamento de certificados em dispositivos baseados no Windows
Em dispositivos que não sejam Windows, você pode passar a cadeia de certificados do código como o armazenamento de certificados.
Em dispositivos baseados no Windows, você deve adicionar os certificados de assinatura (raiz e intermediários) a um repositório de certificados do Windows. Caso contrário, os certificados de assinatura não serão transportados para o DPS por um canal seguro com Transport Layer Security (TLS).
Gorjeta
Também é possível usar OpenSSL em vez de canal seguro (Schannel) com o C SDK. Para obter mais informações sobre como usar o OpenSSL, consulte Usando o OpenSSL no SDK.
Para adicionar os certificados de assinatura ao armazenamento de certificados em dispositivos baseados no Windows:
No seu terminal Git Bash, converta seus certificados de assinatura da
.pfx
seguinte forma.Certificado de autoridade de certificação 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 AC intermédio:
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 rato no botão Iniciar do Windows e, em seguida, selecione Executar. Digite 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>de importação de todas as tarefas.>
Siga as etapas do Assistente para Importação de Certificados para importar
root.pfx
.- Certifique-se de pesquisar por Troca de informações pessoais (.pfx)
- Use
1234
como senha. - Coloque o certificado no armazenamento de certificados das Autoridades de Certificação Raiz Confiáveis.
Repita estas etapas do gerenciador de certificados para importar
intermediate.pfx
o .- Coloque o certificado no armazenamento de certificados das Autoridades de Certificação Intermediárias .
Seus certificados de assinatura agora são confiáveis no dispositivo baseado no Windows e toda a cadeia pode ser transportada para o DPS.
Criar um grupo de inscrição
Entre no portal do Azure e navegue até sua instância do Serviço de Provisionamento de Dispositivo.
Selecione Gerenciar inscrições na seção Configurações do menu de navegação.
Na parte superior da página, selecione Adicionar grupo de inscrição.
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 para serem usados apenas para este grupo de inscrição ou selecione Certificados X.509 carregados para este Serviço de Provisionamento de Dispositivo se 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 inscrição. Nome do grupo Forneça um nome para o grupo de dispositivos. O nome do grupo de inscrição é 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 traço ('-'
).Status de provisionamento Marque a caixa Habilitar este registro se quiser que esse grupo de inscrição esteja disponível para provisionar dispositivos. Desmarque esta caixa se quiser que o grupo seja desativado. Você pode alterar essa configuração mais tarde. Política de reaprovisionamento Escolha uma política de reprovisionamento que reflita como você deseja que o DPS manipule dispositivos que solicitam reprovisionamento. Para obter mais informações, consulte Políticas de reprovisionamento Selecione Next: 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 hubs IoT vinculados ou adicione um novo link a um hub IoT. Para saber mais sobre como vincular hubs IoT à sua instância DPS, consulte Como vincular e gerenciar hubs IoT. Política de afetaçã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, consulte Como usar políticas de alocação.
Se você selecionou apenas um hub IoT vinculado, recomendamos usar a política de distribuição ponderada uniformemente.Selecione Next: 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 recém-provisionados serão configurados:
Campo Descrição IoT Edge Verifique a opção Habilitar o 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 apenas para dispositivos não habilitados para IoT Edge. Todos os dispositivos de um grupo serão habilitados para IoT Edge ou nenhum poderá ser. Tags de dispositivo Use esta caixa de texto para fornecer as tags que você deseja aplicar aos gêmeos de dispositivos provisionados. Propriedades desejadas Use esta caixa de texto para fornecer as propriedades desejadas que você deseja aplicar aos gêmeos de dispositivos provisionados. Para obter mais informações, veja Understand and use device twins in IoT Hub (Compreender e utilizar dispositivos duplos no Hub IoT).
Selecione Seguinte: Rever + criar.
No separador Rever + criar, verifique todos os seus valores e, em seguida, selecione Criar.
Preparar e executar o código de provisionamento do dispositivo
Nesta seção, você atualiza o código de exemplo com as informações da instância do Serviço de Provisionamento de Dispositivo. Se um dispositivo for autenticado, ele será atribuído a um hub IoT vinculado à instância do Serviço de Provisionamento de Dispositivo configurada 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ê atualiza o código de exemplo com as informações da instância do Serviço de Provisionamento de Dispositivo.
No portal do Azure, selecione a guia Visão geral da instância do Serviço de Provisionamento de Dispositivo e anote o valor do Escopo da ID.
Inicie o Visual Studio e abra o novo arquivo de solução que foi criado no
cmake
diretório criado 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, navegue até Provision_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 Âmbito do ID que copiou anteriormente. Por exemplo:static const char* id_scope = "0ne00000A0A";
Localize a definição da função
main()
no mesmo ficheiro. Certifique-se de que ahsm_type
variável está definida comoSECURE_DEVICE_TYPE_X509
e que todas as outrashsm_type
linhas são 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;
Guardar as suas alterações.
Clique com o 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 HSM personalizado
As especificidades da interação com o armazenamento seguro real baseado em hardware variam dependendo do hardware do dispositivo. As cadeias de certificados usadas pelos dispositivos simulados neste tutorial serão codificadas no código de stub HSM personalizado. Em um cenário real, a cadeia de certificados seria armazenada no hardware HSM real para fornecer melhor segurança para informações confidenciais. Métodos semelhantes aos métodos de stub usados neste exemplo seriam entã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 a chave no código-fonte expõe a chave para qualquer pessoa que possa visualizar o código. Isso só é feito neste tutorial para ajudar na aprendizagem.
Para atualizar o código de stub HSM personalizado para simular a identidade do dispositivo com ID device-01
:
No Gerenciador de Soluções para Visual Studio, navegue até Provision_Samples > custom_hsm_example > Arquivos de Origem e abra o custom_hsm_example.c.
Atualize o valor da cadeia de caracteres constante
COMMON_NAME
usando o nome comum usado ao gerar o certificado do dispositivo.static const char* const COMMON_NAME = "device-01";
No terminal Git Bash, execute o seguinte comando para gerar a constante string para o certificado do dispositivo:
sed -e 's/^/"/;$ !s/$/""\\n"/;$ s/$/"/' ./certs/device-01-full-chain.cert.pem
Copie a saída deste comando.
Atualize o valor da cadeia de caracteres constante usando a cadeia de
CERTIFICATE
certificados salva em ./certs/device-01-full-chain.cert.pem depois de gerar seus certificados. Use o texto do certificado de saída da etapa anterior para o valor constante.A sintaxe do texto do certificado deve corresponder ao seguinte padrão sem espaços extras 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 deste comando.
Atualize o valor da cadeia de caracteres da
PRIVATE_KEY
constante com a chave privada para o certificado do dispositivo. Use o texto da chave privada de saída da etapa anterior para o valor constante.A sintaxe do texto da chave privada deve corresponder ao seguinte padrão sem espaços extras 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-----";
Guardar as suas alterações.
Clique com o botão direito do mouse no projeto custom_hsm_example e selecione Construir.
Importante
Você deve criar o projeto custom_hsm_example antes de criar o restante da solução na próxima seção.
Executar o exemplo
No menu do Visual Studio, selecione Debug (Depurar) >Start without debugging (Iniciar sem depuração) para executar a solução. Quando solicitado a reconstruir o projeto, selecione Sim para reconstruir o projeto antes da execução.
A saída a seguir é um exemplo de dispositivo
device-01
simulado inicializando com êxito e conectando-se ao 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 HSM personalizado para seu segundo dispositivo (
device-02
) e execute o exemplo novamente. Use os seguintes valores para esse dispositivo:Description valor Nome comum "device-02"
Cadeia de certificados completa Gere o texto usando ./certs/device-02-full-chain.cert.pem Chave privada Gere o texto usando ./private/device-02.key.pem A saída a seguir é um exemplo de dispositivo
device-02
simulado inicializando com êxito e conectando-se ao 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# é configurado para usar certificados X.509 armazenados em um arquivo formatado PKCS#12 protegido por senha (.pfx). Os certificados de cadeia completa criados anteriormente estão no formato PEM. Para converter os certificados de cadeia completa para o formato PKCS#12, digite os seguintes comandos no prompt do Git Bash a partir do diretório onde você executou anteriormente os comandos OpenSSL.
dispositivo-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
dispositivo-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 Dispositivo.
Copie o valor ID Scope .
No prompt de comando do Windows, mude para o diretório X509Sample . Este 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.
Digite o seguinte comando para criar e executar o exemplo de provisionamento de dispositivo X.509. Substitua
<id-scope>
pelo Escopo de ID copiado do portal do Azure. Substitua<your-certificate-folder>
pelo caminho para a pasta onde você executou os comandos OpenSSL.dotnet run -- -s <id-scope> -c <your-certificate-folder>\certs\device-01-full-chain.cert.pfx -p 1234
O dispositivo se conecta ao DPS e é atribuído a um hub IoT. Em seguida, o dispositivo envia uma mensagem de telemetria para o hub IoT. Você deve ver uma saída semelhante ao exemplo a seguir:
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.
Nota
Se você não especificar certificado e senha na linha de comando, o arquivo de certificado será padrão para ./certificate.pfx e você será solicitado a fornecer sua senha.
Parâmetros adicionais podem ser passados para alterar o TransportType (-t) e o GlobalDeviceEndpoint (-g). Para obter uma lista completa de parâmetros, digite
dotnet run -- --help
.Para registrar seu segundo dispositivo, execute novamente o exemplo 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 Dispositivo.
Copie o valor ID Scope .
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 onde você clonou o SDK.
cd .\azure-iot-sdk-node\provisioning\device\samples npm install
Na pasta provisioning\device\samples, abra register_x509.js e revise o código.
O exemplo assume como padrão MQTT como o protocolo de transporte. Se você quiser usar um protocolo diferente, comente a linha a seguir e remova o 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 DPS. Estas variáveis de ambiente são:
Nome da variável Description PROVISIONING_HOST
O ponto de extremidade a ser usado para se conectar à sua instância DPS. Para este tutorial, use o ponto de extremidade global, global.azure-devices-provisioning.net
.PROVISIONING_IDSCOPE
O escopo de ID para sua instância DPS. PROVISIONING_REGISTRATION_ID
O ID de registo do seu dispositivo. Ele deve 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
ProvisioningDeviceClient.register()
método tenta registrar seu dispositivo.Adicione variáveis de ambiente para o ponto de extremidade do dispositivo global e o escopo de 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 o ID de registro do dispositivo. A ID de registro do dispositivo IoT deve corresponder ao nome comum da entidade no certificado do dispositivo. Para este tutorial, device-01 é o nome do assunto e o 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 onde você executou os comandos 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ê deve ver uma saída semelhante ao exemplo a seguir:
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 seu segundo dispositivo (
device-02
) de acordo com a tabela a seguir e execute o exemplo novamente.Variável de Ambiente Value PROVISIONING_REGISTRATION_ID device-02
CERTIFICATE_FILE <sua-pasta-certificado>\certs\device-02-full-chain.cert.pem KEY_FILE <sua-pasta-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 Dispositivo.
Copie o escopo do ID.
No prompt de comando do Windows, vá para o diretório do exemplo de provision_x509.py . O caminho mostrado é relativo ao local onde você clonou o SDK.
cd .\azure-iot-sdk-python\samples\async-hub-scenarios
Este exemplo usa seis variáveis de ambiente para autenticar e provisionar um dispositivo IoT usando DPS. Estas variáveis de ambiente são:
Nome da variável Description PROVISIONING_HOST
O ponto de extremidade a ser usado para se conectar à sua instância DPS. Para este tutorial, use o ponto de extremidade global, global.azure-devices-provisioning.net
.PROVISIONING_IDSCOPE
O escopo de ID para sua instância DPS. DPS_X509_REGISTRATION_ID
O ID de registo do seu dispositivo. Ele deve 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 para este tutorial. Adicione as variáveis de ambiente para o ponto de extremidade do dispositivo global e o escopo de ID. Para a variável de escopo de 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 o ID de registro do dispositivo. A ID de registro do dispositivo IoT deve corresponder ao nome comum da entidade no certificado do dispositivo. Para este tutorial, device-01 é o nome do assunto e o 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 onde você executou os comandos 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
Revise o código para provision_x509.py. Se você não estiver usando o Python versão 3.7 ou posterior, faça a alteração de código mencionada aqui para substituir
asyncio.run(main())
o .Execute o exemplo. O exemplo se conecta ao DPS, que provisionará o dispositivo para um hub IoT. Depois que o dispositivo é provisionado, o exemplo envia algumas mensagens de teste para o hub IoT.
python provision_x509.py
Você deve ver uma saída semelhante ao exemplo a seguir:
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 seu segundo dispositivo (
device-02
) de acordo com a tabela a seguir e execute o exemplo novamente.Variável de Ambiente Value DPS_X509_REGISTRATION_ID device-02
X509_CERT_FILE <sua-pasta-certificado>\certs\device-02-full-chain.cert.pem X509_KEY_FILE <sua-pasta-certificado>\private\device-02.key.pem
Nas etapas a seguir, você usa 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 Dispositivo.
Copie o escopo do ID.
No prompt de comando do Windows, navegue até a pasta de projeto de exemplo. O caminho mostrado é relativo ao local onde você clonou o SDK
cd .\azure-iot-sdk-java\provisioning\provisioning-device-client-samples\provisioning-X509-sample
Insira o serviço de provisionamento e as informações de identidade X.509 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
em seu editor favorito.Atualize os seguintes valores. Para
idScope
, use o Escopo de ID copiado anteriormente. Para o ponto de extremidade global, use o ponto de extremidade do dispositivo Global. Este 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 assume como padrão o uso de HTTPS como o protocolo de transporte. 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
leafPublicPem
valor da cadeia de caracteres constante com o valor do certificado do dispositivo, device-01.cert.pem.A sintaxe do texto do certificado deve corresponder ao seguinte padrão, sem espaços ou caracteres extras.
private static final String leafPublicPem = "-----BEGIN CERTIFICATE-----\n" "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n" ... "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n" "-----END CERTIFICATE-----";
Atualizar esse valor de 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. Este comando gera a sintaxe para o valor da
leafPublicPem
constante de cadeia de caracteres e grava-a 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 constante.
Atualize o valor da cadeia de caracteres da
leafPrivateKey
constante com a chave privada não criptografada para o certificado do dispositivo, unencrypted-device-key.pem.A sintaxe do texto da chave privada deve corresponder ao seguinte padrão, sem espaços ou caracteres extras.
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. Este comando gera a sintaxe para o valor da
leafPrivateKey
constante de cadeia de caracteres e grava-a 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 constante.
Adicione uma
rootPublicPem
cadeia de caracteres constante com o valor do seu certificado de autoridade de certificação raiz, azure-iot-test-only.root.ca.cert.pem. Você pode adicioná-lo logo após aleafPrivateKey
constante.A sintaxe do texto do certificado deve corresponder ao seguinte padrão, sem espaços ou caracteres extras.
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. Este comando gera a sintaxe para o valor da
rootPublicPem
constante de cadeia de caracteres e grava-a 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 constante.
Adicione uma
intermediatePublicPem
cadeia de caracteres constante com o valor do seu certificado de CA 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 deve corresponder ao seguinte padrão, sem espaços ou caracteres extras.
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. Este comando gera a sintaxe para o valor da
intermediatePublicPem
constante de cadeia de caracteres e grava-a 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 constante.
Encontre as seguintes linhas no
main
método.// For group enrollment uncomment this line //signerCertificatePemList.add("<Your Signer/intermediate Certificate Here>");
Adicione essas duas linhas diretamente abaixo delas para adicionar seus certificados de CA intermediários e raiz à cadeia de assinatura. Sua cadeia de assinatura deve incluir toda a cadeia de certificados até e incluindo um certificado que você verificou com o DPS.
signerCertificatePemList.add(intermediatePublicPem); signerCertificatePemList.add(rootPublicPem);
Nota
A ordem em que os certificados de assinatura são adicionados é importante. O exemplo falhará se for alterado.
Guardar as suas alterações.
Crie o exemplo e, em seguida, vá para a
target
pasta.mvn clean install cd target
A compilação produz .jar arquivo na
target
pasta 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
O exemplo se conecta ao DPS, que provisiona o dispositivo para 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 para seu segundo dispositivo (
device-02
) de acordo com a tabela a seguir, reconstrua e execute o exemplo novamente.Constante Ficheiro a utilizar leafPublicPem
./certs/device-02.cert.pem leafPrivateKey
./privado/device-02.key.pem
Confirme o registro de provisionamento do dispositivo
Examine os registros de registro do grupo de inscrição para ver os detalhes de registro para seus dispositivos:
No portal do Azure, vá para sua instância do Serviço de Provisionamento de Dispositivo.
No menu Configurações, selecione Gerenciar inscrições.
Selecione Grupos de inscrição. A entrada do grupo de inscrição X.509 que você criou anteriormente deve aparecer na lista.
Selecione a entrada de inscrição. Em seguida, selecione Detalhes ao lado do status Registro para ver os dispositivos que foram registrados por meio do grupo de inscrição. O hub IoT ao qual cada um dos seus dispositivos foi atribuído, suas IDs de dispositivo e as datas e horas em que foram registrados aparecem na lista.
Você pode selecionar um dos dispositivos para ver mais detalhes desse dispositivo.
Para verificar os dispositivos no seu hub IoT:
No portal do Azure, vá para o hub IoT ao qual seu dispositivo foi atribuído.
No menu Gerenciamento de dispositivos, selecione Dispositivos.
Se seus dispositivos foram provisionados com êxito, seus IDs de dispositivo, device-01 e device-02, devem aparecer na lista, com Status definido como habilitado. Se não vir os seus dispositivos, selecione Atualizar.
Clean up resources (Limpar recursos)
Quando terminar de testar e explorar este exemplo de cliente de dispositivo, use as etapas a seguir para excluir todos os recursos criados por este tutorial.
- Feche a janela da saída do exemplo de dispositivo cliente no seu computador.
Excluir seu grupo de inscrição
No menu à esquerda no portal do Azure, selecione Todos os recursos.
Selecione sua instância do DPS.
No menu Configurações, selecione Gerenciar inscrições.
Selecione a guia Grupos de inscrição.
Selecione o grupo de inscrição usado para este tutorial.
Na página Detalhes da inscrição, selecione Detalhes ao lado do Status do registro. Em seguida, marque a caixa de seleção ao lado do cabeçalho da coluna ID do dispositivo para selecionar todos os registros de registro para o grupo de registro. Selecione Excluir na parte superior da página para excluir os registros de registro.
Importante
A exclusão de um grupo de inscrição não exclui os registros de registro associados a ele. Esses registros órfãos serão contabilizados na cota de registros para a instância do DPS. Por esse motivo, é uma prática recomendada excluir todos os registros de registro associados a um grupo de inscrição antes de excluir o próprio grupo de inscrição.
Volte para a página Gerenciar inscrições e verifique se a guia Grupos de inscrições está selecionada.
Marque a caixa de seleção ao lado do nome do grupo de inscrição usado para este tutorial.
Na parte superior da página, selecione Eliminar.
Excluir certificados de CA registrados do DPS
- Selecione Certificados no menu esquerdo da sua instância DPS. Para cada certificado carregado e verificado neste tutorial, selecione o certificado e selecione Excluir e confirme sua escolha para removê-lo.
Excluir registros de dispositivos do Hub IoT
No menu à esquerda no portal do Azure, selecione Todos os recursos.
Selecione seu hub IoT.
No menu Explorers, 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 Eliminar.
Próximos passos
Neste tutorial, você provisionou vários dispositivos X.509 para seu hub IoT usando um grupo de registro. Em seguida, saiba como provisionar dispositivos IoT em vários hubs.