Guide pratique pour connecter des appareils avec des certificats X.509 à une application IoT Central
Pour sécuriser la communication entre un appareil et votre application, IoT Central prend en charge les signatures d’accès partagé (SAP) et les certificats X.509. Le didacticiel Créer et connecter une application cliente à votre application Azure IoT Central utilise SAS. Dans cet article, vous allez apprendre à modifier l’exemple de code pour utiliser des certificats X.509. Les certificats X.509 sont recommandés dans les environnements de production. Pour plus d’informations, consultez Concepts d’authentification des appareils.
Ce guide montre deux façons d’utiliser des certificats X.509 : les inscriptions de groupe, généralement utilisées dans un environnement de production, et les inscriptions individuelles, utiles pour les tests. Cet article explique également comment renouveler des certificats d’appareil pour maintenir la connectivité quand les certificats expirent.
Ce guide s’appuie sur les exemples présentés dans le tutoriel Créer et connecter une application cliente à votre application Azure IoT Central qui utilise C#, Java, JavaScript et Python. Pour obtenir un exemple qui utilise le langage de programmation C, consultez la page Provisionner plusieurs appareils X.509 à l’aide de groupes d’inscriptions.
Prérequis
Avant de suivre les étapes décrites dans ce guide pratique, vous devez avoir suivi le tutoriel Créer et connecter une application cliente à votre application Azure IoT Central. Vous modifiez le code utilisé dans le tutoriel lorsque vous suivez les étapes de ce guide.
Dans ce guide pratique, vous allez générer des certificats de test X.509. Pour pouvoir générer ces certificats, vous avez besoin des éléments suivants :
- Une machine de développement où Node.js version 6 ou ultérieure est installé. Vous pouvez exécuter
node --version
sur la ligne de commande pour vérifier la version. Les instructions de ce tutoriel supposent que vous exécutez la commande node à l’invite de commandes Windows. Toutefois, vous pouvez utiliser Node.js sur de nombreux autres systèmes d’exploitation. - Une copie locale du dépôt GitHub SDK Microsoft Azure IoT pour Node.js qui contient les scripts permettant de générer les certificats de test X.509. Utilisez ce lien pour télécharger une copie du dépôt : Télécharger le fichier ZIP. Décompressez ensuite le fichier dans un emplacement approprié de votre ordinateur local.
Utiliser l’inscription de groupe
Utilisez des certificats X.509 avec une inscription de groupe dans un environnement de production. Dans une inscription de groupe, vous ajoutez un certificat X.509 racine ou intermédiaire à votre application IoT Central. Les appareils avec des certificats feuilles dérivés du certificat racine ou intermédiaire peuvent se connecter à votre application.
Générer des certificats racines et d’appareil
Dans cette section, vous utilisez un certificat X.509 pour connecter un appareil avec un certificat dérivé du certificat du groupe d’inscription IoT Central.
Avertissement
Cette façon de générer des certificats X.509 est destinée aux tests uniquement. Dans le cas d’un environnement de production, vous devez utiliser votre mécanisme sécurisé officiel pour la génération de certificats.
Accédez au script du générateur de certificats dans le SDK Microsoft Azure IoT pour Node.js que vous avez téléchargé. Installez les packages nécessaires :
cd azure-iot-sdk-node/provisioning/tools npm install
Créez un certificat racine, puis dérivez un certificat d’appareil en exécutant le script :
node create_test_cert.js root mytestrootcert node create_test_cert.js device sample-device-01 mytestrootcert
Conseil
Un ID d’appareil peut contenir des lettres, des chiffres et le caractère
-
.
Ces commandes génèrent les certificats racines et les certificats d’appareil suivants :
Nom de fichier | Contenus |
---|---|
mytestrootcert_cert.pem | Partie publique du certificat X.509 racine |
mytestrootcert_key.pem | Clé privée pour le certificat X.509 racine |
mytestrootcert_fullchain.pem | Trousseau complet pour le certificat X.509 racine. |
mytestrootcert.pfx | Fichier PFX du certificat x509 racine. |
sampleDevice01_cert.pem | Partie publique du certificat X.509 de l’appareil |
sampleDevice01_key.pem | Clé privée pour le certificat X.509 de l’appareil |
sampleDevice01_fullchain.pem | Trousseau complet pour le certificat X.509 de l’appareil. |
sampleDevice01.pfx | Fichier PFX du certificat x509 de l’appareil. |
Notez l’emplacement de ces fichiers. Vous en aurez besoin ultérieurement.
Créer une inscription de groupe
Ouvrez votre application IoT Central et accédez à Autorisations dans le volet gauche, puis sélectionnez les Groupes de connexion d’appareil.
Sélectionnez + Nouveau pour créer un nouveau groupe d’inscriptions appelé MyX509Group avec un type d’attestation Certificats (X.509). Vous pouvez créer des groupes d’inscription pour des appareils IoT ou des appareils IoT Edge.
Dans le groupe d’inscriptions que vous avez créé, sélectionnez Gérer le principal.
Dans le volet Certificat principal, sélectionnez Ajouter un certificat.
Chargez le fichier de certificat racine appelé mytestrootcert_cert.pem que vous avez généré précédemment.
Si vous utilisez une autorité de certification intermédiaire ou racine à laquelle vous faites confiance et que vous savez que vous avez la pleine propriété du certificat, vous pouvez attester de vous-même que vous avez vérifié le certificat en définissant l’état du certificat vérifié lors du chargement sur Activé. Sinon, définissez l’état du certificat vérifié lors du chargement sur Désactivé.
Si vous définissez l’état du certificat vérifié lors du chargement sur Désactivé, sélectionnez Générer un code de vérification.
Copiez le code de vérification, puis créez un certificat de vérification X.509. Par exemple, à l’invite de commandes :
node create_test_cert.js verification --ca mytestrootcert_cert.pem --key mytestrootcert_key.pem --nonce {verification-code}
Sélectionnez Vérifier afin de charger le certificat de vérification signé verification_cert.pem pour terminer la vérification.
L’état du certificat principal est maintenant Vérifié :
Vous pouvez maintenant connecter des appareils qui ont un certificat X.509 dérivé de ce certificat racine principal.
Après avoir enregistré le groupe d’inscriptions, prenez note de l’étendue de l’ID. Vous en aurez besoin ultérieurement.
Exécuter l’exemple de code d’appareil
Si vous utilisez Windows, les certificats X.509 doivent se trouver dans le magasin de certificats Windows pour que l’exemple fonctionne. Dans l’Explorateur Windows, double-cliquez sur les fichiers PFX que vous avez générés précédemment - mytestrootcert.pfx
et sampleDevice01.pfx
. Dans l’Assistant Importation de certificat, sélectionnez Utilisateur actuel comme emplacement du magasin, entrez 1234
comme mot de passe, puis laissez l’Assistant choisir automatiquement le magasin de certificats. L’Assistant importe les certificats dans le magasin personnel de l’utilisateur actuel.
Pour modifier l’exemple de code afin d’utiliser les certificats X.509 :
Dans la solution Visual Studio IoTHubDeviceSamples, ouvrez le fichier Parameter.cs dans le projet TemperatureController.
Ajoutez les deux définitions de paramètre suivantes à la classe :
[Option( 'x', "CertificatePath", HelpText = "(Required if DeviceSecurityType is \"dps\"). \nThe device PFX file to use during device provisioning." + "\nDefaults to environment variable \"IOTHUB_DEVICE_X509_CERT\".")] public string CertificatePath { get; set; } = Environment.GetEnvironmentVariable("IOTHUB_DEVICE_X509_CERT"); [Option( 'p', "CertificatePassword", HelpText = "(Required if DeviceSecurityType is \"dps\"). \nThe password of the PFX certificate file." + "\nDefaults to environment variable \"IOTHUB_DEVICE_X509_PASSWORD\".")] public string CertificatePassword { get; set; } = Environment.GetEnvironmentVariable("IOTHUB_DEVICE_X509_PASSWORD");
Enregistrez les modifications.
Dans la solution Visual Studio IoTHubDeviceSamples, ouvrez le fichier Program.cs dans le projet TemperatureController.
Ajoutez les instructions
using
suivantes :using System.Security.Cryptography.X509Certificates; using System.IO;
Ajoutez la méthode suivante à la classe :
private static X509Certificate2 LoadProvisioningCertificate(Parameters parameters) { var certificateCollection = new X509Certificate2Collection(); certificateCollection.Import( parameters.CertificatePath, parameters.CertificatePassword, X509KeyStorageFlags.UserKeySet); X509Certificate2 certificate = null; foreach (X509Certificate2 element in certificateCollection) { Console.WriteLine($"Found certificate: {element?.Thumbprint} {element?.Subject}; PrivateKey: {element?.HasPrivateKey}"); if (certificate == null && element.HasPrivateKey) { certificate = element; } else { element.Dispose(); } } if (certificate == null) { throw new FileNotFoundException($"{parameters.CertificatePath} did not contain any certificate with a private key."); } Console.WriteLine($"Using certificate {certificate.Thumbprint} {certificate.Subject}"); return certificate; }
Dans la méthode
SetupDeviceClientAsync
, remplacez le bloc de code pourcase "dps"
par le code suivant :case "dps": s_logger.LogDebug($"Initializing via DPS"); Console.WriteLine($"Loading the certificate..."); X509Certificate2 certificate = LoadProvisioningCertificate(parameters); DeviceRegistrationResult dpsRegistrationResult = await ProvisionDeviceAsync(parameters, certificate, cancellationToken); var authMethod = new DeviceAuthenticationWithX509Certificate(dpsRegistrationResult.DeviceId, certificate); deviceClient = InitializeDeviceClient(dpsRegistrationResult.AssignedHub, authMethod); break;
Remplacez la méthode
ProvisionDeviceAsync
par le code suivant :private static async Task<DeviceRegistrationResult> ProvisionDeviceAsync(Parameters parameters, X509Certificate2 certificate, CancellationToken cancellationToken) { SecurityProvider security = new SecurityProviderX509Certificate(certificate); ProvisioningTransportHandler mqttTransportHandler = new ProvisioningTransportHandlerMqtt(); ProvisioningDeviceClient pdc = ProvisioningDeviceClient.Create(parameters.DpsEndpoint, parameters.DpsIdScope, security, mqttTransportHandler); var pnpPayload = new ProvisioningRegistrationAdditionalData { JsonData = PnpConvention.CreateDpsPayload(ModelId), }; return await pdc.RegisterAsync(pnpPayload, cancellationToken); }
Enregistrez les modifications.
Pour exécuter l’exemple :
Ajoutez les variables d’environnement suivantes au projet :
IOTHUB_DEVICE_X509_CERT
:<full path to folder that contains PFX files>sampleDevice01.pfx
IOTHUB_DEVICE_X509_PASSWORD
: 1234.
Générez et exécutez l’application. Vérifiez que l’appareil est correctement provisionné.
Pour modifier l’exemple de code afin d’utiliser les certificats X.509 :
Accédez au dossier azure-iot-sdk-java/device/iot-device-samples/pnp-device-sample/temperature-controller-device-sample qui contient le fichier pom.xml et le dossier src pour l’exemple d’appareil contrôleur de température.
Modifiez le fichier pom.xml pour ajouter la configuration des dépendances suivante au nœud
<dependencies>
:<dependency> <groupId>com.microsoft.azure.sdk.iot.provisioning.security</groupId> <artifactId>${x509-provider-artifact-id}</artifactId> <version>${x509-provider-version}</version> </dependency>
Enregistrez les modifications.
Ouvrez le fichier src/main/java/samples/com/microsoft/azure/sdk/iot/device/TemperatureController.java dans votre éditeur de texte.
Remplacez l’importation
SecurityProviderSymmetricKey
par les importations suivantes :import com.microsoft.azure.sdk.iot.provisioning.security.SecurityProvider; import com.microsoft.azure.sdk.iot.provisioning.security.hsm.SecurityProviderX509Cert; import com.microsoft.azure.sdk.iot.provisioning.security.exceptions.SecurityProviderException;
Ajoutez l’importation suivante :
import java.nio.file.*;
Ajoutez
SecurityProviderException
à la liste des exceptions levées par la méthodemain
:public static void main(String[] args) throws IOException, URISyntaxException, ProvisioningDeviceClientException, InterruptedException, SecurityProviderException {
Remplacez la méthode
initializeAndProvisionDevice
par le code suivant :private static void initializeAndProvisionDevice() throws ProvisioningDeviceClientException, IOException, URISyntaxException, InterruptedException, SecurityProviderException { String deviceX509Key = new String(Files.readAllBytes(Paths.get(System.getenv("IOTHUB_DEVICE_X509_KEY")))); String deviceX509Cert = new String(Files.readAllBytes(Paths.get(System.getenv("IOTHUB_DEVICE_X509_CERT")))); SecurityProvider securityProviderX509 = new SecurityProviderX509Cert(deviceX509Cert, deviceX509Key, null); ProvisioningDeviceClient provisioningDeviceClient; ProvisioningStatus provisioningStatus = new ProvisioningStatus(); provisioningDeviceClient = ProvisioningDeviceClient.create(globalEndpoint, scopeId, provisioningProtocol, securityProviderX509); AdditionalData additionalData = new AdditionalData(); additionalData.setProvisioningPayload(com.microsoft.azure.sdk.iot.provisioning.device.plugandplay.PnpHelper.createDpsPayload(MODEL_ID)); provisioningDeviceClient.registerDevice(new ProvisioningDeviceClientRegistrationCallbackImpl(), provisioningStatus, additionalData); while (provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getProvisioningDeviceClientStatus() != ProvisioningDeviceClientStatus.PROVISIONING_DEVICE_STATUS_ASSIGNED) { if (provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getProvisioningDeviceClientStatus() == ProvisioningDeviceClientStatus.PROVISIONING_DEVICE_STATUS_ERROR || provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getProvisioningDeviceClientStatus() == ProvisioningDeviceClientStatus.PROVISIONING_DEVICE_STATUS_DISABLED || provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getProvisioningDeviceClientStatus() == ProvisioningDeviceClientStatus.PROVISIONING_DEVICE_STATUS_FAILED) { provisioningStatus.exception.printStackTrace(); System.out.println("Registration error, bailing out"); break; } System.out.println("Waiting for Provisioning Service to register"); Thread.sleep(MAX_TIME_TO_WAIT_FOR_REGISTRATION); } ClientOptions options = new ClientOptions(); options.setModelId(MODEL_ID); if (provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getProvisioningDeviceClientStatus() == ProvisioningDeviceClientStatus.PROVISIONING_DEVICE_STATUS_ASSIGNED) { System.out.println("IotHUb Uri : " + provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getIothubUri()); System.out.println("Device ID : " + provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getDeviceId()); String iotHubUri = provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getIothubUri(); String deviceId = provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getDeviceId(); log.debug("Opening the device client."); deviceClient = DeviceClient.createFromSecurityProvider(iotHubUri, deviceId, securityProviderX509, IotHubClientProtocol.MQTT, options); deviceClient.open(); } }
Enregistrez les modifications.
Pour exécuter l’exemple :
Dans votre environnement d’interpréteur de commandes, ajoutez les deux variables d’environnement suivantes. Veillez à fournir le chemin complet des fichiers PEM et utilisez le délimiteur de chemin approprié pour votre système d’exploitation :
set IOTHUB_DEVICE_X509_CERT=<full path to folder that contains PEM files>sampleDevice01_cert.pem set IOTHUB_DEVICE_X509_KEY=<full path to folder that contains PEM files>sampleDevice01_key.pem
Conseil
Vous définissez les autres variables d’environnement requises lorsque vous avez terminé le tutoriel Créer et connecter une application cliente à votre application Azure IoT Central.
Générez et exécutez l’application. Vérifiez que l’appareil est correctement provisionné.
Pour modifier l’exemple de code afin d’utiliser les certificats X.509 :
Accédez au dossier azure-iot-sdk-node/device/samples/javascript contenant l’application pnp_temperature_controller.js, puis exécutez la commande suivante pour installer le package X.509 :
npm install azure-iot-security-x509 --save
Ouvrez le fichier pnp_temperature_controller.js dans un éditeur de texte.
Modifiez les instructions
require
pour inclure le code suivant :const fs = require('fs'); const X509Security = require('azure-iot-security-x509').X509Security;
Ajoutez les quatre lignes suivantes à la section « Informations de connexion DPS » pour initialiser la variable
deviceCert
:const deviceCert = { cert: fs.readFileSync(process.env.IOTHUB_DEVICE_X509_CERT).toString(), key: fs.readFileSync(process.env.IOTHUB_DEVICE_X509_KEY).toString() };
Modifiez la fonction
provisionDevice
qui crée le client en remplaçant la première ligne par le code suivant :var provSecurityClient = new X509Security(registrationId, deviceCert);
Dans la même fonction, modifiez la ligne qui définit la variable
deviceConnectionString
comme suit :deviceConnectionString = 'HostName=' + result.assignedHub + ';DeviceId=' + result.deviceId + ';x509=true';
Dans la fonction
main
, ajoutez la ligne suivante après la ligne qui appelleClient.fromConnectionString
:client.setOptions(deviceCert);
Enregistrez les modifications.
Pour exécuter l’exemple :
Dans votre environnement d’interpréteur de commandes, ajoutez les deux variables d’environnement suivantes. Veillez à fournir le chemin complet des fichiers PEM et utilisez le délimiteur de chemin approprié pour votre système d’exploitation :
set IOTHUB_DEVICE_X509_CERT=<full path to folder that contains PEM files>sampleDevice01_cert.pem set IOTHUB_DEVICE_X509_KEY=<full path to folder that contains PEM files>sampleDevice01_key.pem
Conseil
Vous définissez les autres variables d’environnement requises lorsque vous avez terminé le tutoriel Créer et connecter une application cliente à votre application Azure IoT Central.
Exécutez le script et vérifiez que l’appareil est correctement provisionné :
node pnp_temperature_controller.js
Pour modifier l’exemple de code afin d’utiliser les certificats X.509 :
Accédez au dossier azure-iot-device/samples/pnp et ouvrez le fichier temp_controller_with_thermostats.py dans un éditeur de texte.
Utilisez l’instruction
from
suivante pour importer la fonctionnalité X.509 :from azure.iot.device import X509
Modifiez la première partie de la fonction
provision_device
comme suit :async def provision_device(provisioning_host, id_scope, registration_id, x509, model_id): provisioning_device_client = ProvisioningDeviceClient.create_from_x509_certificate( provisioning_host=provisioning_host, registration_id=registration_id, id_scope=id_scope, x509=x509, )
Dans la fonction
main
, remplacez la ligne qui définit la variablesymmetric_key
par le code suivant :x509 = X509( cert_file=os.getenv("IOTHUB_DEVICE_X509_CERT"), key_file=os.getenv("IOTHUB_DEVICE_X509_KEY"), )
Dans la fonction
main
, remplacez l’appel à la fonctionprovision_device
par le code suivant :registration_result = await provision_device( provisioning_host, id_scope, registration_id, x509, model_id )
Dans la fonction
main
, remplacez l’appel à la fonctionIoTHubDeviceClient.create_from_symmetric_key
par le code suivant :device_client = IoTHubDeviceClient.create_from_x509_certificate( x509=x509, hostname=registration_result.registration_state.assigned_hub, device_id=registration_result.registration_state.device_id, product_info=model_id, )
Enregistrez les modifications.
Pour exécuter l’exemple :
Dans votre environnement d’interpréteur de commandes, ajoutez les deux variables d’environnement suivantes. Veillez à fournir le chemin complet des fichiers PEM et utilisez le délimiteur de chemin approprié pour votre système d’exploitation :
set IOTHUB_DEVICE_X509_CERT=<full path to folder that contains PEM files>sampleDevice01_cert.pem set IOTHUB_DEVICE_X509_KEY=<full path to folder that contains PEM files>sampleDevice01_key.pem
Conseil
Vous définissez les autres variables d’environnement requises lorsque vous avez terminé le tutoriel Créer et connecter une application cliente à votre application Azure IoT Central.
Exécutez le script et vérifiez que l’appareil est correctement provisionné :
python temp_controller_with_thermostats.py
Vérifiez que la télémétrie s’affiche sur la vue de l’appareil dans votre application IoT Central :
Utiliser une inscription individuelle
Utilisez des certificats X.509 avec une inscription individuelle pour tester votre appareil et votre solution. Dans le cas d’une inscription individuelle, il n’existe aucun certificat X.509 racine ou intermédiaire dans votre application IoT Central. Les appareils utilisent un certificat X.509 auto-signé pour se connecter à votre application.
Générer un certificat d’appareil auto-signé
Dans cette section, vous utilisez un certificat X.509 auto-signé pour connecter des appareils pour une inscription individuelle, afin d’inscrire un seul appareil. Les certificats auto-signés sont destinés aux tests uniquement.
Avertissement
Cette façon de générer des certificats X.509 est destinée aux tests uniquement. Dans le cas d’un environnement de production, vous devez utiliser votre mécanisme sécurisé officiel pour la génération de certificats.
Créez un certificat d’appareil X.509 auto-signé en exécutant les commandes suivantes :
cd azure-iot-sdk-node/provisioning/tools
node create_test_cert.js device mytestselfcertprimary
node create_test_cert.js device mytestselfcertsecondary
Conseil
Un ID d’appareil peut contenir des lettres, des chiffres et le caractère -
.
Ces commandes génèrent les certificats d’appareil suivants :
Nom de fichier | Contenus |
---|---|
mytestselfcertprimary_cert.pem | Partie publique du certificat X.509 de l’appareil principal |
mytestselfcertprimary_key.pem | Clé privée du certificat X.509 de l’appareil principal |
mytestselfcertprimary_fullchain.pem | Trousseau entier du certificat x509 de l’appareil principal. |
mytestselfcertprimary.pfx | Fichier PFX du certificat x509 de l’appareil principal. |
mytestselfcertsecondary_cert.pem | Partie publique du certificat X.509 de l’appareil secondaire |
mytestselfcertsecondary_key.pem | Clé privée du certificat X.509 de l’appareil secondaire |
mytestselfcertsecondary_fullchain.pem | Trousseau entier du certificat x509 de l’appareil secondaire. |
mytestselfcertsecondary.pfx | Fichier PFX du certificat x509 de l’appareil secondaire. |
Créer une inscription individuelle
Dans l’application Azure IoT Central, sélectionnez Appareils, puis créez un appareil avec ID d’appareil comme mytestselfcertprimary à partir du modèle d’appareil thermostat. Prenez note de l’Étendue de l’ID. Vous l’utiliserez plus tard.
Ouvrez l’appareil que vous avez créé, puis sélectionnez Connecter.
Sélectionnez Inscription individuelle comme Type d’authentification, puis certificats (X.509) comme Méthode d’authentification.
Chargez le fichier mytestselfcertprimary_cert.pem que vous avez généré précédemment en tant que certificat principal.
Chargez le fichier mytestselfcertsecondary_cert.pem que vous avez généré précédemment en tant que certificat secondaire. Ensuite, sélectionnez Enregistrer.
L’appareil dispose désormais d’une inscription individuelle avec des certificats X.509.
Exécuter un exemple d’appareil d’inscription individuelle
Si vous utilisez Windows, les certificats X.509 doivent se trouver dans le magasin de certificats Windows pour que l’exemple fonctionne. Dans l’Explorateur Windows, double-cliquez sur les fichiers PFX que vous avez générés précédemment - mytestselfcertprimary.pfx
et mytestselfcertsecondary.pfx
. Dans l’Assistant Importation de certificat, sélectionnez Utilisateur actuel comme emplacement du magasin, entrez 1234
comme mot de passe, puis laissez l’Assistant choisir automatiquement le magasin de certificats. L’Assistant importe les certificats dans le magasin personnel de l’utilisateur actuel.
Pour modifier l’exemple de code afin d’utiliser les certificats X.509 :
Dans la solution Visual Studio IoTHubDeviceSamples, ouvrez le fichier Parameter.cs dans le projet TemperatureController.
Ajoutez les deux définitions de paramètre suivantes à la classe :
[Option( 'x', "CertificatePath", HelpText = "(Required if DeviceSecurityType is \"dps\"). \nThe device PFX file to use during device provisioning." + "\nDefaults to environment variable \"IOTHUB_DEVICE_X509_CERT\".")] public string CertificatePath { get; set; } = Environment.GetEnvironmentVariable("IOTHUB_DEVICE_X509_CERT"); [Option( 'p', "CertificatePassword", HelpText = "(Required if DeviceSecurityType is \"dps\"). \nThe password of the PFX certificate file." + "\nDefaults to environment variable \"IOTHUB_DEVICE_X509_PASSWORD\".")] public string CertificatePassword { get; set; } = Environment.GetEnvironmentVariable("IOTHUB_DEVICE_X509_PASSWORD");
Enregistrez les modifications.
Dans la solution Visual Studio IoTHubDeviceSamples, ouvrez le fichier Program.cs dans le projet TemperatureController.
Ajoutez les instructions
using
suivantes :using System.Security.Cryptography.X509Certificates; using System.IO;
Ajoutez la méthode suivante à la classe :
private static X509Certificate2 LoadProvisioningCertificate(Parameters parameters) { var certificateCollection = new X509Certificate2Collection(); certificateCollection.Import( parameters.CertificatePath, parameters.CertificatePassword, X509KeyStorageFlags.UserKeySet); X509Certificate2 certificate = null; foreach (X509Certificate2 element in certificateCollection) { Console.WriteLine($"Found certificate: {element?.Thumbprint} {element?.Subject}; PrivateKey: {element?.HasPrivateKey}"); if (certificate == null && element.HasPrivateKey) { certificate = element; } else { element.Dispose(); } } if (certificate == null) { throw new FileNotFoundException($"{parameters.CertificatePath} did not contain any certificate with a private key."); } Console.WriteLine($"Using certificate {certificate.Thumbprint} {certificate.Subject}"); return certificate; }
Dans la méthode
SetupDeviceClientAsync
, remplacez le bloc de code pourcase "dps"
par le code suivant :case "dps": s_logger.LogDebug($"Initializing via DPS"); Console.WriteLine($"Loading the certificate..."); X509Certificate2 certificate = LoadProvisioningCertificate(parameters); DeviceRegistrationResult dpsRegistrationResult = await ProvisionDeviceAsync(parameters, certificate, cancellationToken); var authMethod = new DeviceAuthenticationWithX509Certificate(dpsRegistrationResult.DeviceId, certificate); deviceClient = InitializeDeviceClient(dpsRegistrationResult.AssignedHub, authMethod); break;
Remplacez la méthode
ProvisionDeviceAsync
par le code suivant :private static async Task<DeviceRegistrationResult> ProvisionDeviceAsync(Parameters parameters, X509Certificate2 certificate, CancellationToken cancellationToken) { SecurityProvider security = new SecurityProviderX509Certificate(certificate); ProvisioningTransportHandler mqttTransportHandler = new ProvisioningTransportHandlerMqtt(); ProvisioningDeviceClient pdc = ProvisioningDeviceClient.Create(parameters.DpsEndpoint, parameters.DpsIdScope, security, mqttTransportHandler); var pnpPayload = new ProvisioningRegistrationAdditionalData { JsonData = PnpConvention.CreateDpsPayload(ModelId), }; return await pdc.RegisterAsync(pnpPayload, cancellationToken); }
Enregistrez les modifications.
Pour exécuter l’exemple :
Ajoutez les variables d’environnement suivantes au projet :
IOTHUB_DEVICE_DPS_DEVICE_ID
: mytestselfcertprimary.pfxIOTHUB_DEVICE_X509_CERT
:<full path to folder that contains PFX files>mytestselfcertprimary.pfx
IOTHUB_DEVICE_X509_PASSWORD
: 1234.
Générez et exécutez l’application. Vérifiez que l’appareil est correctement provisionné.
Pour modifier l’exemple de code afin d’utiliser les certificats X.509 :
Accédez au dossier azure-iot-sdk-java/device/iot-device-samples/pnp-device-sample/temperature-controller-device-sample qui contient le fichier pom.xml et le dossier src pour l’exemple d’appareil contrôleur de température.
Modifiez le fichier pom.xml pour ajouter la configuration des dépendances suivante au nœud
<dependencies>
:<dependency> <groupId>com.microsoft.azure.sdk.iot.provisioning.security</groupId> <artifactId>${x509-provider-artifact-id}</artifactId> <version>${x509-provider-version}</version> </dependency>
Enregistrez les modifications.
Ouvrez le fichier src/main/java/samples/com/microsoft/azure/sdk/iot/device/TemperatureController.java dans votre éditeur de texte.
Remplacez l’importation
SecurityProviderSymmetricKey
par les importations suivantes :import com.microsoft.azure.sdk.iot.provisioning.security.SecurityProvider; import com.microsoft.azure.sdk.iot.provisioning.security.hsm.SecurityProviderX509Cert; import com.microsoft.azure.sdk.iot.provisioning.security.exceptions.SecurityProviderException;
Ajoutez l’importation suivante :
import java.nio.file.*;
Ajoutez
SecurityProviderException
à la liste des exceptions levées par la méthodemain
:public static void main(String[] args) throws IOException, URISyntaxException, ProvisioningDeviceClientException, InterruptedException, SecurityProviderException {
Remplacez la méthode
initializeAndProvisionDevice
par le code suivant :private static void initializeAndProvisionDevice() throws ProvisioningDeviceClientException, IOException, URISyntaxException, InterruptedException, SecurityProviderException { String deviceX509Key = new String(Files.readAllBytes(Paths.get(System.getenv("IOTHUB_DEVICE_X509_KEY")))); String deviceX509Cert = new String(Files.readAllBytes(Paths.get(System.getenv("IOTHUB_DEVICE_X509_CERT")))); SecurityProvider securityProviderX509 = new SecurityProviderX509Cert(deviceX509Cert, deviceX509Key, null); ProvisioningDeviceClient provisioningDeviceClient; ProvisioningStatus provisioningStatus = new ProvisioningStatus(); provisioningDeviceClient = ProvisioningDeviceClient.create(globalEndpoint, scopeId, provisioningProtocol, securityProviderX509); AdditionalData additionalData = new AdditionalData(); additionalData.setProvisioningPayload(com.microsoft.azure.sdk.iot.provisioning.device.plugandplay.PnpHelper.createDpsPayload(MODEL_ID)); provisioningDeviceClient.registerDevice(new ProvisioningDeviceClientRegistrationCallbackImpl(), provisioningStatus, additionalData); while (provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getProvisioningDeviceClientStatus() != ProvisioningDeviceClientStatus.PROVISIONING_DEVICE_STATUS_ASSIGNED) { if (provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getProvisioningDeviceClientStatus() == ProvisioningDeviceClientStatus.PROVISIONING_DEVICE_STATUS_ERROR || provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getProvisioningDeviceClientStatus() == ProvisioningDeviceClientStatus.PROVISIONING_DEVICE_STATUS_DISABLED || provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getProvisioningDeviceClientStatus() == ProvisioningDeviceClientStatus.PROVISIONING_DEVICE_STATUS_FAILED) { provisioningStatus.exception.printStackTrace(); System.out.println("Registration error, bailing out"); break; } System.out.println("Waiting for Provisioning Service to register"); Thread.sleep(MAX_TIME_TO_WAIT_FOR_REGISTRATION); } ClientOptions options = new ClientOptions(); options.setModelId(MODEL_ID); if (provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getProvisioningDeviceClientStatus() == ProvisioningDeviceClientStatus.PROVISIONING_DEVICE_STATUS_ASSIGNED) { System.out.println("IotHUb Uri : " + provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getIothubUri()); System.out.println("Device ID : " + provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getDeviceId()); String iotHubUri = provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getIothubUri(); String deviceId = provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getDeviceId(); log.debug("Opening the device client."); deviceClient = DeviceClient.createFromSecurityProvider(iotHubUri, deviceId, securityProviderX509, IotHubClientProtocol.MQTT, options); deviceClient.open(); } }
Enregistrez les modifications.
Pour exécuter l’exemple :
Dans votre environnement d’interpréteur de commandes, ajoutez les deux variables d’environnement suivantes. Veillez à fournir le chemin complet des fichiers PEM et utilisez le délimiteur de chemin approprié pour votre système d’exploitation :
set IOTHUB_DEVICE_DPS_DEVICE_ID=mytestselfcertprimary set IOTHUB_DEVICE_X509_CERT=<full path to folder that contains PEM files>mytestselfcertprimary_cert.pem set IOTHUB_DEVICE_X509_KEY=<full path to folder that contains PEM files>mytestselfcertprimary_key.pem
Conseil
Vous définissez les autres variables d’environnement requises lorsque vous avez terminé le tutoriel Créer et connecter une application cliente à votre application Azure IoT Central.
Générez et exécutez l’application. Vérifiez que l’appareil est correctement provisionné.
Vous pouvez également répéter les étapes ci-dessus pour le certificat mytestselfcertsecondary.
Pour modifier l’exemple de code afin d’utiliser les certificats X.509 :
Accédez au dossier azure-iot-sdk-node/device/samples/javascript contenant l’application pnp_temperature_controller.js, puis exécutez la commande suivante pour installer le package X.509 :
npm install azure-iot-security-x509 --save
Ouvrez le fichier pnp_temperature_controller.js dans un éditeur de texte.
Modifiez les instructions
require
pour inclure le code suivant :const fs = require('fs'); const X509Security = require('azure-iot-security-x509').X509Security;
Ajoutez les quatre lignes suivantes à la section « Informations de connexion DPS » pour initialiser la variable
deviceCert
:const deviceCert = { cert: fs.readFileSync(process.env.IOTHUB_DEVICE_X509_CERT).toString(), key: fs.readFileSync(process.env.IOTHUB_DEVICE_X509_KEY).toString() };
Modifiez la fonction
provisionDevice
qui crée le client en remplaçant la première ligne par le code suivant :var provSecurityClient = new X509Security(registrationId, deviceCert);
Dans la même fonction, modifiez la ligne qui définit la variable
deviceConnectionString
comme suit :deviceConnectionString = 'HostName=' + result.assignedHub + ';DeviceId=' + result.deviceId + ';x509=true';
Dans la fonction
main
, ajoutez la ligne suivante après la ligne qui appelleClient.fromConnectionString
:client.setOptions(deviceCert);
Enregistrez les modifications.
Pour exécuter l’exemple :
Dans votre environnement d’interpréteur de commandes, ajoutez les deux variables d’environnement suivantes. Veillez à fournir le chemin complet des fichiers PEM et utilisez le délimiteur de chemin approprié pour votre système d’exploitation :
set IOTHUB_DEVICE_DPS_DEVICE_ID=mytestselfcertprimary set IOTHUB_DEVICE_X509_CERT=<full path to folder that contains PEM files>mytestselfcertprimary_cert.pem set IOTHUB_DEVICE_X509_KEY=<full path to folder that contains PEM files>mytestselfcertprimary_key.pem
Conseil
Vous définissez les autres variables d’environnement requises lorsque vous avez terminé le tutoriel Créer et connecter une application cliente à votre application Azure IoT Central.
Exécutez le script et vérifiez que l’appareil est correctement provisionné :
node pnp_temperature_controller.js
Vous pouvez également répéter les étapes ci-dessus pour le certificat mytestselfcertsecondary.
Pour modifier l’exemple de code afin d’utiliser les certificats X.509 :
Accédez au dossier azure-iot-device/samples/pnp et ouvrez le fichier temp_controller_with_thermostats.py dans un éditeur de texte.
Utilisez l’instruction
from
suivante pour importer la fonctionnalité X.509 :from azure.iot.device import X509
Modifiez la première partie de la fonction
provision_device
comme suit :async def provision_device(provisioning_host, id_scope, registration_id, x509, model_id): provisioning_device_client = ProvisioningDeviceClient.create_from_x509_certificate( provisioning_host=provisioning_host, registration_id=registration_id, id_scope=id_scope, x509=x509, )
Dans la fonction
main
, remplacez la ligne qui définit la variablesymmetric_key
par le code suivant :x509 = X509( cert_file=os.getenv("IOTHUB_DEVICE_X509_CERT"), key_file=os.getenv("IOTHUB_DEVICE_X509_KEY"), )
Dans la fonction
main
, remplacez l’appel à la fonctionprovision_device
par le code suivant :registration_result = await provision_device( provisioning_host, id_scope, registration_id, x509, model_id )
Dans la fonction
main
, remplacez l’appel à la fonctionIoTHubDeviceClient.create_from_symmetric_key
par le code suivant :device_client = IoTHubDeviceClient.create_from_x509_certificate( x509=x509, hostname=registration_result.registration_state.assigned_hub, device_id=registration_result.registration_state.device_id, product_info=model_id, )
Enregistrez les modifications.
Pour exécuter l’exemple :
Dans votre environnement d’interpréteur de commandes, ajoutez les deux variables d’environnement suivantes. Veillez à fournir le chemin complet des fichiers PEM et utilisez le délimiteur de chemin approprié pour votre système d’exploitation :
set IOTHUB_DEVICE_DPS_DEVICE_ID=mytestselfcertprimary set IOTHUB_DEVICE_X509_CERT=<full path to folder that contains PEM files>mytestselfcertprimary_cert.pem set IOTHUB_DEVICE_X509_KEY=<full path to folder that contains PEM files>mytestselfcertprimary_key.pem
Conseil
Vous définissez les autres variables d’environnement requises lorsque vous avez terminé le tutoriel Créer et connecter une application cliente à votre application Azure IoT Central.
Exécutez le script et vérifiez que l’appareil est correctement provisionné :
python temp_controller_with_thermostats.py
Vous pouvez également répéter les étapes ci-dessus pour le certificat mytestselfcertsecondary.
Connecter un appareil IoT Edge
Cette section suppose que vous utilisez une inscription de groupe pour connecter votre appareil IoT Edge. Effectuez les étapes mentionnées dans les sections précédentes pour :
Pour connecter l’appareil IoT Edge à IoT Central à l’aide du certificat d’appareil X.509 :
Copiez le certificat d’appareil et les fichiers de clés sur votre appareil IoT Edge. Dans l’exemple d’inscription de groupe précédent, ces fichiers étaient appelés sampleDevice01_key.pem et sampleDevice01_cert.pem.
Sur l’appareil IoT Edge, modifiez la section
provisioning
dans le fichier de configuration /etc/aziot/config.toml comme suit :# DPS X.509 provisioning configuration provisioning: source: "dps" global_endpoint: "https://global.azure-devices-provisioning.net" scope_id: "<SCOPE_ID>" attestation: method: "x509" # registration_id: "<OPTIONAL REGISTRATION ID. LEAVE COMMENTED OUT TO REGISTER WITH CN OF identity_cert>" identity_cert: "file:///<path>/sampleDevice01_cert.pem" identity_pk: "file:///<path>/sampleDevice01_key.pem" # always_reprovision_on_startup: true # dynamic_reprovisioning: false [provisioning] source = "dps" global_endpoint = "https://global.azure-devices-provisioning.net" id_scope = "<SCOPE_ID>" [provisioning.attestation] method = "x509" registration_id = "env-sens-001" identity_pk = "file:///<path>/envSens001_key.pem" identity_cert = "file:///<path>/envSens001_cert.pem"
Conseil
Vous n’avez pas besoin d’ajouter une valeur pour
registration_id
. IoT Edge peut utiliser la valeur CN du certificat X.509.Exécutez la commande suivante pour redémarrer le runtime IoT Edge :
sudo iotedge config apply
Pour en savoir plus, consultez Créer et configurer des appareils IoT Edge à grande échelle sur Linux à l’aide de certificats X.509.
Connecter un appareil en aval à IoT Edge
IoT Edge utilise des certificats X.509 pour sécuriser la connexion entre les appareils en aval et un appareil IoT Edge faisant office de passerelle transparente. Pour en savoir plus sur la configuration de ce scénario, consultez Connecter un appareil en aval à une passerelle Azure IoT Edge.
Renouveler vos certificats d’appareil X.509
Pendant le cycle de vie de votre application IoT Central, il est possible que vous deviez renouveler vos certificats X.509. Par exemple :
- Si vous êtes victime d’une violation de la sécurité, le renouvellement des certificats est une bonne pratique en matière de sécurité qui contribue à sécuriser votre système.
- Les certificats X.509 ont des dates d’expiration. La fréquence à laquelle vous renouvelez vos certificats dépend des besoins de sécurité de votre solution. Il est possible que les clients qui disposent de solutions impliquant des données extrêmement sensibles renouvellent leurs certificats quotidiennement, tandis que d’autres renouvellent leurs certificats tous les deux ans.
Pour une connectivité ininterrompue, IoT Central vous permet de configurer des certificats X.509 primaires et secondaires. Si les certificats principaux et secondaires ont des dates d’expiration différentes, vous pouvez renouveler le certificat expiré pendant que les appareils continuent de se connecter à l’autre certificat.
Pour en savoir plus, consultez Méthodologie « Assume Breach » (Envisager les failles).
Cette section explique comment renouveler les certificats dans IoT Central. Quand vous renouvelez un certificat dans IoT Central, vous devez également copier le nouveau certificat d’appareil sur vos appareils.
Obtenir de nouveaux certificats X.509
Obtenez de nouveaux certificats X.509 auprès de votre fournisseur de certificats. Vous ne pouvez pas créer vos propres certificats X.509 à l’aide d’un outil tel qu’OpenSSL. Cette approche est utile pour tester les certificats X.509, mais offre peu de garanties de sécurité. Utilisez cette approche uniquement des fins de test, sauf si vous êtes votre propre fournisseur d’autorité de certification.
Groupes d’inscription et violations de la sécurité
Pour mettre à jour une inscription de groupe à la suite d’une violation de la sécurité, vous devez utiliser l’approche suivante pour mettre immédiatement à jour le certificat actuel. Effectuez ces étapes pour le certificat principal et le certificat secondaire s’ils sont tous deux compromis :
Accédez à Autorisations dans le volet gauche, puis sélectionnez Groupes de connexion d’appareil.
Sélectionnez le nom du groupe dans la liste sous Groupes d’inscription.
Pour mettre à jour des certificats, sélectionnez Gérer le principal ou Gérer le secondaire.
Ajoutez et vérifiez un certificat X.509 racine dans le groupe d’inscription.
Inscriptions individuelles et violations de la sécurité
Si vous renouvelez des certificats à la suite d’une violation de la sécurité, utilisez l’approche suivante pour mettre immédiatement à jour le certificat actuel. Effectuez ces étapes pour le certificat principal et le certificat secondaire s’ils sont tous deux compromis :
Sélectionnez Appareils, puis sélectionnez l’appareil.
Sélectionnez Connecter, puis sélectionnez la méthode de connexion comme Inscription individuelle
Sélectionnez Certificats (X.509) en tant que mécanisme.
Pour mettre à jour les certificats, sélectionnez l’icône de dossier afin de sélectionner le nouveau certificat à charger pour l’entrée d’inscription. Sélectionnez Enregistrer.
Groupes d’inscription et expiration des certificats
Pour gérer les expirations de certificats, utilisez l’approche suivante afin de mettre immédiatement à jour le certificat actuel :
Accédez à Autorisations dans le volet gauche, puis sélectionnez Groupes de connexion d’appareil.
Sélectionnez le nom du groupe dans la liste sous Groupes d’inscription.
Pour mettre à jour des certificats, sélectionnez Gérer le principal.
Ajoutez et vérifiez un certificat X.509 racine dans le groupe d’inscription.
Plus tard, quand le certificat secondaire expire, revenez et mettez-le à jour.
Inscriptions individuelles et expiration des certificats
Si vous renouvelez des certificats afin de gérer leur expiration, vous devez utiliser la configuration de certificat secondaire comme suit pour réduire le temps d’arrêt lié à la tentative d’approvisionnement d’appareils dans votre application.
Lorsque le certificat secondaire approche de sa date d’expiration et doit être renouvelé, vous pouvez basculer vers la configuration principale. Cette alternance entre le certificat principal et le certificat secondaire réduit le temps d’arrêt lié à la tentative d’approvisionnement d’appareils dans votre application.
Sélectionnez Appareils, puis sélectionnez l’appareil.
Sélectionnez Connecter, puis sélectionnez la méthode de connexion comme Inscription individuelle
Sélectionnez Certificats (X.509) en tant que mécanisme.
Pour mettre à jour le certificat secondaire, sélectionnez l’icône de dossier afin de sélectionner le nouveau certificat à charger pour l’entrée d’inscription. Sélectionnez Enregistrer.
Plus tard, quand le certificat principal aura expiré, revenez et mettez-le à jour.