Compartir a través de


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

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.

Los siguientes requisitos previos corresponden a un entorno de desarrollo de Windows.

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

  1. En un explorador web, vaya a la página de versión de SDK de Azure IoT para C.

  2. Copie el nombre de etiqueta de la versión más reciente del SDK de Azure IoT para C, por ejemplo: lts_03_2024.

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

  4. Una vez completada la operación, ejecute los siguientes comandos desde el directorio azure-iot-sdk-c:

    mkdir cmake
    cd cmake
    
  5. 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.

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

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

Diagram that shows relationship of root C A, intermediate C A, and device certificates.

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.

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

  2. 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
    
  3. 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
    
  4. Cree la estructura de directorio, el archivo de base de datos index.txt y el archivo del número de serie serial 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.

  1. 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
    
  2. 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).

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

  1. 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
    
  2. 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).

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

  1. Cree la primera clave privada de dispositivo.

    openssl genrsa -out ./private/device-01.key.pem 4096
    
  2. 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).

  3. 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
    
  4. 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)
    
  5. 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
    
  6. 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-----
    
  7. 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:

  1. En Azure Portal, vaya a la instancia de Device Provisioning Service (DPS).

  2. Abra los Certificados en el menú de la izquierda y seleccione Agregar para agregar un nuevo certificado.

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

  4. Seleccione la casilla para Establecer el estado del certificado en comprobado al cargar.

    Screenshot that shows adding the root CA certificate and the set certificate status to verified on upload box selected.

  5. Seleccione Guardar.

  6. El certificado se muestra en la pestaña de certificados con el estado Comprobado.

    Screenshot that shows the verified root C A certificate in the list of certificates.

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:

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

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

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

  1. Inicie sesión en Azure Portal y vaya a la instancia de Device Provisioning Service.

  2. Seleccione Administrar inscripciones de la sección Configuración del menú de navegación.

  3. En la parte superior de la página, seleccione Agregar grupo de inscripciones.

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

    Screenshot that shows adding an enrollment group for X.509 certificate attestation.

  5. Seleccione Siguiente: centros de IoT.

  6. 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 Distribución uniformemente ponderada.

    Screenshot that shows connecting IoT hubs to the new enrollment group.

  7. Seleccione Siguiente: configuración del dispositivo

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

  9. Seleccione Siguiente: Review + create (Revisar y crear).

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

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

    Screenshot that shows the ID scope on the DPS overview pane.

  2. 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 llama azure_iot_sdks.sln.

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

  4. 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";
    
  5. Busque la definición de la función main() en el mismo archivo. Asegúrese de que la variable hsm_type esté establecida en SECURE_DEVICE_TYPE_X509 y que se marquen como comentario todas las demás líneas hsm_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;
    
  6. Guarde los cambios.

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

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

  2. 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";
    
  3. 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.

  4. 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-----";        
    
  5. 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.

  6. 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-----";
    
  7. Guarde los cambios.

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

  1. 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 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:
    
  2. 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.

  1. En Azure Portal, seleccione la pestaña Información general de Device Provisioning Service.

  2. Copie el valor de del Ámbito de id.

    Screenshot of the ID scope on Azure portal.

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

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

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

  1. En Azure Portal, seleccione la pestaña Información general de Device Provisioning Service.

  2. Copie el valor de del Ámbito de id.

    Screenshot of the ID scope in the Azure portal.

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

  5. 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>
    
  6. 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
    
  7. 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
    
  8. 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
    
  9. 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.

  1. En Azure Portal, seleccione la pestaña Información general de Device Provisioning Service.

  2. Copie el Ámbito de id.

    Screenshot of the ID scope in the Azure portal.

  3. 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.
  4. 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>
    
  5. 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
    
  6. 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
    
  7. 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.

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

  1. En Azure Portal, seleccione la pestaña Información general de Device Provisioning Service.

  2. Copie el Ámbito de id.

    Screenshot of the ID scope in the Azure portal.

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

    1. Abra el archivo .\src\main\java\samples\com\microsoft\azure\sdk\iot\ProvisioningX509Sample.java en el editor que prefiera.

    2. 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]";
      
    3. 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;
      
    4. 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.

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

    6. 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 constante leafPrivateKey.

      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.

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

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

    9. Guarde los cambios.

  5. Compile el ejemplo y luego vaya a la carpeta target.

    mvn clean install
    cd target
    
  6. 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 [0d143280-dbc7-405f-a61e-fcc7a1d80b87] Message Id [4d8d39c8-5a38-4299-8f07-3ae02cdc3218] )
    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 [0d143280-dbc7-405f-a61e-fcc7a1d80b87] Message Id [4d8d39c8-5a38-4299-8f07-3ae02cdc3218] )
    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 [0d143280-dbc7-405f-a61e-fcc7a1d80b87] Message Id [4d8d39c8-5a38-4299-8f07-3ae02cdc3218] )
    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 [0d143280-dbc7-405f-a61e-fcc7a1d80b87] Message Id [4d8d39c8-5a38-4299-8f07-3ae02cdc3218] ) with status OK
    Message sent!
    
  7. 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:

  1. En Azure Portal, vaya a la instancia del servicio Device Provisioning.

  2. En el menú de Configuración, seleccione Administrar inscripciones.

  3. Seleccione Grupos de inscripción. La entrada del grupo de inscripciones X.509 que ha creado anteriormente debería aparecer en la lista.

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

    Screenshot that shows the registration status details for the enrollment group on Azure portal.

  5. Puede seleccionar uno de los dispositivos para ver más detalles de ese dispositivo.

Para comprobar los dispositivos en el centro de IoT:

  1. En Azure Portal, vaya al centro de IoT al que se asignó el dispositivo.

  2. En el menú Administración de dispositivos, seleccione Dispositivos.

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

    Screenshot that shows the devices are registered with the I o T hub in Azure portal.

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.

  1. Cierre la ventana de salida de ejemplo del cliente del dispositivo en su máquina.

Eliminación del grupo de inscripción

  1. En Azure Portal, seleccione Todos los recursos en el menú de la izquierda.

  2. Seleccione la instancia de DPS.

  3. En el menú de Configuración, seleccione Administrar inscripciones.

  4. Seleccione la pestaña Grupos de inscripción.

  5. Seleccione el grupo de inscripción que usó para este tutorial.

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

  7. Vuelva a la página Administrar inscripciones y asegúrese de que esté seleccionada la pestaña Grupos de inscripción.

  8. Active la casilla situada junto al nombre del grupo del grupo de inscripción que usó para este tutorial.

  9. En la parte superior de la página, seleccione Eliminar.

Eliminación de certificados de CA registrados de DPS

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

  1. En Azure Portal, seleccione Todos los recursos en el menú de la izquierda.

  2. Seleccione IoT Hub.

  3. En el menú Exploradores, seleccione Dispositivos de IoT.

  4. Seleccione la casilla situada junto al Id. de dispositivo de los dispositivos que registró en este tutorial. Por ejemplo, device-01 y device-02.

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