Partager via


Tutoriel : Provisionner plusieurs appareils X.509 à l’aide de groupes d’inscriptions

Dans ce tutoriel, vous allez apprendre à approvisionner des groupes d’appareils IoT utilisant des certificats X.509 à des fins d’authentification. L’exemple de code d’appareil issu du SDK Azure IoT sera exécuté sur votre ordinateur de développement pour simuler le provisionnement des appareils X.509. Sur de vrais appareils, le code d’appareil serait déployé et exécuté à partir de l’appareil IoT.

Le service Azure IoT Hub Device Provisioning prend en charge deux types d’inscriptions pour le provisionnement d’appareils :

  • Groupes d’inscription : utilisés pour inscrire plusieurs appareils connexes. Ce tutoriel montre l’approvisionnement avec des groupes d’inscription.
  • Inscriptions individuelles : utilisées pour inscrire un seul appareil.

Le service Azure IoT Hub Device Provisioning prend en charge trois formes d’authentification pour l’approvisionnement d’appareils :

  • Certificats X.509 – Ce tutoriel illustre l’attestation du certificat X.509
  • Module de plateforme sécurisée (TPM)
  • Clés symétriques

Dans des scénarios de production, un module de sécurité matériel (HSM) est utilisé pour un stockage matériel sécurisé des secrets d’appareil. Un HSM peut être utilisé avec une clé symétrique, un certificat X.509 ou une attestation TPM pour assurer le stockage sécurisé des secrets. Le stockage matériel des secrets d’appareil est recommandé pour renforcer la protection des informations sensibles telles que la clé privée de votre certificat d’appareil.

Dans ce tutoriel, vous avez rempli les objectifs suivants :

  • Créer une chaîne de certificats de confiance pour organiser un ensemble d’appareils à l’aide de certificats X.509.
  • Créer une inscription de groupe qui utilise la chaîne de certificats.
  • Configurez l’environnement de développement.
  • Approvisionnez un appareil en utilisant la chaîne de certificats avec un exemple de code dans Azure IoT Device SDK.

Prérequis

Les prérequis suivants s’appliquent à un environnement de développement Windows utilisé pour simuler les appareils. Pour Linux ou macOS, consultez la section appropriée de Préparer votre environnement de développement dans la documentation du kit de développement logiciel (SDK).

  • Installez Visual Studio 2022 avec la charge de travail « Développement Desktop en C++ » activée. Visual Studio 2015, Visual Studio 2017 et Visual Studio 19 sont également pris en charge.

  • Installez le dernier système de génération CMake. Veillez à cocher l’option qui ajoute l’exécutable CMake à votre chemin d’accès.

    Important

    Assurez-vous que les prérequis de Visual Studio (Visual Studio et la charge de travail « Développement d’application de bureau en C++ ») sont installés sur votre machine avant de commencer l’installation de CMake. Une fois les composants requis en place et le téléchargement effectué, installez le système de génération de CMake. Sachez également que les versions antérieures du système de génération CMake ne permettent pas de générer le fichier solution utilisé dans ce tutoriel. Veillez à utiliser la dernière version de CMake.

Les prérequis suivants s’appliquent à un environnement de développement Windows. Pour Linux ou macOS, consultez la section appropriée de Préparer votre environnement de développement dans la documentation du kit de développement logiciel (SDK).

  • Installez le kit SDK .NET 6.0 sur votre machine Windows. Vous pouvez exécuter la commande suivante pour vérifier votre version.

    dotnet --info
    

Les prérequis suivants s’appliquent à un environnement de développement Windows. Pour Linux ou macOS, consultez la section appropriée de Préparer votre environnement de développement dans la documentation du kit de développement logiciel (SDK).

Les prérequis suivants s’appliquent à un environnement de développement Windows.

Les prérequis suivants s’appliquent à un environnement de développement Windows. Pour Linux ou macOS, consultez la section appropriée de Préparer votre environnement de développement dans la documentation du kit de développement logiciel (SDK).

  • Installez la dernière version de Git. Vérifiez que Git est ajouté aux variables d’environnement accessibles à la fenêtre de commande.

  • Assurez-vous de l’installation d’OpenSSL sur votre ordinateur. Sur Windows, votre installation de Git inclut une installation d’OpenSSL. Vous pouvez accéder à OpenSSL à partir de l’invite Git Bash. Pour vérifier qu’OpenSSL est installé, ouvrez une invite Git Bash et entrez openssl version.

    Notes

    À moins que vous ne connaissiez OpenSSL et que vous l’ayez déjà installé sur votre ordinateur Windows, nous vous recommandons d’utiliser OpenSSL à partir de l’invite Git Bash. Vous pouvez également choisir de télécharger le code source et de générer OpenSSL. Si vous choisissez de générer ou de télécharger OpenSSL, vérifiez que le binaire OpenSSL est accessible dans votre chemin d’accès et que la variable d’environnement OPENSSL_CNF est définie sur le chemin d’accès de votre fichier openssl.cnf.

Préparer votre environnement de développement

Dans cette section, vous allez préparer un environnement de développement pour générer le SDK C Azure IoT. Le SDK comprend un exemple de code et des outils utilisés pour le provisionnement des appareils avec DPS.

  1. Dans un navigateur web, accédez à la page de mise en production du SDK C Azure IoT.

  2. Copiez le nom d’étiquette de la version la plus récente du SDK C Azure IoT (par exemple : lts_03_2024).

  3. Ouvrez une invite de commande Windows et exécutez les commandes suivantes pour cloner la dernière version du dépôt GitHub d’Azure IoT Device SDK pour C. Remplacez <release-tag> par l’étiquette que vous avez copiée à l’étape précédente.

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

    Cette opération peut prendre plusieurs minutes.

  4. Une fois l’opération terminée, exécutez les commandes suivantes à partir du répertoire azure-iot-sdk-c :

    mkdir cmake
    cd cmake
    
  5. L’exemple de code utilise un certificat X.509 pour fournir l’attestation via l’authentification X.509. Exécutez la commande suivante pour générer une version du SDK propre à votre plateforme de développement qui inclut le client de provisionnement des appareils. Une solution Visual Studio pour l’appareil simulé est générée dans le répertoire cmake.

    Remplacez <path par le chemin d’accès absolu du kit de développement logiciel (SDK) C 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 ..
    

    Conseil

    Si cmake ne trouve pas votre compilateur C++, vous risquez de rencontrer des erreurs de génération lors de l’exécution de la commande ci-dessus. Si cela se produit, essayez d’exécuter la commande dans l’invite de commandes de Visual Studio.

  6. Quand la génération aboutit, les dernières lignes de la sortie ressemblent à la sortie suivante :

    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
    

Ouvrez une invite de commande Windows et clonez le dépôt GitHub d’Azure IoT SDK pour C# à l’aide de la commande suivante :

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

Ouvrez une invite de commande Windows et clonez le dépôt GitHub d’Azure IoT SDK pour Node.js à l’aide de la commande suivante :

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

Ouvrez une invite de commande Windows et clonez le dépôt GitHub d’Azure IoT Device SDK pour Python à l’aide de la commande suivante :

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

Remarque

Les exemples utilisés dans ce tutoriel se trouvent dans la branche v2 du référentiel azure-iot-sdk-python. V3 du Kit de développement logiciel (SDK) Python est disponible en version bêta.

  1. Ouvrez une invite de commandes Windows et clonez le dépôt GitHub des exemples Azure IoT pour Java à l’aide de la commande suivante :

    git clone https://github.com/Azure/azure-iot-sdk-java.git --recursive
    
  2. Accédez au répertoire azure-iot-sdk-java racine et générez le projet pour télécharger tous les packages nécessaires.

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

Créer une chaîne de certificats X.509

Dans cette section, vous allez générer une chaîne de trois certificats X.509 pour le test des appareils de ce tutoriel. Les certificats présenteront la hiérarchie suivante.

Diagramme montrant la relation entre les certificats de l’autorité racine, de l’autorité intermédiaire et de l’appareil.

Certificat racine : vous chargez et vérifiez le certificat racine avec DPS. Cette vérification permettra à DPS d’approuver ce certificat et de vérifier les certificats signés par celui-ci.

Certificat intermédiaire : Il est courant d’utiliser des certificats intermédiaires pour regrouper des appareils de manière logique par gammes de produits, divisions d’entreprise ou d’autres critères. Ce tutoriel utilise une chaîne de certificats avec un certificat intermédiaire, mais dans un scénario de production, vous pouvez en avoir plusieurs. Le certificat intermédiaire dans cette chaîne est signé par le certificat racine. Ce certificat est fourni au groupe d’inscriptions créé dans DPS. Cette configuration permet de gérer un groupe entier d’appareils dont les certificats d’appareil sont signés par le même certificat intermédiaire.

Certificats d’appareil : le certificat d’appareil (parfois appelé certificat feuille) est signé par le certificat intermédiaire et stocké sur l’appareil avec sa clé privée. Idéalement, ces éléments sensibles seraient stockés de manière sécurisée avec un appareil HSM. De nombreux certificats d’appareil peuvent être signés par le même certificat intermédiaire. Chaque appareil présente son certificat et sa clé privée, ainsi que la chaîne de certificats lors de la tentative de provisionnement.

Pour plus d’informations sur les chaînes de certificats, consultez Attestation du certificat X.509.

Configurer l’environnement X.509 OpenSSL

Dans cette section, vous allez créer des fichiers config OpenSSL, une structure de répertoires et d’autres fichiers utilisés par les commandes OpenSSL.

  1. Ouvrez une invite de commandes Git Bash et accédez à un dossier dans lequel vous souhaitez générer les certificats et clés X.509 pour ce tutoriel.

  2. Créez un fichier config OpenSSL nommé openssl_root_ca.cnfpour votre certificat d’autorité de certification racine. Les fichiers de configuration OpenSSL contiennent des stratégies et des définitions consommées par les commandes OpenSSL. Copiez et collez le texte suivant dans le fichier 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. Créez un fichier config OpenSSL nommé openssl_device_intermediate_ca.cnf à utiliser pour les certificats intermédiaires et d’appareil. Copiez et collez le texte suivant dans le fichier 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. Créez la structure de répertoires, le fichier de base de données index.txt et le fichier de numéro de série serial utilisés par les commandes OpenSSL dans ce tutoriel :

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

Créer un certificat d’autorité de certification racine

Exécutez les commandes suivantes pour créer une clé privée d’autorité de certification racine et un certificat d’autorité de certification racine. Vous utilisez ce certificat et cette clé pour signer votre certificat intermédiaire.

  1. Dans votre terminal Git Bash, créez une clé privée d’autorité de certification racine :

    openssl genrsa -aes256 -passout pass:1234 -out ./private/azure-iot-test-only.root.ca.key.pem 4096
    
  2. Créez un certificat d’autorité de certification racine :

    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
    

    Important

    La barre oblique supplémentaire spécifiée dans le nom d’objet (//CN=Azure IoT Hub CA Cert Test Only) est nécessaire uniquement pour l’échappement de la chaîne avec Git sur les plateformes Windows. Sur des plateformes Linux, fournissez le nom de l’objet avec une unique barre oblique (/CN=Azure IoT Hub CA Cert Test Only).

  3. Examinez le certificat d’autorité de certification racine :

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

    Notez que l’émetteur et l’objet sont tous deux l’autorité de certification racine.

    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)
    

Créer le certificat d’autorité de certification intermédiaire

Exécutez les commandes suivantes pour créer une clé privée d’autorité de certification intermédiaire et un certificat d’autorité de certification intermédiaire. Vous utilisez ce certificat et cette clé pour signer vos certificats d’appareil.

  1. Dans votre terminal Git Bash, créez une clé privée d’autorité de certification intermédiaire :

    openssl genrsa -aes256 -passout pass:1234 -out ./private/azure-iot-test-only.intermediate.key.pem 4096
    
  2. Créez une demande de signature du certificat d’autorité de certification intermédiaire (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
    

    Important

    La barre oblique supplémentaire spécifiée dans le nom d’objet (//CN=Azure IoT Hub Intermediate Cert Test Only) est nécessaire uniquement pour l’échappement de la chaîne avec Git sur les plateformes Windows. Sur des plateformes Linux, fournissez le nom de l’objet avec une seule barre oblique (/CN=Azure IoT Hub Intermediate Cert Test Only).

  3. Signer le certificat intermédiaire avec le certificat d’autorité de certification racine

    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. Examinez le certificat d’autorité de certification intermédiaire :

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

    Notez que l’émetteur est l’autorité de certification racine et que l’objet est l’autorité de certification intermédiaire.

    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)
    

Créer des certificats d’appareil

Dans cette section, vous allez créer deux certificats d’appareil et leurs certificats de chaîne complètes. Le certificat de chaîne complète contient le certificat d’appareil, le certificat d’autorité de certification intermédiaire et le certificat d’autorité de certification racine. L’appareil doit présenter son certificat de chaîne complète lorsqu’il s’inscrit auprès de DPS.

  1. Créez la première clé privée d’appareil.

    openssl genrsa -out ./private/device-01.key.pem 4096
    
  2. Créez la demande de signature du certificat d’appareil.

    Le nom commun (CN) de l’objet du certificat d’appareil doit être défini sur l’ID d’inscription que votre appareil utilise pour s’inscrire auprès du DPS. L’ID d’inscription est une chaîne insensible à la casse de caractères alphanumériques et des caractères spéciaux : '-', '.', '_', ':'. Le dernier caractère doit être alphanumérique ou être un tiret ('-'). Le nom commun doit respecter ce format. DPS prend en charge les ID d’inscription jusqu’à 128 caractères ; toutefois, la longueur maximale du nom commun de l’objet dans un certificat X.509 est de 64 caractères. L’ID d’inscription est donc limité à 64 caractères lors de l’utilisation de certificats X.509. Pour les inscriptions de groupe, l’ID d’inscription est également utilisé comme ID de l’appareil dans IoT Hub.

    Le nom commun de l’objet est défini à l’aide du paramètre -subj. Dans la commande suivante, le nom commun est défini sur 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
    

    Important

    La barre oblique supplémentaire spécifiée dans le nom d’objet (//CN=device-01) est nécessaire uniquement pour l’échappement de la chaîne avec Git sur les plateformes Windows. Sur des plateformes Linux, fournissez le nom de l’objet avec une unique barre oblique (/CN=device-01).

  3. Signez le certificat d’appareil.

    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. Examinez le certificat d’appareil :

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

    Notez que l’émetteur est l’autorité de certification intermédiaire et que l’objet est l’ID d’inscription de l’appareil, 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. L’appareil doit présenter la chaîne de certificats complète lorsqu’il s’authentifie auprès de DPS. Exécutez la commande suivante pour créer la chaîne de certificat :

    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. Ouvrez le fichier de la chaîne de certificats, ./certs/device-01-full-chain.cert.pem, dans un éditeur de texte pour l’examiner. Le texte de la chaîne de certificats contient la chaîne complète des trois certificats. Vous allez utiliser cette chaîne de certificats plus loin dans ce tutoriel pour approvisionner device-01.

    Le texte de la chaîne complète est au format suivant :

    -----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. Pour créer la clé privée, le certificat X.509 et le certificat de chaîne complète pour le deuxième appareil, copiez et collez ce script dans votre invite de commandes Git Bash. Pour créer des certificats pour d’autres appareils, vous pouvez modifier la variable registration_id déclarée au début du 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
    

    Important

    La barre oblique supplémentaire spécifiée dans le nom d’objet (//CN=$registration_id) est nécessaire uniquement pour l’échappement de la chaîne avec Git sur les plateformes Windows. Sur des plateformes Linux, fournissez le nom de l’objet avec une unique barre oblique (/CN=$registration_id).

    Remarque

    Ce script utilise l’ID d’inscription comme nom de fichier de base pour les fichiers de clé privée et de certificat. Si votre ID d’inscription contient des caractères qui ne sont pas des caractères de nom de fichier valides, vous devez modifier le script en conséquence.

    Avertissement

    Le texte des certificats contient uniquement des informations de clé publique.

    En revanche, l’appareil doit également avoir accès à la clé privée du certificat d’appareil. Cet accès est nécessaire, car l’appareil doit effectuer la vérification à l’aide de cette clé au moment de l’exécution pendant la tentative de provisionnement. La sensibilité de cette clé est l’une des principales raisons pour lesquelles il est recommandé d’utiliser un stockage matériel dans un réel HSM pour mieux sécuriser les clés privées.

Vous allez utiliser les fichiers suivants dans la suite de ce tutoriel :

Certificat Fichier Description
Certificat d’autorité de certification racine. certs/azure-iot-test-only.root.ca.cert.pem Chargé sur DPS et vérifié.
Certificat d’autorité de certification intermédiaire certs/azure-iot-test-only.intermediate.cert.pem Est utilisé pour créer un groupe d’inscription dans DPS.
Clé privée de device-01 private/device-01.key.pem Utilisée par l’appareil pour vérifier la propriété du certificat d’appareil lors de l’authentification avec DPS.
Certificat de chaîne complète pour device-01 certs/device-01-full-chain.cert.pem Présentée par l’appareil pour s’authentifier et s’inscrire auprès de DPS.
Clé privée de device-02 private/device-02.key.pem Utilisée par l’appareil pour vérifier la propriété du certificat d’appareil lors de l’authentification avec DPS.
Certificat de chaîne complète pour device-02 certs/device-02-full-chain.cert.pem Présentée par l’appareil pour s’authentifier et s’inscrire auprès de DPS.

Vérifier la propriété du certificat racine

Pour que DPS puisse valider la chaîne de certificats de l’appareil pendant l’authentification, vous devez charger et vérifier la propriété du certificat d’autorité de certification racine. Pour ajouter le certificat d’autorité de certification racine à votre instance DPS, procédez comme suit :

  1. Dans le Portail Azure, accédez à l’instance du service de provisionnement des appareils.

  2. Ouvrez Certificats à partir du menu de gauche, puis sélectionnez Ajouter pour ajouter un nouveau certificat.

  3. Entrez un nom d’affichage convivial pour votre certificat. Cherchez l’emplacement du fichier du certificat d’autorité de certification racine certs/azure-iot-test-only.root.ca.cert.pem. Sélectionnez Télécharger.

  4. Sélectionnez la boîte en regard de Définir l’état du certificat sur vérifié lors du chargement.

    Capture d’écran illustrant l’ajout du certificat d’autorité de certification racine et la case Définir l’état du certificat sur vérifié lors du chargement​ sélectionnée.

  5. Cliquez sur Enregistrer.

  6. Vérifiez que votre certificat apparaît dans l’onglet des certificats avec l’état Vérifié.

    Capture d’écran qui montre le certificat d’autorité de certification racine vérifié dans la liste des certificats.

Mettre à jour le magasin de certificats sur des appareils Windows

Sur des appareils non-Windows, vous pouvez transmettre la chaîne de certificats à partir du code en tant que magasin de certificats.

Sur des appareils Windows, vous devez ajouter les certificats de signature (racine et intermédiaire) à un magasin de certificats Windows. Sinon, les certificats de signature ne sont pas transmis à DPS par un canal sécurisé par le protocole TLS (Transport Layer Security).

Conseil

Il est également possible d’utiliser OpenSSL au lieu d’un canal sécurisé (Schannel) avec le SDK C. Pour plus d’informations sur l’utilisation d’OpenSSL, consultez Utilisation d’OpenSSL dans le SDK.

Pour ajouter les certificats de signature au magasin de certificats dans des appareils Windows :

  1. Dans votre terminal Git Bash, convertissez vos certificats de signature en .pfx comme suit.

    Certificat d'autorité de certification racine :

    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
    

    Certificat d’autorité de certification intermédiaire :

    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. Cliquez avec le bouton droit sur le bouton Démarrer de Windows et sélectionnez Exécuter. Entrez certmgr.msc, puis sélectionnez OK pour démarrer le gestionnaire de certificats.

  3. Dans le gestionnaire de certificats, sous Certificats - Utilisateur actuel, sélectionnez Autorités de certification racines de confiance. Dans le menu, sélectionnez ensuite Action>Toutes les tâches>Importer.

  4. Suivez les étapes de l’Assistant Importation de certificat pour importer root.pfx.

    • Veillez à effectuer une recherche par Échange d’informations personnelles (.pfx) .
    • Utilisez 1234 comme mot de passe.
    • Placez le certificat dans le magasin de certificats Autorités de certification racines de confiance.
  5. Répétez ces étapes du gestionnaire de certificats pour importer intermediate.pfx.

    • Placez le certificat dans le magasin de certificats Autorités de certification intermédiaires.

Vos certificats de signature sont désormais approuvés sur l’appareil Windows et la chaîne complète peut être transmise à DPS.

Création d’un groupe d’inscription

  1. Connectez-vous au portail Azure et accédez à votre instance du service Device Provisioning.

  2. Sélectionnez Gérer les inscriptions dans la section Paramètres du menu de navigation.

  3. En haut de la page, sélectionnez Ajouter un groupe d’inscriptions.

  4. Sous l’onglet Inscription + approvisionnement de la page Ajouter un groupe d’inscriptions, fournissez les informations suivantes pour configurer les détails du groupe d’inscription :

    Champ Description
    Attestation Sélectionnez Certificats intermédiaires X.509 comme mécanisme d’attestation si vous souhaitez charger des certificats intermédiaires à utiliser uniquement pour ce groupe d’inscriptions, ou sélectionnez Certificats X.509 chargés sur ce service Device Provisioning si vous avez déjà chargé des certificats intermédiaires.
    Paramètres de certificat X.509 Selon la méthode d’attestation que vous avez choisie, chargez ou sélectionnez les certificats intermédiaires principaux et secondaires pour ce groupe d’inscriptions.
    Nom du groupe Indiquez un nom pour le groupe d’appareils. Le nom du groupe d’inscription est une chaîne insensible à la casse (jusqu’à 128 caractères) de caractères alphanumériques et des caractères spéciaux : '-', '.', '_', ':'. Le dernier caractère doit être alphanumérique ou être un tiret ('-').
    État d’approvisionnement Cochez la case Activer cette inscription si vous souhaitez que ce groupe d’inscription soit disponible pour approvisionner les appareils. Décochez cette case si vous souhaitez désactiver le groupe. Vous pouvez modifier ce paramètre ultérieurement.
    Stratégie de réapprovisionnement Choisissez une stratégie de réapprovisionnement qui reflète la façon dont vous souhaitez que DPS gère les appareils qui demandent le réapprovisionnement. Pour plus d’informations, consultez Réplica de réapprovisionnement

    Capture d’écran montrant l’ajout d’un groupe d’inscription pour l’attestation de certificat X.509.

  5. Sélectionnez Suivant : IoT Hubs.

  6. Sous l’onglet Hubs IoT de la page Ajouter un groupe d’inscription, fournissez les informations suivantes pour déterminer les hubs IoT pour lesquels le groupe d’inscription peut approvisionner des appareils :

    Champ Description
    Hubs IoT cibles Sélectionnez un ou plusieurs de vos hubs IoT liés, ou ajoutez un nouveau lien à un hub IoT. Pour en savoir plus sur la liaison de hubs IoT à votre instance DPS, consultez Comment lier et gérer des hubs IoT.
    Stratégie d’allocation Si vous avez sélectionné plusieurs hubs IoT liés, sélectionnez la façon dont vous souhaitez affecter des appareils aux différents hubs. Pour en savoir plus sur les stratégies d’allocation, consultez le guide pratique pour utiliser des stratégies d’allocation.

    Si vous avez sélectionné un seul hub IoT lié, nous vous recommandons d’utiliser la stratégie de distribution uniformément pondérée.

    Capture d’écran montrant la connexion de hubs IoT au nouveau groupe d’inscription.

  7. Sélectionnez Suivant : paramètres de l’appareil

  8. Sous l’onglet Paramètres de l’appareil de la page Ajouter un groupe d’inscription, fournissez les informations suivantes pour définir la façon dont les appareils nouvellement approvisionnés seront configurés :

    Champ Description
    IoT Edge Cochez la case Activer IoT Edge sur les appareils approvisionnés si tous les appareils approvisionnés via ce groupe exécutent Azure IoT Edge. Décochez cette case si ce groupe concerne uniquement les appareils sans IoT Edge activé. Dans un groupe, tous les appareils sont activés IoT Edge ou aucun ne peut l’être.
    Balises d’appareil Utilisez cette zone de texte pour fournir les balises que vous souhaitez appliquer aux jumeaux d’appareil des appareils approvisionnés.
    Propriétés souhaitées Utilisez cette zone de texte pour fournir les propriétés souhaitées que vous souhaitez appliquer aux jumeaux d’appareil des appareils approvisionnés.

    Pour en savoir plus, consultez Comprendre et utiliser les jumeaux d’appareil IoT Hub.

  9. Sélectionnez Suivant : Vérifier + créer.

  10. Dans l’onglet Vérifier + créer, vérifiez toutes vos valeurs, puis sélectionnez Créer.

Préparer et exécuter le code de provisionnement d’un appareil

Dans cette section, vous mettez à jour l’exemple de code avec les informations de votre instance du service Device Provisioning. Si l’appareil est authentifié, il est attribué à un hub IoT lié à l’instance du service d’approvisionnement d’appareil configurée dans cette section.

Dans cette section, vous utilisez votre invite Git Bash et l’IDE Visual Studio.

Configurer le code de l’appareil de provisionnement

Dans cette section, vous mettez à jour l’exemple de code avec les informations de votre instance du service Device Provisioning.

  1. Dans le portail Azure, sélectionnez l’onglet Vue d’ensemble de votre instance Device Provisioning Service et notez la valeur Étendue de l’ID.

    Capture d’écran qui montre l’étendue l’ID sur le volet de vue d’ensemble de DPS.

  2. Lancez Visual Studio et ouvrez le nouveau fichier de solution créé dans le répertoire cmake que vous avez créé à la racine du dépôt git azure-iot-sdk-c. Le fichier de la solution est nommé azure_iot_sdks.sln.

  3. Dans l’Explorateur de solutions pour Visual Studio, accédez à Provision_Samples > prov_dev_client_sample > Source Files et ouvrez prov_dev_client_sample.c.

  4. Recherchez la constante id_scope et remplacez la valeur par la valeur Étendue de l’ID que vous avez copiée précédemment. Par exemple :

    static const char* id_scope = "0ne00000A0A";
    
  5. Recherchez la définition de la fonction main() dans le même fichier. Vérifiez que la variable hsm_type est définie sur SECURE_DEVICE_TYPE_X509 et que toutes les autres lignes hsm_type sont commentées. Par exemple :

    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. Enregistrez vos modifications.

  7. Cliquez avec le bouton droit sur le projet dps_client_sample et sélectionnez Définir comme projet de démarrage.

Configurer le code de stub HSM personnalisé

Les détails de l’interaction avec le stockage matériel sécurisé réel varient en fonction du matériel de l’appareil. Les chaînes de certificats utilisées par les appareils simulés dans ce tutoriel vont être codées en dur dans le code de stub HSM personnalisé. Dans un scénario réel, la chaîne de certificats est stockée dans le matériel HSM réel pour assurer une meilleure sécurité des informations sensibles. Des méthodes similaires aux méthodes stub utilisées dans cet exemple sont ensuite implémentées pour lire les secrets à partir de ce stockage matériel.

Quand le matériel HSM n’est pas obligatoire, il est recommandé de protéger les informations sensibles, comme la clé privée du certificat. Si un vrai HSM était appelé par l’exemple, la clé privée ne serait pas présente dans le code source. La présence de la clé dans le code source expose la clé à toute personne qui consulte le code. Nous le faisons dans ce tutoriel uniquement pour faciliter l’apprentissage.

Pour mettre à jour le code de stub HSM personnalisé afin de simuler l’identité de l’appareil avec l’ID device-01 :

  1. Dans l’Explorateur de solutions pour Visual Studio, accédez à Provision_Samples > custom_hsm_example > Source Files et ouvrez custom_hsm_example.c.

  2. Mettez à jour la valeur de chaîne de la constante de chaîne COMMON_NAME à l’aide du nom commun que vous avez utilisé lors de la génération du certificat d’appareil.

    static const char* const COMMON_NAME = "device-01";
    
  3. Dans votre terminal Git Bash, exécutez la commande suivante pour générer la constante de chaîne pour votre certificat d’appareil :

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

    Copiez la sortie de cette commande.

  4. Mettez à jour la valeur de chaîne de la chaîne constante CERTIFICATE à l’aide du texte de chaîne de certificats que vous avez enregistré dans ./certs/device-01-full-chain.cert.pem après avoir généré vos certificats. Utilisez le texte de sortie du certificat obtenu lors de l’étape précédente pour la valeur de constante.

    La syntaxe du texte du certificat doit correspondre au modèle suivant, sans espace supplémentaire ni analyse effectuée par 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. Dans Git Bash, exécutez la commande suivante pour générer la constante de chaîne pour votre clé privée d’appareil :

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

    Copiez la sortie de cette commande.

  6. Mettez à jour la valeur de la chaîne de la constante PRIVATE_KEY avec la clé privée de votre certificat d’appareil. Utilisez le texte de sortie de la clé privée obtenu lors de l’étape précédente pour la valeur de constante.

    La syntaxe du texte de la clé privée doit correspondre au modèle suivant, sans espace supplémentaire ni analyse effectuée par 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. Enregistrez vos modifications.

  8. Cliquez avec le bouton droit sur le projet custom_hsm_example, puis sélectionnez Générer.

    Important

    Vous devez générer le projet custom_hsm_example avant de générer le reste de la solution dans la section suivante.

Exécution de l'exemple

  1. Dans le menu Visual Studio, sélectionnez Déboguer>Exécuter sans débogage pour exécuter la solution. Quand vous êtes invité à regénérer le projet, sélectionnez Oui pour le faire avant de l’exécuter.

    La sortie suivante illustre un exemple d’appareil simulé device-01 démarrant correctement et se connectant au service de provisionnement. L’appareil a été attribué à un hub IoT et inscrit :

    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. Répétez les étapes décrites dans Configurer le code de stub HSM personnalisé pour votre deuxième appareil (device-02) et réexécutez l’exemple. Utilisez les valeurs suivantes pour cet appareil :

    Description Valeur
    Nom commun "device-02"
    Chaîne de certificats complète Générez le texte à l’aide de ./certs/device-02-full-chain.cert.pem
    Clé privée Générez le texte à l’aide de ./private/device-02.key.pem

    La sortie suivante illustre un exemple d’appareil simulé device-02 démarrant correctement et se connectant au service de provisionnement. L’appareil a été attribué à un hub IoT et inscrit :

    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:
    

L’exemple de code C# est configuré pour utiliser des certificats X.509 qui sont stockés dans un fichier au format PKCS#12 protégé par mot de passe (.pfx). Les certificats de chaîne complète que vous avez créés précédemment sont au format PEM. Pour convertir les certificats de chaîne complète au format PKCS#12, entrez les commandes suivantes dans votre invite Git Bash à partir du répertoire où vous avez précédemment exécuté les commandes 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
    

Dans le reste de cette section, vous allez utiliser votre invite de commandes Windows.

  1. Dans le portail Azure, sélectionnez l’onglet Vue d’ensemble de votre service Device Provisioning.

  2. Copiez la valeur Étendue de l’ID.

    Capture d’écran de l’étendue de l’ID dans le portail Azure.

  3. Dans votre invite de commandes Windows, accédez au répertoire X509Sample. Ce répertoire se trouve dans le référentiel du kit de développement logiciel (SDK) cloné lors d’une étape antérieure : .\azure-iot-sdk-csharp\provisioning\device\samples\getting started\X509Sample.

  4. Entrez la commande suivante pour générer et exécuter l’exemple d’approvisionnement d’appareil X.509. Remplacez <id-scope> par la valeur l’étendue de l’ID copiée à partir du Portail Azure. Remplacez <your-certificate-folder> par le chemin du dossier où vous avez exécuté vos commandes OpenSSL.

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

    L’appareil se connecte à DPS et est affecté à un hub IoT. Ensuite, l’appareil envoie un message de télémétrie au hub IoT. Vous devez obtenir une sortie similaire à la suivante :

    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.
    

    Remarque

    Si vous ne spécifiez pas de certificat et de mot de passe sur la ligne de commande, le fichier de certificat est par défaut ./certificate.pfx et vous êtes invité à entrer votre mot de passe.

    Vous pouvez passer des paramètres supplémentaires pour changer TransportType (-t) et GlobalDeviceEndpoint (-g). Pour obtenir la liste des paramètres, tapez dotnet run -- --help.

  5. Pour inscrire votre deuxième appareil, réexécutez l’exemple en utilisant son certificat de chaîne complète.

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

Dans les étapes suivantes, utilisez votre invite de commandes Windows.

  1. Dans le portail Azure, sélectionnez l’onglet Vue d’ensemble de votre service Device Provisioning.

  2. Copiez la valeur Étendue de l’ID.

    Capture d’écran de l’étendue de l’ID dans le portail Azure.

  3. Dans votre invite de commandes Windows, accédez à l’exemple de répertoire et installez les packages nécessaires à l’exemple. Le chemin d’accès affiché est relatif à l’emplacement où vous avez cloné le Kit de développement logiciel (SDK).

    cd .\azure-iot-sdk-node\provisioning\device\samples
    npm install
    
  4. Dans le dossier provisioning\device\samples, ouvrez register_x509.js et passez en revue le code.

    L’exemple utilise par défaut MQTT comme protocole de transport. Si vous souhaitez utiliser un autre protocole, mettez la ligne suivante en commentaire et supprimez les marques de commentaire de la ligne correspondant au protocole approprié.

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

    L’exemple utilise cinq variables d’environnement pour authentifier et provisionner un appareil IoT en utilisant DPS. Ces variables d’environnement sont :

    Nom de la variable Description
    PROVISIONING_HOST Point de terminaison à utiliser pour la connexion à votre instance DPS. Pour ce tutoriel, utilisez le point de terminaison global global.azure-devices-provisioning.net.
    PROVISIONING_IDSCOPE Étendue de l’ID pour votre instance DPS.
    PROVISIONING_REGISTRATION_ID L’ID d’inscription pour votre appareil. Elle doit correspondre au nom d’objet commun dans le certificat d’appareil.
    CERTIFICATE_FILE Chemin du fichier de certificat de chaîne complète de votre appareil.
    KEY_FILE Chemin du fichier de clé privée de votre certificat d’appareil.

    La méthode ProvisioningDeviceClient.register() tente d’inscrire votre appareil.

  5. Ajoutez les variables d’environnement pour le point de terminaison d’appareil global et l’ID de l’étendue. Remplacez <id-scope> par la valeur copiée à partir du Portail Azure.

    set PROVISIONING_HOST=global.azure-devices-provisioning.net
    set PROVISIONING_IDSCOPE=<id-scope>
    
  6. Définissez la variable d’environnement pour l’ID d’inscription d’appareil. L’ID d’inscription pour l’appareil IoT doit correspondre au nom d’objet commun sur son certificat d’appareil. Pour ce tutoriel, device-01 est à la fois le nom de l’objet et l’ID d’inscription de l’appareil.

    set PROVISIONING_REGISTRATION_ID=device-01
    
  7. Définissez les variables d’environnement pour le certificat de chaîne complète et les fichiers de clé privée de l’appareil que vous avez générés précédemment. Remplacez <your-certificate-folder> par le chemin du dossier où vous avez exécuté vos commandes 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. Exécutez l’exemple et vérifiez que l’appareil a été approvisionné correctement.

    node register_x509.js
    

    Vous devez obtenir une sortie similaire à la suivante :

    registration succeeded
    assigned hub=contoso-hub-2.azure-devices.net
    deviceId=device-01
    Client connected
    send status: MessageEnqueued
    
  9. Mettez à jour les variables d’environnement de votre deuxième appareil (device-02) en fonction du tableau suivant et réexécutez l’exemple.

    Variable d’environnement Valeur
    PROVISIONING_REGISTRATION_ID device-02
    CERTIFICATE_FILE <dossier-de-votre-certificat>\certs\device-02-full-chain.cert.pem
    KEY_FILE <dossier-de-votre-certificat>\private\device-02.key.pem

Dans les étapes suivantes, utilisez votre invite de commandes Windows.

  1. Dans le portail Azure, sélectionnez l’onglet Vue d’ensemble de votre service Device Provisioning.

  2. Copiez la valeur Étendue de l’ID.

    Capture d’écran de l’étendue de l’ID dans le portail Azure.

  3. Dans votre invite de commandes Windows, accédez au répertoire de l’exemple provision_x509.py. Le chemin d’accès affiché est relatif à l’emplacement où vous avez cloné le Kit de développement logiciel (SDK).

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

    Cet exemple utilise six variables d’environnement pour authentifier et provisionner un appareil IoT à l’aide du service DPS. Ces variables d’environnement sont :

    Nom de la variable Description
    PROVISIONING_HOST Point de terminaison à utiliser pour la connexion à votre instance DPS. Pour ce tutoriel, utilisez le point de terminaison global global.azure-devices-provisioning.net.
    PROVISIONING_IDSCOPE Étendue de l’ID pour votre instance DPS.
    DPS_X509_REGISTRATION_ID L’ID d’inscription pour votre appareil. Elle doit correspondre au nom d’objet commun dans le certificat d’appareil.
    X509_CERT_FILE Chemin du fichier de certificat de chaîne complète de votre appareil.
    X509_KEY_FILE Chemin du fichier de clé privée de votre certificat d’appareil.
    PASS_PHRASE Phrase secrète utilisée pour chiffrer le fichier de clé privée (s’il est utilisé). Non nécessaire pour ce tutoriel.
  4. Ajoutez les variables d’environnement pour le point de terminaison global d’appareil et l’ID de l’étendue. Pour la variable étendue de l’ID, utilisez la valeur copiée à partir du Portail Azure.

    set PROVISIONING_HOST=global.azure-devices-provisioning.net
    set PROVISIONING_IDSCOPE=<ID scope for your DPS resource>
    
  5. Définissez la variable d’environnement pour l’ID d’inscription d’appareil. L’ID d’inscription pour l’appareil IoT doit correspondre au nom d’objet commun sur son certificat d’appareil. Pour ce tutoriel, device-01 est à la fois le nom de l’objet et l’ID d’inscription de l’appareil.

    set DPS_X509_REGISTRATION_ID=device-01
    
  6. Définissez les variables d’environnement pour le certificat de chaîne complète et les fichiers de clé privée de l’appareil que vous avez générés précédemment. Remplacez <your-certificate-folder> par le chemin du dossier où vous avez exécuté vos commandes 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. Passez en revue le code pour provision_x509.py. Si vous n’utilisez pas Python version 3.7 ou une version ultérieure, changez le code indiqué ici pour remplacer asyncio.run(main()).

  8. Exécutez l’exemple. L’exemple se connecte à DPS, qui va provisionner l’appareil sur un hub IoT. Une fois l’appareil provisionné, l’exemple envoie des messages de test au hub IoT.

    python provision_x509.py
    

    Vous devez obtenir une sortie similaire à la suivante :

    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. Mettez à jour les variables d’environnement de votre deuxième appareil (device-02) en fonction du tableau suivant et réexécutez l’exemple.

    Variable d’environnement Valeur
    DPS_X509_REGISTRATION_ID device-02
    X509_CERT_FILE <dossier-de-votre-certificat>\certs\device-02-full-chain.cert.pem
    X509_KEY_FILE <dossier-de-votre-certificat>\private\device-02.key.pem

Dans les étapes suivantes, vous allez utiliser votre invite de commandes Windows et votre invite Git Bash.

  1. Dans le portail Azure, sélectionnez l’onglet Vue d’ensemble de votre service Device Provisioning.

  2. Copiez la valeur Étendue de l’ID.

    Capture d’écran de l’étendue de l’ID dans le portail Azure.

  3. Dans l’invite de commandes Windows, accédez au dossier de l’exemple de projet. Le chemin d’accès affiché est relatif à l’emplacement où vous avez cloné le Kit de développement logiciel (SDK).

    cd .\azure-iot-sdk-java\provisioning\provisioning-device-client-samples\provisioning-X509-sample
    
  4. Entrez les informations relatives à l’identité X.509 et au service d’approvisionnement dans l’exemple de code. Elles sont utilisées lors de l’approvisionnement, pour l’attestation de l’appareil simulé, avant l’inscription de l’appareil.

    1. Ouvrez le fichier .\src\main\java\samples\com\microsoft\azure\sdk\iot\ProvisioningX509Sample.java dans l’éditeur de votre choix.

    2. Mettez à jour les valeurs suivantes. Pour idScope, utilisez l’étendue de l’ID que vous avez copiée précédemment. Pour le point de terminaison global, utilisez le Point de terminaison d’appareil global. Ce point de terminaison est le même pour toutes les instances 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. L’exemple utilise par défaut HTTPS comme protocole de transport. Si vous voulez changer le protocole, mettez la ligne suivante en commentaire et décommentez la ligne correspondant au protocole que vous voulez utiliser.

      private static final ProvisioningDeviceClientTransportProtocol PROVISIONING_DEVICE_CLIENT_TRANSPORT_PROTOCOL = ProvisioningDeviceClientTransportProtocol.HTTPS;
      
    4. Mettez à jour la valeur de la chaîne de constante leafPublicPem avec la valeur de votre certificat d’appareil, device-01.cert.pem.

      La syntaxe du texte du certificat doit correspondre au modèle suivant, sans espace ni caractère supplémentaire.

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

      La mise à jour manuelle de cette valeur de chaîne peut être sujette à des erreurs. Pour générer la syntaxe appropriée, vous pouvez copier et coller la commande suivante dans votre invite Git Bash, puis appuyez sur Entrée. Cette commande génère la syntaxe de la valeur de constante de chaîne leafPublicPem et l’écrit dans la sortie.

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

      Copiez et collez le texte du certificat de sortie pour la valeur de constante.

    5. Mettez à jour la valeur de chaîne de la constante leafPrivateKey avec la clé privée non chiffrée pour votre certificat d’appareil, unencrypted-device-key.pem.

      La syntaxe du texte de la clé privée doit correspondre au modèle suivant, sans espace ni caractère supplémentaire.

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

      Pour générer la syntaxe appropriée, vous pouvez copier et coller la commande suivante dans votre invite Git Bash, puis appuyez sur Entrée. Cette commande génère la syntaxe de la valeur de constante de chaîne leafPrivateKey et l’écrit dans la sortie.

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

      Copiez et collez le texte de la clé privée de sortie pour la valeur de constante.

    6. Ajoutez une chaîne de constante rootPublicPem avec la valeur de votre certificat d’autorité de certification racine, azure-iot-test-only.root.ca.cert.pem. Vous pouvez l’ajouter juste après la constante leafPrivateKey.

      La syntaxe du texte du certificat doit correspondre au modèle suivant, sans espace ni caractère supplémentaire.

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

      Pour générer la syntaxe appropriée, vous pouvez copier et coller la commande suivante dans votre invite Git Bash, puis appuyez sur Entrée. Cette commande génère la syntaxe de la valeur de constante de chaîne rootPublicPem et l’écrit dans la sortie.

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

      Copiez et collez le texte du certificat de sortie pour la valeur de constante.

    7. Ajoutez une chaîne de constante intermediatePublicPem avec la valeur de votre certificat d’autorité de certification intermédiaire, azure-iot-test-only.intermediate.cert.pem. Vous pouvez l’ajouter juste après la constante précédente.

      La syntaxe du texte du certificat doit correspondre au modèle suivant, sans espace ni caractère supplémentaire.

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

      Pour générer la syntaxe appropriée, vous pouvez copier et coller la commande suivante dans votre invite Git Bash, puis appuyez sur Entrée. Cette commande génère la syntaxe de la valeur de constante de chaîne intermediatePublicPem et l’écrit dans la sortie.

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

      Copiez et collez le texte du certificat de sortie pour la valeur de constante.

    8. Recherchez les lignes suivantes dans la méthode main.

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

      Ajoutez ces deux lignes directement en dessous pour ajouter vos certificats d’autorité de certification intermédiaire et racine à la chaîne de signature. Votre chaîne de signature doit inclure l’ensemble de la chaîne de certificats jusqu’à et y compris un certificat que vous avez vérifié avec DPS.

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

      Notes

      L’ordre dans lequel les certificats de signature sont ajoutés est important. L’exemple échouera si vous le modifiez.

    9. Enregistrez vos modifications.

  5. Générez l’exemple, puis accédez au dossier target.

    mvn clean install
    cd target
    
  6. La génération crée le fichier .jar dans le dossier target avec le format de fichier suivant : provisioning-x509-sample-{version}-with-deps.jar ; par exemple : provisioning-x509-sample-1.8.1-with-deps.jar. Exécutez le fichier .jar. Vous devrez peut-être remplacer la version dans la commande suivant.

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

    L’exemple se connecte à DPS, qui provisionne l’appareil sur un hub IoT. Une fois l’appareil approvisionné, l’exemple envoie des messages de test au hub IoT.

    Starting...
    Beginning setup.
    WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance.
    2022-10-21 10:41:20,476 DEBUG (main) [com.microsoft.azure.sdk.iot.provisioning.device.ProvisioningDeviceClient] - Initialized a ProvisioningDeviceClient instance using SDK version 2.0.2
    2022-10-21 10:41:20,479 DEBUG (main) [com.microsoft.azure.sdk.iot.provisioning.device.ProvisioningDeviceClient] - Starting provisioning thread...
    Waiting for Provisioning Service to register
    2022-10-21 10:41:20,482 INFO (global.azure-devices-provisioning.net-4f8279ac-CxnPendingConnectionId-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Opening the connection to device provisioning service...
    2022-10-21 10:41:20,652 INFO (global.azure-devices-provisioning.net-4f8279ac-Cxn4f8279ac-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Connection to device provisioning service opened successfully, sending initial device registration message
    2022-10-21 10:41:20,680 INFO (global.azure-devices-provisioning.net-4f8279ac-Cxn4f8279ac-azure-iot-sdk-RegisterTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.RegisterTask] - Authenticating with device provisioning service using x509 certificates
    2022-10-21 10:41:21,603 INFO (global.azure-devices-provisioning.net-4f8279ac-Cxn4f8279ac-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Waiting for device provisioning service to provision this device...
    2022-10-21 10:41:21,605 INFO (global.azure-devices-provisioning.net-4f8279ac-Cxn4f8279ac-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Current provisioning status: ASSIGNING
    2022-10-21 10:41:24,868 INFO (global.azure-devices-provisioning.net-4f8279ac-Cxn4f8279ac-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Device provisioning service assigned the device successfully
    IotHUb Uri : contoso-hub-2.azure-devices.net
    Device ID : device-01
    2022-10-21 10:41:30,514 INFO (main) [com.microsoft.azure.sdk.iot.device.transport.ExponentialBackoffWithJitter] - NOTE: A new instance of ExponentialBackoffWithJitter has been created with the following properties. Retry Count: 2147483647, Min Backoff Interval: 100, Max Backoff Interval: 10000, Max Time Between Retries: 100, Fast Retry Enabled: true
    2022-10-21 10:41:30,526 INFO (main) [com.microsoft.azure.sdk.iot.device.transport.ExponentialBackoffWithJitter] - NOTE: A new instance of ExponentialBackoffWithJitter has been created with the following properties. Retry Count: 2147483647, Min Backoff Interval: 100, Max Backoff Interval: 10000, Max Time Between Retries: 100, Fast Retry Enabled: true
    2022-10-21 10:41:30,533 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Initialized a DeviceClient instance using SDK version 2.1.2
    2022-10-21 10:41:30,590 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - Opening MQTT connection...
    2022-10-21 10:41:30,625 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT CONNECT packet...
    2022-10-21 10:41:31,452 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT CONNECT packet was acknowledged
    2022-10-21 10:41:31,453 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT SUBSCRIBE packet for topic devices/device-01/messages/devicebound/#
    2022-10-21 10:41:31,523 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT SUBSCRIBE packet for topic devices/device-01/messages/devicebound/# was acknowledged
    2022-10-21 10:41:31,525 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - MQTT connection opened successfully
    2022-10-21 10:41:31,528 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - The connection to the IoT Hub has been established
    2022-10-21 10:41:31,531 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Updating transport status to new status CONNECTED with reason CONNECTION_OK
    2022-10-21 10:41:31,532 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceIO] - Starting worker threads
    2022-10-21 10:41:31,535 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Invoking connection status callbacks with new status details
    2022-10-21 10:41:31,536 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Client connection opened successfully
    2022-10-21 10:41:31,537 INFO (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Device client opened successfully
    Sending message from device to IoT Hub...
    2022-10-21 10:41:31,539 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Message was queued to be sent later ( Message details: Correlation Id [aaaa0000-bb11-2222-33cc-444444dddddd] Message Id [aaaa0000-bb11-2222-33cc-444444dddddd] )
    Press any key to exit...
    2022-10-21 10:41:31,540 DEBUG (contoso-hub-2.azure-devices.net-device-01-d7c67552-Cxn0bd73809-420e-46fe-91ee-942520b775db-azure-iot-sdk-IotHubSendTask) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Sending message ( Message details: Correlation Id [aaaa0000-bb11-2222-33cc-444444dddddd] Message Id [aaaa0000-bb11-2222-33cc-444444dddddd] )
    2022-10-21 10:41:31,844 DEBUG (MQTT Call: device-01) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - IotHub message was acknowledged. Checking if there is record of sending this message ( Message details: Correlation Id [aaaa0000-bb11-2222-33cc-444444dddddd] Message Id [aaaa0000-bb11-2222-33cc-444444dddddd] )
    2022-10-21 10:41:31,846 DEBUG (contoso-hub-2.azure-devices.net-device-01-d7c67552-Cxn0bd73809-420e-46fe-91ee-942520b775db-azure-iot-sdk-IotHubSendTask) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Invoking the callback function for sent message, IoT Hub responded to message ( Message details: Correlation Id [aaaa0000-bb11-2222-33cc-444444dddddd] Message Id [aaaa0000-bb11-2222-33cc-444444dddddd] ) with status OK
    Message sent!
    
  7. Mettez à jour les constantes pour votre deuxième appareil (device-02) en fonction du tableau suivant, puis régénérez et réexécutez l’exemple.

    Constant Fichier à utiliser
    leafPublicPem ./certs/device-02.cert.pem
    leafPrivateKey ./private/device-02.key.pem

Confirmer l’inscription du provisionnement de votre appareil

Examinez les enregistrements d’inscription du groupe d’inscription pour afficher les détails de l’inscription de vos appareils :

  1. Dans le Portail Azure, accédez à l’instance Device Provisioning Service.

  2. Dans le menu Paramètres, sélectionnez Gérer les inscriptions.

  3. Sélectionnez Groupes d’inscriptions. L’entrée du groupe d’inscription X.509 que vous avez créée précédemment doit apparaître dans la liste.

  4. Sélectionnez l’entrée d’inscription. Sélectionnez ensuite Détails à côté de État d’inscription pour afficher les appareils inscrits via le groupe d’inscription. L’instance IoT Hub à laquelle chacun de vos appareils a été affecté, leurs ID d’appareil et les dates et heures auxquelles ils ont été inscrits apparaissent dans la liste.

    Capture d’écran qui montre l’onglet des détails d’état d’inscription pour le groupe d’inscription sur le portail Azure.

  5. Vous pouvez sélectionner l’un des appareils pour afficher des détails supplémentaires à son sujet.

Pour vérifier les appareils sur votre hub IoT :

  1. Dans le Portail Azure, accédez au hub IoT auquel votre appareil a été attribué.

  2. Dans le menu Gestion des périphériques, sélectionnez Appareils.

  3. Si vos appareils ont été correctement approvisionnés, leurs ID d’appareil, device-01 et device-02 doivent apparaître dans la liste, avec État défini sur Activé. Si vous ne voyez pas vos appareils, sélectionnez Actualiser.

    Capture d’écran qui montre que les appareils sont enregistrés avec le hub IoT dans le portail Azure.

Nettoyer les ressources

Quand vous avez terminé de tester et explorer cet exemple de client d’appareil, effectuez les étapes suivantes pour supprimer toutes les ressources créées par ce tutoriel.

  1. Fermez la fenêtre de sortie de l’exemple de client d’appareil sur votre machine.

Supprimer votre groupe d’inscriptions

  1. Dans le menu de gauche du portail Azure, sélectionnez Toutes les ressources.

  2. Sélectionnez votre instance de DPS.

  3. Dans le menu Paramètres, sélectionnez Gérer les inscriptions.

  4. Sélectionnez l’onglet Groupes d’inscriptions.

  5. Sélectionnez le groupe d’inscription que vous avez utilisé pour ce tutoriel.

  6. Dans la page Détails de l’inscription, sélectionnez Détails en regard du statut d’inscription. Cochez ensuite la case en regard de l’en-tête de colonne ID d’appareil pour sélectionner tous les enregistrements d’inscription pour le groupe d’inscription. Sélectionnez Supprimer en haut de la page pour supprimer les enregistrements d’inscription.

    Important

    La suppression d’un groupe d’inscriptions ne supprime pas les enregistrements d’inscription qui lui sont associés. Ces enregistrements orphelins sont comptabilisés par rapport au quota d’inscriptions pour l’instance de DPS. Pour cette raison, il est recommandé de supprimer tous les enregistrements d’inscription associés à un groupe d’inscriptions avant de supprimer le groupe d’inscriptions lui-même.

  7. Revenez à la page Gérer les inscriptions et vérifiez que l’onglet Groupes d’inscriptions est sélectionné.

  8. Cochez la case en regard du nom du groupe d’inscription que vous avez utilisé pour ce tutoriel.

  9. En haut de la page, sélectionnez Supprimer.

Supprimer des certificats d’autorité de certification inscrits de DPS

  1. Sélectionnez Certificats dans le menu de gauche de votre instance DPS. Pour chaque certificat que vous avez chargé et vérifié dans le cadre de ce tutoriel, sélectionnez le certificat, puis Supprimer, et confirmez que vous voulez le supprimer.

Supprimer des inscriptions d’appareil du hub IoT

  1. Dans le menu de gauche du portail Azure, sélectionnez Toutes les ressources.

  2. Sélectionnez votre hub IoT.

  3. Dans le menu Explorateurs, sélectionnez Appareils IoT.

  4. Cochez la case en regard de l’ID de l'appareil des appareils que vous avez inscrits dans le cadre de ce tutoriel. Par exemple, device-01 et device-02.

  5. En haut de la page, sélectionnez Supprimer.

Étapes suivantes

Dans ce tutoriel, vous avez provisionné plusieurs appareils X.509 sur votre hub IoT à l’aide d’un groupe d’inscriptions. Ensuite, découvrez comment provisionner des appareils IoT sur plusieurs hubs.