Tutoriel : Configurer un serveur EST (Enrollment over Secure Transport) pour Azure IoT Edge

S’applique à :Coche IoT Edge 1.4 IoT Edge 1.4

Important

IoT Edge 1.4 est la version prise en charge. Si vous utilisez une version antérieure, consultez l’article Mettre à jour IoT Edge.

Avec Azure IoT Edge, vous pouvez configurer vos appareils pour qu’ils utilisent un serveur EST (Enrollment over Secure Transport) pour gérer les certificats x509.

Ce tutoriel vous guide dans l’hébergement d’un serveur EST de test, et dans la configuration d’un appareil IoT Edge pour l’inscription et le renouvellement des certificats x509. Dans ce tutoriel, vous allez apprendre à :

  • Créer et héberger un serveur EST de test
  • Configurer l’inscription de groupe DPS
  • Configurer l’appareil

Diagramme montrant une vue d’ensemble des trois étapes nécessaires pour effectuer ce tutoriel.

Prérequis

Qu’est-ce que EST (Enrollment over Secure Transport) ?

EST est un protocole de chiffrement qui automatise l’émission de certificats x.509. Il est utilisé pour les clients d’infrastructure à clé publique (PKI), comme IoT Edge, qui ont besoin de certificats clients associés à une autorité de certification. EST élimine la nécessité d’une gestion manuelle des certificats, qui peut être risquée et sujette aux erreurs.

Serveur EST

Pour l’émission et le renouvellement de certificats, vous avez besoin d’un serveur EST accessible par vos appareils.

Important

Pour les solutions de niveau entreprise, envisagez : GlobalSign IoT Edge Enroll ou DigiCert IoT Device Manager.

Pour les tests et le développement, vous pouvez utiliser un serveur EST de test. Dans ce tutoriel, nous allons créer un serveur EST de test.

Exécuter un serveur EST sur un appareil

Pour démarrer rapidement, ce tutoriel montre les étapes à suivre pour déployer un serveur EST simple dans un conteneur localement sur l’appareil IoT Edge. Cette méthode est l’approche la plus simple pour l’essayer.

Le fichier Dockerfile utilise Ubuntu 18.04, une bibliothèque Cisco appelée libest et un exemple de code serveur. Il est configuré avec le paramètre suivant, que vous pouvez modifier :

  • Autorité de certification racine valide pour 20 ans
  • Certificat de serveur EST valide pour 10 ans
  • Définissez les jours par défaut du certificat sur 1 pour tester le renouvellement EST
  • Le serveur EST s’exécute localement sur l’appareil IoT Edge dans un conteneur

Attention

N’utilisez pas ce fichier Dockerfile en production.

  1. Connectez-vous à l’appareil, par exemple en utilisant SSH, où vous avez installé IoT Edge.

  2. Créez un fichier nommé Dockerfile (en respectant la casse) et ajoutez l’exemple de contenu à en utilisant votre éditeur de texte préféré.

    Conseil

    Si vous souhaitez héberger votre serveur EST dans Azure Container Instance, remplacez myestserver.westus.azurecontainer.io par le nom DNS de votre serveur EST. Quand vous choisissez un nom DNS, notez que l’étiquette DNS d’une instance de conteneur Azure doit comporter au moins cinq caractères.

    # DO NOT USE IN PRODUCTION - Use only for testing #
    
    FROM ubuntu:18.04
    
    RUN apt update && apt install -y apache2-utils git openssl libssl-dev build-essential && \
        git clone https://github.com/cisco/libest.git && cd libest && \
        ./configure --disable-safec && make install && \
        rm -rf /src && apt remove --quiet -y libssl-dev build-essential && \
        apt autoremove -y && apt clean -y && apt autoclean -y && \
        rm -rf /var/lib/apt /tmp/* /var/tmp/*
    
    WORKDIR /libest/example/server/
    
    # Setting the root CA expiration to 20 years
    RUN sed -i "s|-days 365|-days 7300 |g" ./createCA.sh
    
    ## If you want to host your EST server remotely (for example, an Azure Container Instance),
    ## change myestserver.westus.azurecontainer.io to the fully qualified DNS name of your EST server
    ## OR, change the IP address
    ## and uncomment the corresponding line.
    # RUN sed -i "s|DNS.2 = ip6-localhost|DNS.2 = myestserver.westus.azurecontainer.io|g" ./ext.cnf
    # RUN sed -i "s|IP.2 = ::1|IP.2 = <YOUR EST SERVER IP ADDRESS>|g" ./ext.cnf
    
    # Set EST server certificate to be valid for 10 years
    RUN sed -i "s|-keyout \$EST_SERVER_PRIVKEY -subj|-keyout \$EST_SERVER_PRIVKEY -days 7300 -subj |g" ./createCA.sh
    
    # Create the CA
    RUN echo 1 | ./createCA.sh
    
    # Set cert default-days to 1 to show EST renewal
    RUN sed -i "s|default_days   = 365|default_days   = 1 |g" ./estExampleCA.cnf
    
    # The EST server listens on port 8085 by default
    # Uncomment to change the port to 443 or something else. If changed, EXPOSE that port instead of 8085. 
    # RUN sed -i "s|estserver -c|estserver -p 443 -c |g" ./runserver.sh
    EXPOSE 8085
    CMD ./runserver.sh
    
  3. Dans le répertoire contenant votre Dockerfile, générez votre image à partir de l’exemple de fichier Dockerfile.

    sudo docker build . --tag est
    
  4. Démarrez le conteneur et exposez le port 8085 du conteneur au port 8085 sur l’hôte.

    sudo docker run -d -p 8085:8085 est
    
  5. Votre serveur EST est maintenant en cours d’exécution et peut être atteint en utilisant localhost sur le port 8085. Vérifiez qu’il est disponible en exécutant une commande pour voir son certificat de serveur.

    openssl s_client -showcerts -connect localhost:8085
    
  6. Vous devriez voir -----BEGIN CERTIFICATE----- vers le milieu de la sortie. La récupération du certificat vérifie que le serveur est accessible et peut présenter son certificat.

Conseil

Pour exécuter ce conteneur dans le cloud, générez l’image et envoyez (push) l’image à Azure Container Registry. Suivez ensuite le guide de démarrage rapide pour effectuer le déploiement sur Azure Container Instance.

Télécharger le certificat d’autorité de certification

Chaque appareil nécessite le certificat d’autorité de certification qui est associé à un certificat d’identité d’appareil.

  1. Sur l’appareil IoT Edge, créez le répertoire /var/aziot/certs s’il n’existe pas, puis accédez-y.

    # If the certificate directory doen't exist, create, set ownership, and set permissions
    sudo mkdir -p /var/aziot/certs
    sudo chown aziotcs:aziotcs /var/aziot/certs
    sudo chmod 755 /var/aziot/certs
    
    # Change directory to /var/aziot/certs
    cd /var/aziot/certs
    
  2. Récupérez le certificat d’autorité de certification du serveur EST dans le répertoire /var/aziot/certs et nommez-le cacert.crt.pem.

    openssl s_client -showcerts -verify 5 -connect localhost:8085 < /dev/null | sudo awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".pem"; print >out}' && sudo cp cert2.pem cacert.crt.pem
    
  3. Les certificats doivent être détenus par l’utilisateur du service de clés aziotcs. Définissez la propriété sur aziotcs pour tous les fichiers de certificat et définissez les autorisations. Pour plus d’informations sur la propriété et les autorisations des certificats, consultez Conditions d’autorisation.

    # Give aziotcs ownership to certificates
    sudo chown -R aziotcs:aziotcs /var/aziot/certs
    # Read and write for aziotcs, read-only for others
    sudo find /var/aziot/certs -type f -name "*.*" -exec chmod 644 {} \;
    

Provisionner un appareil IoT Edge en utilisant DPS

L’utilisation du service Device Provisioning vous permet d’émettre et de renouveler automatiquement des certificats à partir d’un serveur EST dans IoT Edge. Quand vous utilisez le serveur EST du tutoriel, les certificats d’identité expirent au bout d’un jour, ce qui rend le provisionnement manuel avec IoT Hub impraticable, car chaque fois que le certificat expire, l’empreinte numérique doit être mise à jour manuellement dans IoT Hub. L’authentification de l’autorité de certification DPS auprès du groupe d’inscription permet de renouveler les certificats d’identité d’appareil sans aucune étape manuelle.

Charger le certificat d’autorité de certification sur DPS

  1. Si vous n’avez pas de service Device Provisioning lié à IoT Hub, consultez Démarrage rapide : Configurer le service IoT Hub Device Provisioning avec le portail Azure.

  2. Transférez le fichier cacert.crt.pem de votre appareil vers un ordinateur ayant accès au portail Azure, comme votre ordinateur de développement. Un moyen simple de transférer le certificat consiste à se connecter à distance à votre appareil, à afficher le certificat en utilisant la commande cat /var/aziot/certs/cacert.crt.pem, à copier la totalité de la sortie et à coller le contenu dans un nouveau fichier sur votre ordinateur de développement.

  3. Dans le Portail Microsoft Azure, accédez à votre instance du service IoT Hub Device Provisioning.

  4. Sous Paramètres, sélectionnez Certificats, puis +Ajouter.

    Capture d’écran de l’ajout d’un certificat d’autorité de certification au service Device Provisioning en utilisant le portail Azure.

    Paramètre Value
    Nom du certificat Spécifiez un nom convivial pour le certificat de l’autorité de certification
    Fichier .pem ou .cer de certificat Accédez au fichier cacert.crt.pem du serveur EST
    Définissez l’état du certificat sur vérifié lors du chargement​ Cochez la case
  5. Sélectionnez Enregistrer.

Créer un groupe d’inscriptions

  1. Dans le Portail Microsoft Azure, accédez à votre instance du service IoT Hub Device Provisioning.

  2. Sous Paramètres, sélectionnez Gérer les inscriptions.

  3. Sélectionnez Ajouter un groupe d’inscriptions et suivez les étapes ci-après pour configurer l’inscription.

  4. Sous l’onglet Inscription + approvisionnement , choisissez les paramètres suivants :

    Capture d’écran montrant l’ajout d’un groupe d’inscription DPS en utilisant le portail Azure.

    Paramètre Valeur
    Mécanisme d’attestation Sélectionnez Certificats X.509 chargés vers cette instance de service de provisionnement des appareils
    Certificat principal Choisissez votre certificat dans la liste déroulante
    Nom du groupe Spécifiez un nom convivial pour ce inscription de groupe
    État d’approvisionnement Sélectionnez la case Activer cette inscription
  5. Sous l’onglet Hubs IoT, choisissez votre IoT Hub dans la liste.

  6. Sous l’onglet Paramètres de l’appareil cochez la case Activer IoT Edge sur les appareils provisionnés.

    Les autres paramètres ne sont pas pertinents pour le tutoriel. Vous pouvez accepter les paramètres par défaut.

  7. Sélectionnez Revoir + créer.

Maintenant qu’une inscription existe pour l’appareil, le runtime IoT Edge peut gérer automatiquement les certificats d’appareil pour le hub IoT lié.

Configurer un appareil IoT Edge

Sur l’appareil IoT Edge, mettez à jour le fichier de configuration IoT Edge pour utiliser des certificats d’appareil provenant du serveur EST.

  1. Ouvrez le fichier config IoT Edge avec un éditeur. Par exemple, utilisez l’éditeur nano pour ouvrir le fichier /etc/aziot/config.toml.

    sudo nano /etc/aziot/config.toml
    
  2. Ajoutez ou remplacez les sections suivantes dans le fichier de configuration. Ces paramètres de configuration utilisent initialement l’authentification par nom d’utilisateur et mot de passe pour obtenir le certificat d’appareil auprès du serveur EST. Le certificat d’appareil est utilisé afin de s’authentifier auprès du serveur EST pour les renouvellements futurs de certificats.

    Remplacez le texte de l’espace réservé suivant : <DPS-ID-SCOPE> par l’ID d’étendue du DPS lié au hub IoT contenant l’appareil inscrit, et myiotedgedevice par l’ID d’appareil inscrit dans Azure IoT Hub. Vous trouverez la valeur de ID d’étendue dans la page Vue d’ensemble de DPS.

    # DPS provisioning with X.509 certificate
    # Replace with ID Scope from your DPS
    [provisioning]
    source = "dps"
    global_endpoint = "https://global.azure-devices-provisioning.net"
    id_scope = "<DPS-ID-SCOPE>"
    
    [provisioning.attestation]
    method = "x509"
    registration_id = "myiotedgedevice"
    
    [provisioning.attestation.identity_cert]
    method = "est"
    common_name = "myiotedgedevice"
    
    # Auto renewal settings for the identity cert
    # Available only from IoT Edge 1.3 and above
    [provisioning.attestation.identity_cert.auto_renew]
    rotate_key = false
    threshold = "80%"
    retry = "4%"
    
    # Trusted root CA certificate in the global EST options
    # Optional if the EST server's TLS certificate is already trusted by the system's CA certificates.
    [cert_issuance.est]
        trusted_certs = [
            "file:///var/aziot/certs/cacert.crt.pem",
        ]
    
    # The default username and password for libest
    # Used for initial authentication to EST server
    #
    # Not recommended for production
    [cert_issuance.est.auth]
    username = "estuser"
    password = "estpwd"
    
    [cert_issuance.est.urls]
    default = "https://localhost:8085/.well-known/est"
    

    Notes

    Dans cet exemple, IoT Edge utilise un nom d’utilisateur et un mot de passe pour s’authentifier auprès du serveur EST chaque fois qu’il doit obtenir un certificat. Cette méthode n’est pas recommandée en production, car 1) elle nécessite le stockage d’un secret en texte en clair et 2) IoT Edge doit également utiliser un certificat d’identité pour s’authentifier auprès du serveur EST. Pour modifier pour la production :

    1. Envisagez d’utiliser des certificats de démarrage de longue durée qui peuvent être stockés sur l’appareil lors de la fabrication, de façon similaire à l’approche recommandée pour DPS. Pour savoir comment configurer un certificat de démarrage pour le serveur EST, consultez Authentifier un appareil en utilisant des certificats émis dynamiquement via EST.
    2. Configurez [cert_issuance.est.identity_auto_renew] en utilisant la même syntaxe que la configuration de renouvellement automatique de certificat d’approvisionnement ci-dessus.

    De cette façon, le service de certificat IoT Edge utilise le certificat de démarrage pour l’authentification initiale auprès du serveur EST et demande un certificat d’identité pour les futures requêtes EST adressées au même serveur. Si, pour une raison quelconque, le certificat d’identité EST expire avant le renouvellement, IoT Edge revient à l’utilisation du certificat de démarrage.

  3. Exécutez sudo iotedge config apply pour appliquer les nouveaux paramètres.

  4. Exécutez sudo iotedge check pour vérifier la configuration de votre appareil IoT Edge. Toutes les vérifications de configuration doivent réussir. Pour ce tutoriel, vous pouvez ignorer les erreurs et avertissements de préparation à la production, les avertissements du serveur DNS et les vérifications de la connectivité.

  5. Accédez à votre appareil dans IoT Hub. Les empreintes numériques de certificat ont été ajoutées automatiquement en utilisant DPS et le serveur EST.

    Capture d’écran montrant les paramètres de l’appareil IoT Hub dans le portail Azure. Les champs des empreintes numériques du certificat contiennent des valeurs.

    Notes

    Quand vous créez un appareil IoT Edge, il affiche le code d’état 417 -- The device's deployment configuration is not set in the Azure portal.. Cet état est normal et signifie que l’appareil est prêt à recevoir un déploiement de module.

Tester le renouvellement de certificat

Vous pouvez immédiatement réémettre les certificats d’identité de l’appareil en supprimant les certificats et clés existants de l’appareil, puis en appliquant la configuration IoT Edge. IoT Edge détecte les fichiers manquants et demande de nouveaux certificats.

  1. Sur l’appareil IoT Edge, arrêtez le runtime IoT Edge.

    sudo iotedge system stop
    
  2. Supprimez les certificats et les clés existants.

    sudo sh -c "rm /var/lib/aziot/certd/certs/*"
    sudo sh -c "rm /var/lib/aziot/keyd/keys/*"
    
  3. Appliquez la configuration IoT Edge pour renouveler les certificats.

    sudo iotedge config apply
    

    Vous aurez peut-être à attendre quelques minutes pour que le runtime démarre.

  4. Accédez à votre appareil dans IoT Hub. Les empreintes numériques du certificat ont été mises à jour.

    Capture d’écran montrant les paramètres de l’appareil IoT Hub dans le portail Azure. Les champs des empreintes numériques du certificat contiennent des nouvelles valeurs.

  5. Listez les fichiers de certificat en utilisant la commande sudo ls -l /var/lib/aziot/certd/certs. Vous devez voir des dates de création récentes pour les fichiers de certificat d’appareil.

  6. Utilisez la commande openssl pour vérifier le contenu du nouveau certificat. Par exemple :

    sudo openssl x509 -in /var/lib/aziot/certd/certs/deviceid-bd732105ef89cf8edd2606a5309c8a26b7b5599a4e124a0fe6199b6b2f60e655.cer -text -noout
    

    Remplacez le nom du fichier de certificat d’appareil (.cer) par le fichier de certificat de votre appareil.

    Vous devez voir que la plage de dates Validité du certificat a changé.

Voici d’autres façons facultatives de tester le renouvellement de certificat. Ces vérifications montrent comment IoT Edge renouvelle les certificats à partir du serveur EST lorsqu’ils expirent ou sont manquants. Après chaque test, vous pouvez vérifier les nouvelles empreintes dans le portail Azure et utiliser la commande openssl pour vérifier le nouveau certificat.

  1. Essayez en attendant un jour pour que le certificat expire. Le serveur EST de test est configuré pour créer des certificats qui expirent après un jour. IoT Edge renouvelle automatiquement le certificat.
  2. Essayez d’ajuster le pourcentage de threshold pour le renouvellement automatique défini dans config.toml (actuellement défini sur 80 % dans l’exemple de configuration). Par exemple, définissez-le sur 10% et observez le renouvellement du certificat environ toutes les 2 heures.
  3. Essayez d’ajuster threshold sur un chiffre entier suivi de m (minutes). Par exemple, définissez-le sur 60m et observez le renouvellement de certificat 1 heure avant l’expiration.

Nettoyer les ressources

Vous pouvez conserver les ressources et les configurations que vous avez créées dans ce tutoriel et les réutiliser. Sinon, vous pouvez supprimer les ressources Azure et les configurations locales que vous avez utilisées dans cet article pour éviter les frais.

Supprimer les ressources Azure

La suppression des ressources et des groupes de ressources Azure est irréversible. Veillez à ne pas supprimer accidentellement les mauvaises ressources ou le mauvais groupe de ressources. Si vous avez créé le hub IoT à l’intérieur d’un groupe de ressources existant qui contient des ressources que vous souhaitez conserver, supprimez uniquement la ressource du hub IoT, plutôt que le groupe de ressources.

Pour supprimer les ressources :

  1. Connectez-vous au Portail Azure, puis sélectionnez Groupes de ressources.

  2. Sélectionnez le nom du groupe de ressources contenant vos ressources de test de IoT Edge.

  3. Passez en revue la liste des ressources contenues dans votre groupe de ressources. Si vous souhaitez toutes les supprimer, vous pouvez sélectionner Supprimer le groupe de ressources. Si vous souhaitez en supprimer seulement quelques-unes, vous pouvez cliquer sur chaque ressource pour les supprimer individuellement.

Étapes suivantes