Tutorial: Aprovisionamiento de varios dispositivos X.509 mediante grupos de inscripción
En este tutorial, aprenderá sobre cómo aprovisionar grupos de dispositivos IoT que utilizan certificados X.509 para la autenticación. Se ejecutará código del dispositivo de ejemplo del SDK de Azure IoT en la máquina de desarrollo para simular el aprovisionamiento de dispositivos X.509. En dispositivos reales, el código de dispositivo se implementará y se ejecutará desde el dispositivo IoT.
Azure IoT Hub Device Provisioning Service admite dos tipos de inscripciones para los dispositivos de aprovisionamiento:
- Grupos de inscripción: usados para inscribir varios dispositivos relacionados. En este tutorial se muestra el aprovisionamiento con grupos de inscripción.
- Inscripciones individuales: usadas para inscribir un solo dispositivo.
Azure IoT Hub Device Provisioning Service admite tres formas de autenticación para el aprovisionamiento de dispositivos:
- Certificado X.509: Este tutorial demuestra la atestación del certificado X.509
- Módulo de plataforma segura (TPM)
- Claves simétricas
En escenarios de producción, el Módulo de seguridad de hardware (HSM) se utiliza para el almacenamiento seguro, basado en hardware de secretos del dispositivo. Un HSM se puede utilizar con una clave simétrica, un certificado X.509 o una atestación de TPM para proporcionar almacenamiento seguro para los secretos. Se recomienda el almacenamiento basado en hardware de secretos del dispositivo para ayudar a proteger la información confidencial, como la clave privada del certificado del dispositivo.
En este tutorial, completará los siguientes objetivos:
- Crear una cadena de certificados de confianza para organizar un conjunto de dispositivos mediante certificados X.509.
- Crear una nueva inscripción de grupo que use la cadena de certificados.
- Configure el entorno de desarrollo.
- Aprovisionamiento de dispositivos mediante la cadena de certificados utilizando código de ejemplo en el SDK de dispositivo IoT de Azure.
Requisitos previos
Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
Realice los pasos que se describen en Configuración de IoT Hub Device Provisioning Service con Azure Portal.
Los siguientes requisitos previos corresponden a un entorno de desarrollo de Windows usado para simular los dispositivos. En el caso de Linux o macOS, consulte la sección correspondiente en Preparación del entorno de desarrollo en la documentación del SDK.
Instale Visual Studio 2022 con la carga de trabajo "Desarrollo para el escritorio con C++" habilitada. También se admiten Visual Studio 2015, Visual Studio 2017 y Visual Studio 19.
Instale el sistema de compilación de CMake más reciente. Asegúrese de comprobar la opción que agrega el ejecutable de CMake a la ruta de acceso.
Importante
Confirme que los requisitos previos de Visual Studio (Visual Studio y la carga de trabajo "Desarrollo para escritorio con C++") estén instalados en la máquina antes de empezar la instalación de
CMake
. Una vez que los requisitos previos están en su lugar, y se ha comprobado la descarga, instale el sistema de compilación de CMake. Tenga en cuenta que las versiones anteriores del sistema de compilación CMake no generan el archivo de solución que se usa en este tutorial. Asegúrese de usar la versión más reciente de CMake.
Los siguientes requisitos previos corresponden a un entorno de desarrollo de Windows. En el caso de Linux o macOS, consulte la sección correspondiente en Preparación del entorno de desarrollo en la documentación del SDK.
Instale el SDK de .NET 6.0 o una versión posterior en una máquina con Windows. Para comprobar la versión, use el siguiente comando.
dotnet --info
Los siguientes requisitos previos corresponden a un entorno de desarrollo de Windows. En el caso de Linux o macOS, consulte la sección correspondiente en Preparación del entorno de desarrollo en la documentación del SDK.
- Instale Node.js v4.0 o una versión superior en la máquina.
Los siguientes requisitos previos corresponden a un entorno de desarrollo de Windows.
- Python 3.6 o una versión superior en la máquina.
Los siguientes requisitos previos corresponden a un entorno de desarrollo de Windows. En el caso de Linux o macOS, consulte la sección correspondiente en Preparación del entorno de desarrollo en la documentación del SDK.
Instale Java SE Development Kit 8 o cualquier versión posterior, en la máquina.
Descargue e instale Maven.
Instale la última versión de Git. Asegúrese de que Git se ha agregado a las variables de entorno accesibles desde la ventana de comandos.
Asegúrese de que OpenSSL está instalado en el equipo. En Windows, la instalación de Git incluye una instalación de OpenSSL. Puede acceder a OpenSSL desde el símbolo del sistema de Git Bash. Para comprobar que OpenSSL está instalado, abra un símbolo del sistema de Git Bash y escriba
openssl version
.Nota:
A menos que esté familiarizado con OpenSSL y ya lo tenga instalado en la máquina Windows, se recomienda usar OpenSSL desde el símbolo del sistema de Git Bash. Como alternativa, puede optar por descargar el código fuente y compilar OpenSSL. Si decide compilar o descargar OpenSSL, asegúrese de que se puede acceder al binario de OpenSSL en la ruta de acceso y de que la variable de entorno
OPENSSL_CNF
esté establecida en la ruta de acceso del archivo openssl.cnf.
Preparación del entorno de desarrollo
En esta sección, preparará un entorno de desarrollo para compilar el SDK de Azure IoT para C. El SDK incluye el código de ejemplo y las herramientas usadas para el aprovisionamiento de dispositivos con DPS.
En un explorador web, vaya a la página de versión de SDK de Azure IoT para C.
Copie el nombre de etiqueta de la versión más reciente del SDK de Azure IoT para C, por ejemplo:
lts_03_2024
.Abra un símbolo del sistema de Windows y ejecute los siguientes comandos para clonar la última versión del SDK de dispositivo IoT de Azure para C del repositorio de GitHub. Reemplace
<release-tag>
por el nombre de la etiqueta que ha copiado en el paso 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 operación puede tardar varios minutos en completarse.
Una vez completada la operación, ejecute los siguientes comandos desde el directorio
azure-iot-sdk-c
:mkdir cmake cd cmake
El código de ejemplo usa un certificado X.509 para proporcionar atestación mediante la autenticación de X.509. Ejecute el siguiente comando para compilar una versión del SDK específica para su plataforma de desarrollo que incluya el cliente de aprovisionamiento de dispositivos. Se genera una solución de Visual Studio para el dispositivo simulado en el directorio
cmake
.Reemplace
<path
con la ruta absoluta al SDK de C que clonó.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 ..
Sugerencia
Si
cmake
no encuentra el compilador de C++, es posible que aparezcan errores de compilación al ejecutar el comando anterior. Si eso sucede, pruebe a ejecutar este comando en el símbolo del sistema de Visual Studio.Una vez realizada la compilación, las últimas líneas de salida son similares a las siguientes:
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 un símbolo del sistema de Windows y clone el SDK de Azure IoT para C# del repositorio de GitHub mediante el siguiente comando:
git clone https://github.com/Azure/azure-iot-sdk-csharp.git
Abra un símbolo del sistema de Windows y clone el SDK de Azure IoT para Node.js del repositorio de GitHub mediante el siguiente comando:
git clone https://github.com/Azure/azure-iot-sdk-node.git
Abra un símbolo del sistema de Windows y clone el SDK de dispositivo IoT de Azure para Python del repositorio de GitHub mediante el siguiente comando:
git clone -b v2 https://github.com/Azure/azure-iot-sdk-python.git --recursive
Nota:
Los ejemplos que se usan en este tutorial se encuentran en la rama v2 del repositorio azure-iot-sdk-python. La versión 3 del SDK de Python está disponible para su uso en la versión beta.
Abra un símbolo del sistema de Windows y clone los ejemplos de Azure IoT para Java del repositorio de GitHub mediante el siguiente comando:
git clone https://github.com/Azure/azure-iot-sdk-java.git --recursive
Vaya al directorio
azure-iot-sdk-java
raíz y compile el proyecto para descargar todos los paquetes necesarios.cd azure-iot-sdk-java mvn install -DskipTests=true
Creación de una cadena de certificados X.509
En esta sección, generará una cadena de certificados X.509 de tres certificados para probar cada dispositivo con este tutorial. Los certificados tienen la siguiente jerarquía.
Certificado raíz Mediante DPS puede cargar y comprobar el certificado raíz. Esta verificación permite que DPS confíe en ese certificado y verifique los certificados firmados por él.
Certificado intermedio: es habitual que se usen certificados intermedios para agrupar dispositivos de forma lógica por líneas de producto, divisiones de la empresa u otros criterios. En este tutorial se usa una cadena de certificados con un solo certificado intermedio, pero en un escenario de producción es posible que tenga varios. El certificado intermedio de esta cadena lo firma el certificado raíz. Este certificado se proporciona al grupo de inscripción creado en DPS. Esta configuración permite administrar un grupo completo de dispositivos que tienen certificados de dispositivo firmados por el mismo certificado intermedio.
Certificados de dispositivo: Los certificados de dispositivo (a veces llamados certificados hoja) están firmados por el certificado intermedio y se almacenan en el dispositivo junto con su clave privada. Idealmente, estos elementos confidenciales se almacenarían de forma segura con un HSM. El mismo certificado intermedio puede firmar varios certificados de dispositivo. Cada dispositivo presenta su certificado y clave privada junto con la cadena de certificados al intenta realizar el aprovisionamiento.
Para obtener más información sobre las cadenas de certificados, consulte Atestación de certificado X.509.
Configuración del entorno de OpenSSL X.509
En esta sección, creará los archivos de configuración de Openssl, la estructura de directorios y otros archivos usados por los comandos Openssl.
Abra un símbolo del sistema de Git Bash y vaya a la carpeta en la que quiere generar los certificados y claves X.509 para este tutorial.
Cree el archivo de configuración de OpenSSL denominado openssl_root_ca.cnf para el certificado de CA raíz. Los archivos de configuración de OpenSSL contienen directivas y definiciones que los comandos de OpenSSL consumen. Copie y pegue el siguiente texto en el archivo denominado 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
Cree el archivo de configuración de OpenSSL denominado openssl_device_intermediate_ca.cnf para usar con certificados intermedios y de dispositivo. Copie y pegue el texto siguiente en el archivo 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
Cree la estructura de directorio, el archivo de base de datos index.txt y el archivo del número de serie serie que utilizan los comandos OpenSSL en este tutorial:
mkdir certs csr newcerts private touch index.txt openssl rand -hex 16 > serial
Creación de un certificado de entidad de certificación raíz
Ejecute los siguientes comandos para crear una clave privada de CA raíz y un certificado de CA raíz. Utilice este certificado y clave para firmar el certificado intermedio.
En la terminal de Git Bash, cree una clave privada de CA raíz:
openssl genrsa -aes256 -passout pass:1234 -out ./private/azure-iot-test-only.root.ca.key.pem 4096
Cree un certificado de CA raíz:
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
La barra diagonal adicional que se proporciona para el nombre de firmante (
//CN=Azure IoT Hub CA Cert Test Only
) solo es necesaria para escapar la cadena con Git en plataformas Windows. En las plataformas Linux, proporcione el nombre del firmante con una sola barra diagonal (/CN=Azure IoT Hub CA Cert Test Only
).Examine el certificado de CA raíz:
openssl x509 -noout -text -in ./certs/azure-iot-test-only.root.ca.cert.pem
Observe que el Emisor y el Asunto constituyen ambos la CA raíz.
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)
Creación de un certificado de CA intermedio
Ejecute los siguientes comandos para crear una clave privada de CA intermedia y un certificado de CA intermedio. Utilice este certificado y clave para firmar los certificados de dispositivo.
En la terminal de Git, cree una clave privada de CA intermedia:
openssl genrsa -aes256 -passout pass:1234 -out ./private/azure-iot-test-only.intermediate.key.pem 4096
Cree una solicitud de firma de certificado de CA intermedio (CSR):
openssl req -new -sha256 -passin pass:1234 -config ./openssl_device_intermediate_ca.cnf -subj '//CN=Azure IoT Hub Intermediate Cert Test Only' -key ./private/azure-iot-test-only.intermediate.key.pem -out ./csr/azure-iot-test-only.intermediate.csr.pem
Importante
La barra diagonal adicional que se proporciona para el nombre de firmante (
//CN=Azure IoT Hub Intermediate Cert Test Only
) solo es necesaria para escapar la cadena con Git en plataformas Windows. En las plataformas Linux, proporcione el nombre del firmante con una sola barra diagonal (/CN=Azure IoT Hub Intermediate Cert Test Only
).Firme el certificado intermedio con el certificado de CA raíz
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 el certificado de CA intermedia:
openssl x509 -noout -text -in ./certs/azure-iot-test-only.intermediate.cert.pem
Observe que el Emisor es la CA raíz y el Asunto la CA intermedia.
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)
Creación de certificados de dispositivo
En esta sección, creará dos certificados de dispositivo y sus certificados de cadena completa. El certificado de cadena completa contiene el certificado de dispositivo, el certificado de CA intermedia y el certificado de CA raíz. El dispositivo debe presentar su certificado de cadena completa cuando se registra con DPS.
Cree la primera clave privada de dispositivo.
openssl genrsa -out ./private/device-01.key.pem 4096
Cree el CSR del certificado de dispositivo.
El nombre común del firmante (CN) del certificado de dispositivo debe establecerse en el id. de registro que el dispositivo utiliza para registrarse con DPS. El identificador de registro es una cadena que no distingue mayúsculas de minúsculas de caracteres alfanuméricos más los caracteres especiales:
'-'
,'.'
,'_'
,':'
. El último carácter debe ser alfanumérico o un guion ('-'
). El nombre común debe respetar este formato. DPS admite identificadores de registro de hasta 128 caracteres; sin embargo, la longitud máxima del nombre común del firmante en un certificado X.509 es de 64 caracteres. El identificador de registro, por lo tanto, se limita a 64 caracteres cuando se utilizan certificados X.509. En el caso de inscripciones de grupo, el identificador de registro también se usa como el identificador de dispositivo en IoT Hub.El nombre común del firmante se establece mediante el parámetro
-subj
. En el comando siguiente, el nombre común se establece en 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
La barra diagonal adicional que se proporciona para el nombre de firmante (
//CN=device-01
) solo es necesaria para escapar la cadena con Git en plataformas Windows. En las plataformas Linux, proporcione el nombre del firmante con una sola barra diagonal (/CN=device-01
).Firme el certificado de 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 el certificado de dispositivo:
openssl x509 -noout -text -in ./certs/device-01.cert.pem
Observe que el Emisor es la CA intermedia y el Asunto el identificador de registro del 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)
El dispositivo debe presentar la cadena de certificados completa cuando se autentica con DPS. Utilice el siguiente comando para crear la cadena de certificado:
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 el archivo de cadena de certificado, ./certs/device-01-full-chain.cert.pem, en un editor de texto para examinarlo. El texto de la cadena de certificados contiene la cadena completa de los tres certificados. Esta cadena de certificados se utiliza más adelante en este tutorial para aprovisionar
device-01
.El texto de la cadena completo tiene el formato siguiente:
-----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 crear la clave privada, el certificado X.509 y el certificado de cadena completa para el segundo dispositivo, copie y pegue este script en el símbolo del sistema de Git Bash. Para crear certificados para más dispositivos, puede modificar la variable
registration_id
declarada al principio del 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
La barra diagonal adicional que se proporciona para el nombre de firmante (
//CN=$registration_id
) solo es necesaria para escapar la cadena con Git en plataformas Windows. En las plataformas Linux, proporcione el nombre del firmante con una sola barra diagonal (/CN=$registration_id
).Nota:
Este script usa el identificador de registro como nombre de archivo base para la clave privada y los archivos de certificado. Si el identificador de registro contiene caracteres que no son caracteres de nombre de archivo válidos, deberá modificar el script en consecuencia.
Advertencia
El texto de los certificados solo contiene información de la clave pública.
Sin embargo, el dispositivo también debe tener acceso a la clave privada del certificado de dispositivo. Es necesario porque el dispositivo debe realizar la comprobación con esa clave en tiempo de ejecución cuando intenta realizar el aprovisionamiento. La confidencialidad de esta clave es una de las principales razones por las que se recomienda usar el almacenamiento basado en hardware en un HSM real para ayudar a proteger las claves privadas.
En el resto de este tutorial se usan los siguientes archivos:
Certificado | Archivo | Descripción |
---|---|---|
certificado de CA raíz | certs/azure-iot-test-only.root.ca.cert.pem | Cargado en DPS y comprobado. |
certificado de CA intermedia | certs/azure-iot-test-only.intermediate.cert.pem | Se usa para crear un grupo de inscripción en DPS. |
clave privada device-01 | private/device-01.key.pem | Lo usa el dispositivo para comprobar la propiedad del certificado de dispositivo durante la autenticación con DPS. |
certificado de cadena completa device-01 | certs/device-01-full-chain.cert.pem | Presentado por el dispositivo para autenticarse y registrarse en DPS. |
clave privada device-02 | private/device-02.key.pem | Lo usa el dispositivo para comprobar la propiedad del certificado de dispositivo durante la autenticación con DPS. |
certificado de cadena completa device-02 | certs/device-02-full-chain.cert.pem | Presentado por el dispositivo para autenticarse y registrarse en DPS. |
Verificación de la propiedad del certificado raíz
Para que DPS pueda validar la cadena de certificados del dispositivo durante la autenticación, debe cargar y comprobar la propiedad del certificado de CA raíz. Para agregar el certificado de CA raíz a la instancia de DPS, siga estos pasos:
En Azure Portal, vaya a la instancia de Device Provisioning Service (DPS).
Abra los Certificados en el menú de la izquierda y seleccione Agregar para agregar un nuevo certificado.
Escriba un nombre para mostrar descriptivo para el certificado. Vaya a la ubicación del archivo de certificado de CA raíz
certs/azure-iot-test-only.root.ca.cert.pem
. Seleccione Cargar.Seleccione la casilla para Establecer el estado del certificado en comprobado al cargar.
Seleccione Guardar.
El certificado se muestra en la pestaña de certificados con el estado Comprobado.
Actualización del almacén de certificados en dispositivos basados en Windows
En dispositivos que no usan Windows, puede pasar la cadena de certificados desde el código como el almacén de certificados.
En los dispositivos basados en Windows, debe agregar los certificados de firma (raíz e intermedio) a un almacén de certificados de Windows. De lo contrario, los certificados de firma no se transportarán a DPS por un canal seguro con Seguridad de la capa de transporte (TLS).
Sugerencia
También es posible usar OpenSSL en lugar del canal seguro (Schannel) con el SDK de C. Para más información sobre el uso de OpenSSL, consulte Uso de OpenSSL en el SDK.
Para agregar los certificados de firma al almacén de certificados en dispositivos basados en Windows:
En la terminal de Git Bash, convierta los certificados de firma a
.pfx
tal como se indica a continuación.Certificado de CA raíz:
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 CA intermedia:
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
Haga clic en el botón derecho del botón de Inicio de Windows y seleccione Ejecutar. Escriba certmgr.msc y seleccione Aceptar para iniciar el administrador de certificados.
En el administrador de certificados, en Certificados: usuario actual, seleccione Entidades de certificación raíz de confianza. A continuación, en el menú seleccione Acción>Todas las tareas>Importar.
Siga los pasos del Asistente para la importación de certificados para importar
root.pfx
.- Asegúrese de buscar por Intercambio de información personal (.pfx) .
- Use
1234
como contraseña. - Coloque el certificado en el almacén de certificados Entidades de certificación raíz de confianza.
Repita estos pasos del administrador de certificados para importar
intermediate.pfx
.- Coloque el certificado en el almacén de certificados Entidades de certificación intermedias.
Los certificados de firma ahora son de confianza en el dispositivo basado en Windows y se puede transportar la cadena completa a DPS.
Creación de un grupo de inscripción
Inicie sesión en Azure Portal y vaya a la instancia de Device Provisioning Service.
Seleccione Administrar inscripciones de la sección Configuración del menú de navegación.
En la parte superior de la página, seleccione Agregar grupo de inscripciones.
En la pestaña Registro y aprovisionamiento de la página Agregar grupo de inscripción, proporcione la siguiente información para configurar los detalles del grupo de inscripción:
Campo Descripción Atestación Seleccione Certificados intermedios X.509 como mecanismo de atestación si deseara cargar certificados intermedios que se usarán solo para este grupo de inscripción o seleccione certificados X.509 cargados en este servicio de aprovisionamiento de dispositivos si ya ha cargado certificados intermedios. Configuración del certificado X.509 Según el método de atestación que haya elegido, cargue o seleccione los certificados intermedios principales y secundarios para este grupo de inscripción. Nombre de grupo Proporcione un nombre para el grupo de dispositivos. El nombre del grupo de inscripción es una cadena que no distingue mayúsculas de minúsculas (de hasta 128 caracteres) de caracteres alfanuméricos más los caracteres especiales: '-'
,'.'
,'_'
,':'
. El último carácter debe ser alfanumérico o un guion ('-'
).Estado de aprovisionamiento Active la casilla Habilitar esta inscripción si desea que este grupo de inscripción esté disponible para aprovisionar dispositivos. Desactive esta casilla si desea que el grupo esté deshabilitado. Podrá cambiar esta configuración más adelante. Directiva de reaprovisionamiento Elija una directiva de reaprovisionamiento que refleje cómo desea que DPS controle los dispositivos que soliciten el reaprovisionamiento. Para obtener más información, consulte Directivas de reaprovisionamiento Seleccione Siguiente: centros de IoT.
En la pestaña Centros de IoT de la página Agregar grupo de inscripción, proporcione la siguiente información para determinar los centros de IoT a los que puede aprovisionar dispositivos el grupo de inscripción:
Campo Descripción Centros de IoT de destino Seleccione uno o varios de los centros de IoT vinculados o agregue un nuevo vínculo a un centro de IoT. Para más información sobre cómo vincular centros de IoT a la instancia de DPS, consulte Vinculación y administración de centros de IoT. Directiva de asignación Si seleccionó más de un centro de IoT vinculado, seleccione cómo quiere asignar dispositivos a los distintos centros. Para más información sobre las directivas de asignación, consulte Uso de directivas de asignación.
Si seleccionó solo un centro de IoT vinculado, se recomienda usar la directiva de distribución uniformemente ponderada.Seleccione Siguiente: configuración del dispositivo
En la pestaña Configuración del dispositivo de la página Agregar grupo de inscripción, proporcione la siguiente información para definir cómo se configurarán los dispositivos recién aprovisionados:
Campo Descripción IoT Edge Compruebe Habilitar IoT Edge en dispositivos aprovisionados si todos los dispositivos aprovisionados a través de este grupo ejecutarán Azure IoT Edge. Desactive esta casilla si este grupo es solo para dispositivos no habilitados para IoT Edge. Todos los dispositivos de un grupo estarán habilitados para IoT Edge o ninguno. Etiquetas de dispositivo Use este cuadro de texto para proporcionar las etiquetas que quiera aplicar a los dispositivos gemelos de dispositivos aprovisionados. Propiedades deseadas Use este cuadro de texto para proporcionar las propiedades deseadas que quiera aplicar a los dispositivos gemelos de dispositivos aprovisionados. Para más información, consulte Información y uso de dispositivos gemelos en IoT Hub.
Seleccione Siguiente: Review + create (Revisar y crear).
En la pestaña Revisar y crear, compruebe todos los valores y seleccione Crear.
Preparación y ejecución del código de aprovisionamiento de dispositivos
En esta sección, actualizará el código de ejemplo con la información de la instancia de Device Provisioning Service. Si se autentica un dispositivo, se asigna a un centro de IoT vinculado a la instancia de Device Provisioning Service configurada en esta sección.
En esta sección, usted usa el símbolo del sistema de Git Bash y el IDE de Visual Studio.
Configuración del código del dispositivo de aprovisionamiento
En esta sección, actualizará el código de ejemplo con la información de la instancia de Device Provisioning Service.
En Azure Portal, seleccione la pestaña Información general de la instancia del servicio Device Provisioning y anote el valor de Ámbito de id.
Inicie Visual Studio y abra el nuevo archivo de solución que se creó en el directorio
cmake
que creó en el directorio raíz del repositorio de Git azure-iot-sdk-c. El archivo de solución se llamaazure_iot_sdks.sln
.En el Explorador de soluciones de Visual Studio, vaya a Provisioning_Samples > prov_dev_client_sample > Archivos de código fuente y abra prov_dev_client_sample.c.
Busque la constante
id_scope
y reemplace el valor por el valor de Ámbito de id. que copió anteriormente. Por ejemplo:static const char* id_scope = "0ne00000A0A";
Busque la definición de la función
main()
en el mismo archivo. Asegúrese de que la variablehsm_type
esté establecida enSECURE_DEVICE_TYPE_X509
y que se marquen como comentario todas las demás líneashsm_type
. Por ejemplo:SECURE_DEVICE_TYPE hsm_type; //hsm_type = SECURE_DEVICE_TYPE_TPM; hsm_type = SECURE_DEVICE_TYPE_X509; //hsm_type = SECURE_DEVICE_TYPE_SYMMETRIC_KEY;
Guarde los cambios.
Haga clic con el botón derecho en el proyecto prov_dev_client_sample y seleccione Establecer como proyecto de inicio.
Configuración del código auxiliar del HSM personalizado
Los detalles de la interacción con el almacenamiento seguro real basado en hardware varían en función del hardware del dispositivo. Las cadenas de certificados usadas por los dispositivos simulados en este tutorial estarán codificadas en el código auxiliar de HSM personalizado. En un escenario real, la cadena de certificados se almacenaría en el hardware del HSM real para proporcionar una mejor seguridad para la información confidencial. A continuación, se implementarán métodos similares a los métodos de código auxiliar usados en este ejemplo para leer los secretos de ese almacenamiento basado en hardware.
Aunque el hardware de HSM no sea un requisito, se recomienda proteger la información confidencial, como la clave privada del certificado. Si el ejemplo llama a un HSM real, la clave privada no estará presente en el código fuente. La clave en el código fuente queda expuesta a cualquier persona que pueda ver el código. Esto se ha hecho así únicamente en este tutorial para ayudar al aprendizaje.
Para actualizar el código auxiliar del HSM personalizado con el fin de simular la identidad del dispositivo con el identificador device-01
:
En el Explorador de soluciones de Visual Studio, vaya a Provisioning_Samples > custom_hsm_example > Archivos de código fuente y abra custom_hsm_example.c.
Actualice el valor de cadena de la constante de cadena
COMMON_NAME
con el nombre común que utilizó al generar el certificado de dispositivo.static const char* const COMMON_NAME = "device-01";
En la terminal de Git Bash, ejecute el siguiente comando para generar la constante de cadena para el certificado de dispositivo:
sed -e 's/^/"/;$ !s/$/""\\n"/;$ s/$/"/' ./certs/device-01-full-chain.cert.pem
Copie la salida de este comando.
Actualice el valor de cadena de la cadena de constante
CERTIFICATE
con la cadena de certificados que ha guardado en ./certs/device-01-full-chain.cert.pem después de generar los certificados. Utilice el texto del certificado de salida del paso anterior para el valor constante.La sintaxis del texto del certificado debe coincidir con el siguiente patrón sin espacios adicionales ni análisis realizados por 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-----";
En Git Bash, ejecute el siguiente comando para generar la constante de cadena para la clave privada del dispositivo:
sed -e 's/^/"/;$ !s/$/""\\n"/;$ s/$/"/' ./private/device-01.key.pem
Copie la salida de este comando.
Actualice el valor de cadena de la constante
PRIVATE_KEY
con la clave privada del certificado de dispositivo. Utilice el texto de la clave privada de salida del paso anterior para el valor constante.La sintaxis del texto de clave privada debe coincidir con el siguiente patrón sin espacios adicionales ni análisis realizados por Visual Studio.
static const char* const PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----\n" "MIIJJwIBAAKCAgEAtjvKQjIhp0EE1PoADL1rfF/W6v4vlAzOSifKSQsaPeebqg8U\n" ... "X7fi9OZ26QpnkS5QjjPTYI/wwn0J9YAwNfKSlNeXTJDfJ+KpjXBcvaLxeBQbQhij\n" "-----END RSA PRIVATE KEY-----";
Guarde los cambios.
Haga clic con el botón derecho en el proyecto custom_hsm_example y seleccione Compilar.
Importante
Debe compilar el proyecto custom_hsm_example antes de compilar el resto de la solución en la sección siguiente.
Ejecución del ejemplo
En el menú de Visual Studio, seleccione Depurar>Iniciar sin depurar para ejecutar la solución. Cuando se le pida que recompile el proyecto, seleccione Sí para recompilar el proyecto antes de su ejecución.
La salida siguiente es un ejemplo de arranque correcto del dispositivo simulado
device-01
y su conexión al servicio de aprovisionamiento. El dispositivo se ha asignado a un centro de IoT y se ha 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 los pasos descritos en Configuración del código auxiliar de HSM personalizado para el segundo dispositivo (
device-02
) y vuelva a ejecutar el ejemplo. Utilice los siguientes valores para ese dispositivo:Descripción Value Nombre común "device-02"
Cadena de certificados completa Generación del texto mediante ./certs/device-02-full-chain.cert.pem Clave privada Generación del texto mediante ./private/device-02.key.pem La salida siguiente es un ejemplo de arranque correcto del dispositivo simulado
device-02
y su conexión al servicio de aprovisionamiento. El dispositivo se ha asignado a un centro de IoT y se ha 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:
El código de ejemplo de C# está configurado para usar los certificados X.509 almacenados en un archivo con formato PKCS12 protegido con contraseña (.pfx). Los certificados de cadena completos que ha creado anteriormente están en formato PEM. Para convertir los certificados de cadena completa en formato PKCS#12, escriba los comandos siguientes en el símbolo del sistema de Git Bash desde el directorio donde ha ejecutado anteriormente los comandos de 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
En el resto de esta sección, use el símbolo del sistema de Windows.
En Azure Portal, seleccione la pestaña Información general de Device Provisioning Service.
Copie el valor de del Ámbito de id.
En el símbolo del sistema de Windows, cambie al directorio X509Sample. Este directorio se encuentra en el repositorio del SDK que clonó en el paso anterior: .\azure-iot-sdk-csharp\provisioning\device\samples\getting started\X509Sample.
Escriba el siguiente comando para compilar y ejecutar el ejemplo de aprovisionamiento de dispositivos X.509. Reemplace
<id-scope>
con el ámbito de id. que copió de Azure Portal. Reemplace<your-certificate-folder>
por la ruta de acceso a la carpeta en la que ha ejecutado los comandos de OpenSSL.dotnet run -- -s <id-scope> -c <your-certificate-folder>\certs\device-01-full-chain.cert.pfx -p 1234
El dispositivo se conecta a DPS y se asigna a un centro de IoT. A continuación, el dispositivo envía un mensaje de telemetría al centro de IoT. Debería ver una salida similar al ejemplo siguiente:
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:
Si no especifica el certificado y la contraseña en la línea de comandos, el archivo de certificado tendrá como valor predeterminado ./certificate.pfx y se le pedirá la contraseña.
Se pueden usar más parámetros para cambiar TransportType (-t) y GlobalDeviceEndpoint (-g). Para obtener una lista completa de parámetros, escriba
dotnet run -- --help
.Para registrar el segundo dispositivo, vuelva a ejecutar el ejemplo con su certificado de cadena completa.
dotnet run -- -s <id-scope> -c <your-certificate-folder>\certs\device-02-full-chain.cert.pfx -p 1234
En los pasos siguientes, use el símbolo del sistema de Windows.
En Azure Portal, seleccione la pestaña Información general de Device Provisioning Service.
Copie el valor de del Ámbito de id.
En el símbolo del sistema de Windows, vaya al directorio de ejemplo e instale los paquetes necesarios para el ejemplo. La ruta de acceso que se muestra es relativa a la ubicación en la que ha clonado el SDK.
cd .\azure-iot-sdk-node\provisioning\device\samples npm install
En la carpeta provisioning\device\samples, abra register_x509.js y examine el código.
El ejemplo tiene como valor predeterminado MQTT como protocolo de transporte. Si desea usar otro protocolo, marque como comentario la línea siguiente y quite la marca de comentario de la línea del protocolo adecuado.
var ProvisioningTransport = require('azure-iot-provisioning-device-mqtt').Mqtt;
En el ejemplo se usan cinco variables de entorno para autenticar y aprovisionar un dispositivo IoT mediante DPS. Estas variables de entorno son:
Nombre de la variable Descripción PROVISIONING_HOST
Punto de conexión que se va a usar para conectarse a la instancia de DPS. Para este tutorial, use el punto de conexión global, global.azure-devices-provisioning.net
.PROVISIONING_IDSCOPE
Ámbito de identificador de la instancia de DPS. PROVISIONING_REGISTRATION_ID
El identificador de registro del dispositivo. Debe coincidir con el nombre común del firmante en el certificado de dispositivo. CERTIFICATE_FILE
Ruta de acceso al archivo de certificado de cadena completa del dispositivo. KEY_FILE
Ruta de acceso al archivo de clave privada del certificado del dispositivo. El método
ProvisioningDeviceClient.register()
intenta registrar el dispositivo.Agregue las variables de entorno para el punto de conexión del dispositivo global y el ámbito de id. Reemplace
<id-scope>
con el valor que copió de Azure Portal.set PROVISIONING_HOST=global.azure-devices-provisioning.net set PROVISIONING_IDSCOPE=<id-scope>
Establezca la variable de entorno del identificador de registro del dispositivo. El identificador de registro del dispositivo IoT debe coincidir con el nombre común del firmante que aparece en su certificado de dispositivo. En este tutorial, device-01 es el nombre del firmante y el identificador de registro del dispositivo.
set PROVISIONING_REGISTRATION_ID=device-01
Establezca las variables de entorno para el certificado de cadena completa del dispositivo y los archivos de clave privada del dispositivo que ha generado anteriormente. Reemplace
<your-certificate-folder>
por la ruta de acceso a la carpeta en la que ha ejecutado los comandos de 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
Ejecute el ejemplo y compruebe que el dispositivo se haya aprovisionado correctamente.
node register_x509.js
Debería ver una salida similar al ejemplo siguiente:
registration succeeded assigned hub=contoso-hub-2.azure-devices.net deviceId=device-01 Client connected send status: MessageEnqueued
Actualice las variables de entorno del segundo dispositivo (
device-02
) según la tabla siguiente y vuelva a ejecutar el ejemplo.Variable de entorno Value PROVISIONING_REGISTRATION_ID device-02
CERTIFICATE_FILE <your-certificate-folder>\certs\device-02-full-chain.cert.pem KEY_FILE <your-certificate-folder>\private\device-02.key.pem
En los pasos siguientes, use el símbolo del sistema de Windows.
En Azure Portal, seleccione la pestaña Información general de Device Provisioning Service.
Copie el Ámbito de id.
En el símbolo del sistema de Windows, vaya al directorio del ejemplo provision_x509.py. La ruta de acceso que se muestra es relativa a la ubicación en la que ha clonado el SDK.
cd .\azure-iot-sdk-python\samples\async-hub-scenarios
En este ejemplo se usan seis variables de entorno para autenticar y aprovisionar un dispositivo IoT mediante DPS. Estas variables de entorno son:
Nombre de la variable Descripción PROVISIONING_HOST
Punto de conexión que se va a usar para conectarse a la instancia de DPS. Para este tutorial, use el punto de conexión global, global.azure-devices-provisioning.net
.PROVISIONING_IDSCOPE
Ámbito de identificador de la instancia de DPS. DPS_X509_REGISTRATION_ID
El identificador de registro del dispositivo. Debe coincidir con el nombre común del firmante en el certificado de dispositivo. X509_CERT_FILE
Ruta de acceso al archivo de certificado de cadena completa del dispositivo. X509_KEY_FILE
Ruta de acceso al archivo de clave privada del certificado del dispositivo. PASS_PHRASE
Frase de contraseña usada para cifrar el archivo de clave privada (si se usa). No es necesaria para este tutorial. Agregue las variables de entorno para el punto de conexión del dispositivo global y el ámbito de id. Para la variable de ámbito de id., utilice el valor que copió de Azure Portal.
set PROVISIONING_HOST=global.azure-devices-provisioning.net set PROVISIONING_IDSCOPE=<ID scope for your DPS resource>
Establezca la variable de entorno del identificador de registro del dispositivo. El identificador de registro del dispositivo IoT debe coincidir con el nombre común del firmante que aparece en su certificado de dispositivo. En este tutorial, device-01 es el nombre del firmante y el identificador de registro del dispositivo.
set DPS_X509_REGISTRATION_ID=device-01
Establezca las variables de entorno para el certificado de cadena completa del dispositivo y los archivos de clave privada del dispositivo que ha generado anteriormente. Reemplace
<your-certificate-folder>
por la ruta de acceso a la carpeta en la que ha ejecutado los comandos de 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 el código del archivo provision_x509.py. Si no usa la versión 3.7 de Python o una posterior, realice el cambio en el código mencionado aquí para reemplazar
asyncio.run(main())
y guarde el cambio.Ejecute el ejemplo. El ejemplo se conecta a DPS, que aprovisionará el dispositivo en un centro de IoT. Una vez aprovisionado el dispositivo, el ejemplo envía algunos mensajes de prueba al centro de IoT.
python provision_x509.py
Debería ver una salida similar al ejemplo siguiente:
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
Actualice las variables de entorno del segundo dispositivo (
device-02
) según la tabla siguiente y vuelva a ejecutar el ejemplo.Variable de entorno Value DPS_X509_REGISTRATION_ID device-02
X509_CERT_FILE <your-certificate-folder>\certs\device-02-full-chain.cert.pem X509_KEY_FILE <your-certificate-folder>\private\device-02.key.pem
En los siguientes pasos, usará el símbolo del sistema de Windows y el símbolo del sistema de Git Bash.
En Azure Portal, seleccione la pestaña Información general de Device Provisioning Service.
Copie el Ámbito de id.
En el símbolo del sistema de Windows, vaya a la carpeta del proyecto de ejemplo. La ruta de acceso que se muestra es relativa a la ubicación en la que ha clonado el SDK.
cd .\azure-iot-sdk-java\provisioning\provisioning-device-client-samples\provisioning-X509-sample
Escriba la información del servicio de aprovisionamiento y de la identidad X.509 en el código de ejemplo. Se utiliza durante el aprovisionamiento para la atestación del dispositivo simulado, antes del registro de dispositivo.
Abra el archivo
.\src\main\java\samples\com\microsoft\azure\sdk\iot\ProvisioningX509Sample.java
en el editor que prefiera.Actualice los siguientes valores. Para
idScope
, use el Ámbito de id. que ha copiado anteriormente. Para el punto de conexión global, use el Punto de conexión de dispositivo global. Este punto de conexión es el mismo para cada instancia de 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]";
El ejemplo utiliza de manera predeterminada HTTPS como protocolo de transporte. Si quiere cambiar el protocolo, marque como comentario la línea siguiente y quite la marca de comentario de la línea del protocolo que quiera usar.
private static final ProvisioningDeviceClientTransportProtocol PROVISIONING_DEVICE_CLIENT_TRANSPORT_PROTOCOL = ProvisioningDeviceClientTransportProtocol.HTTPS;
Actualice el valor de la cadena de constante
leafPublicPem
con el valor del certificado del dispositivo, device-01.cert.pem.La sintaxis del texto del certificado debe coincidir con el siguiente patrón sin espacios ni caracteres adicionales.
private static final String leafPublicPem = "-----BEGIN CERTIFICATE-----\n" "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n" ... "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n" "-----END CERTIFICATE-----";
La actualización manual de este valor de cadena puede ser propensa a errores. Para generar la sintaxis correcta, puede copiar y pegar el siguiente comando en el símbolo del sistema de Git Bash y presione ENTRAR. Este comando genera la sintaxis para el valor de constante de la cadena
leafPublicPem
y la escribe en la salida.sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' ./certs/device-01.cert.pem
Copie y pegue el texto del certificado de salida para el valor de constante.
Actualice el valor de cadena de la constante
leafPrivateKey
con la clave privada sin cifrar para el certificado de dispositivo: uncrypted-device-key.pem.La sintaxis del texto de la clave privada debe coincidir con el siguiente patrón sin espacios ni caracteres adicionales.
private static final String leafPrivateKey = "-----BEGIN PRIVATE KEY-----\n" + "MIIJJwIBAAKCAgEAtjvKQjIhp0EE1PoADL1rfF/W6v4vlAzOSifKSQsaPeebqg8U\n" + ... "X7fi9OZ26QpnkS5QjjPTYI/wwn0J9YAwNfKSlNeXTJDfJ+KpjXBcvaLxeBQbQhij\n" + "-----END PRIVATE KEY-----";
Para generar la sintaxis correcta, puede copiar y pegar el siguiente comando en el símbolo del sistema de Git Bash y presione ENTRAR. Este comando genera la sintaxis para el valor de constante de la cadena
leafPrivateKey
y la escribe en la salida.sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' ./private/device-01.key.pem
Copie y pegue el texto de la clave privada de salida para el nuevo valor de la constante.
Agregue una cadena constante
rootPublicPem
con el valor del certificado de CA raíz, azure-iot-test-only.root.ca.cert.pem. Puede agregarlo justo después de la constanteleafPrivateKey
.La sintaxis del texto del certificado debe coincidir con el siguiente patrón sin espacios ni caracteres adicionales.
private static final String rootPublicPem = "-----BEGIN CERTIFICATE-----\n" "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n" ... "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n" "-----END CERTIFICATE-----";
Para generar la sintaxis correcta, puede copiar y pegar el siguiente comando en el símbolo del sistema de Git Bash y presione ENTRAR. Este comando genera la sintaxis para el valor de constante de la cadena
rootPublicPem
y la escribe en la salida.sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' ./certs/azure-iot-test-only.root.ca.cert.pem
Copie y pegue el texto del certificado de salida para el valor de constante.
Agregue una cadena constante
intermediatePublicPem
con el valor del certificado de CA intermedio, azure-iot-test-only.intermediate.cert.pem. Puede agregarlo justo después de la constante anterior.La sintaxis del texto del certificado debe coincidir con el siguiente patrón sin espacios ni caracteres adicionales.
private static final String intermediatePublicPem = "-----BEGIN CERTIFICATE-----\n" "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n" ... "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n" "-----END CERTIFICATE-----";
Para generar la sintaxis correcta, puede copiar y pegar el siguiente comando en el símbolo del sistema de Git Bash y presione ENTRAR. Este comando genera la sintaxis para el valor de constante de la cadena
intermediatePublicPem
y la escribe en la salida.sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' ./certs/azure-iot-test-only.intermediate.cert.pem
Copie y pegue el texto del certificado de salida para el valor de constante.
Agregue las siguientes líneas al método
main
.// For group enrollment uncomment this line //signerCertificatePemList.add("<Your Signer/intermediate Certificate Here>");
Agregue estas dos líneas directamente debajo de ellas para agregar los certificados de CA intermedio y raíz a la cadena de firma. La cadena de firma debe incluir toda la cadena de certificados hasta un certificado que haya comprobado con DPS.
signerCertificatePemList.add(intermediatePublicPem); signerCertificatePemList.add(rootPublicPem);
Nota:
El orden en que se agregan los certificados de firma es importante. Si cambia, se producirá un error en el ejemplo.
Guarde los cambios.
Compile el ejemplo y luego vaya a la carpeta
target
.mvn clean install cd target
La compilación genera el archivo .jar en la carpeta
target
con el siguiente formato de archivo:provisioning-x509-sample-{version}-with-deps.jar
; por ejemplo:provisioning-x509-sample-1.8.1-with-deps.jar
. Ejecute el archivo .jar. Es posible que tenga que reemplazar la versión en el comando siguiente.java -jar ./provisioning-x509-sample-1.8.1-with-deps.jar
El ejemplo se conecta a DPS, que aprovisiona el dispositivo a un centro de IoT. Una vez aprovisionado el dispositivo, el ejemplo enviará algunos mensajes de prueba al centro de 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!
Actualice las constantes del segundo dispositivo (
device-02
) según la tabla siguiente, recompile y vuelva a ejecutar el ejemplo.Constante Archivo que se va a usar leafPublicPem
./certs/device-02.cert.pem leafPrivateKey
./private/device-02.key.pem
Confirmación del registro de aprovisionamiento de dispositivos
Examine las entradas de registro del grupo de inscripciones para ver los detalles de registro de los dispositivos:
En Azure Portal, vaya a la instancia del servicio Device Provisioning.
En el menú de Configuración, seleccione Administrar inscripciones.
Seleccione Grupos de inscripción. La entrada del grupo de inscripciones X.509 que ha creado anteriormente debería aparecer en la lista.
Seleccione la entrada de inscripción. A continuación, seleccione Detalles, junto a Estado de registro, para ver los dispositivos que se hayan registrado mediante el grupo de inscripciones. El centro de IoT al que se ha asignado cada uno de los dispositivos, sus identificadores de dispositivo, así como las fechas y horas en que se han registrado aparecen en la lista.
Puede seleccionar uno de los dispositivos para ver más detalles de ese dispositivo.
Para comprobar los dispositivos en el centro de IoT:
En Azure Portal, vaya al centro de IoT al que se asignó el dispositivo.
En el menú Administración de dispositivos, seleccione Dispositivos.
Si los dispositivos se han aprovisionado correctamente, sus identificadores de dispositivo, device-01 y device-02, deben aparecer en la lista, con Estado establecido como habilitado. Si no ve los dispositivos, seleccione Actualizar.
Limpieza de recursos
Cuando haya terminado de probar y explorar este ejemplo de cliente de dispositivo, siga estos pasos para eliminar todos los recursos creados en este tutorial.
- Cierre la ventana de salida de ejemplo del cliente del dispositivo en su máquina.
Eliminación del grupo de inscripción
En Azure Portal, seleccione Todos los recursos en el menú de la izquierda.
Seleccione la instancia de DPS.
En el menú de Configuración, seleccione Administrar inscripciones.
Seleccione la pestaña Grupos de inscripción.
Seleccione el grupo de inscripción que usó para este tutorial.
En la página Detalles de inscripción, seleccione Detalles junto a Estado de registro. A continuación, seleccione la casilla situada junto al encabezado de columna Id. de dispositivo para seleccionar todas las entradas de registro del grupo de inscripción. Seleccione Eliminar en la parte superior de la página para eliminar las entradas de registro.
Importante
La eliminación de un grupo de inscripción no elimina las entradas de registro asociadas a él. Estos registros huérfanos contarán para la cuota de registros de la instancia de DPS. Por este motivo, se recomienda eliminar todas las entradas de registro asociadas a un grupo de inscripción antes de eliminar el propio grupo de inscripción.
Vuelva a la página Administrar inscripciones y asegúrese de que esté seleccionada la pestaña Grupos de inscripción.
Active la casilla situada junto al nombre del grupo del grupo de inscripción que usó para este tutorial.
En la parte superior de la página, seleccione Eliminar.
Eliminación de certificados de CA registrados de DPS
- Seleccione Certificados en el menú izquierdo de la instancia de DPS. Para cada certificado que haya cargado y comprobado en este tutorial, seleccione el certificado y, luego, Eliminar para confirmar su elección de eliminarlo.
Eliminación de registros de dispositivos de IoT Hub
En Azure Portal, seleccione Todos los recursos en el menú de la izquierda.
Seleccione IoT Hub.
En el menú Exploradores, seleccione Dispositivos de IoT.
Seleccione la casilla situada junto al Id. de dispositivo de los dispositivos que registró en este tutorial. Por ejemplo, device-01 y device-02.
En la parte superior de la página, seleccione Eliminar.
Pasos siguientes
En este tutorial, ha aprovisionado varios dispositivos X.509 a su centro de Iot mediante un grupo de inscripción. Luego, obtenga información sobre cómo aprovisionar dispositivos IoT en varios centros.