Share via


Ansluta enheter med X.509-certifikat till IoT Central Application

IoT Central stöder både SAS-certifikat (signaturer för delad åtkomst) och X.509-certifikat för att skydda kommunikationen mellan en enhet och ditt program. Självstudien Skapa och ansluta ett klientprogram till ditt Azure IoT Central-program använder SAS. I den här artikeln får du lära dig hur du ändrar kodexemplet för att använda X.509-certifikat. X.509-certifikat rekommenderas i produktionsmiljöer. Mer information finns i Begrepp för enhetsautentisering.

Den här guiden visar två sätt att använda X.509-certifikat – gruppregistreringar som vanligtvis används i en produktionsmiljö och enskilda registreringar som är användbara för testning. Artikeln beskriver också hur du distribuerar enhetscertifikat för att upprätthålla anslutningen när certifikaten upphör att gälla.

Den här guiden bygger på exemplen som visas i självstudiekursen Skapa och ansluta ett klientprogram till ditt Azure IoT Central-program som använder C#, Java, JavaScript och Python. Ett exempel som använder programmeringsspråket C finns i Etablera flera X.509-enheter med hjälp av registreringsgrupper.

Förutsättningar

För att slutföra stegen i den här instruktionsguiden bör du först slutföra självstudien Skapa och ansluta ett klientprogram till ditt Azure IoT Central-program . Du ändrar koden som du använde i självstudien när du följer stegen i den här guiden.

I den här guiden genererar du några X.509-testcertifikat. För att kunna generera dessa certifikat behöver du:

  • En utvecklingsdator med Node.js version 6 eller senare installerad. Du kan köra node --version på kommandoraden för att kontrollera din version. Anvisningarna i den här självstudien förutsätter att du kör nodkommandot i Windows-kommandotolken. Du kan dock använda Node.js på många andra operativsystem.
  • En lokal kopia av Microsoft Azure IoT SDK för Node.js GitHub-lagringsplats som innehåller skripten för att generera X.509-testcertifikaten. Använd den här länken om du vill ladda ned en kopia av lagringsplatsen: Ladda ned ZIP. Packa sedan upp filen på en lämplig plats på den lokala datorn.

Använda gruppregistrering

Använd X.509-certifikat med en gruppregistrering i en produktionsmiljö. I en gruppregistrering lägger du till ett rot- eller mellanliggande X.509-certifikat i ditt IoT Central-program. Enheter med lövcertifikat som härleds från rotcertifikatet eller mellanliggande certifikat kan ansluta till ditt program.

Generera rot- och enhetscertifikat

I det här avsnittet använder du ett X.509-certifikat för att ansluta en enhet med ett certifikat som härleds från IoT Central-registreringsgruppens certifikat.

Varning

Det här sättet att generera X.509-certifikat är endast till för testning. För en produktionsmiljö bör du använda din officiella, säkra mekanism för certifikatgenerering.

  1. Gå till certifikatgeneratorskriptet i Microsoft Azure IoT SDK för Node.js du laddade ned. Installera de paket som krävs:

    cd azure-iot-sdk-node/provisioning/tools
    npm install
    
  2. Skapa ett rotcertifikat och härled sedan ett enhetscertifikat genom att köra skriptet:

    node create_test_cert.js root mytestrootcert
    node create_test_cert.js device sample-device-01 mytestrootcert
    

    Dricks

    Ett enhets-ID kan innehålla bokstäver, siffror och - tecknet.

Dessa kommandon skapar följande rot- och enhetscertifikat:

filename Innehållet
mytestrootcert_cert.pem Den offentliga delen av rotcertifikatet X509
mytestrootcert_key.pem Den privata nyckeln för rotcertifikatet X509
mytestrootcert_fullchain.pem Hela nyckelringen för X509-rotcertifikatet.
mytestrootcert.pfx PFX-filen för rotcertifikatet X509.
sampleDevice01_cert.pem Den offentliga delen av enhetens X509-certifikat
sampleDevice01_key.pem Den privata nyckeln för enhetens X509-certifikat
sampleDevice01_fullchain.pem Hela nyckelringen för enhetens X509-certifikat.
sampleDevice01.pfx PFX-filen för enhetens X509-certifikat.

Anteckna platsen för dessa filer. Du behöver det senare.

Skapa en gruppregistrering

  1. Öppna ditt IoT Central-program och navigera till Behörigheter i det vänstra fönstret och välj Enhetsanslutningsgrupper.

  2. Välj + Ny för att skapa en ny registreringsgrupp med namnet MyX509Group med en attesteringstyp av certifikat (X.509). Du kan skapa registreringsgrupper för antingen IoT-enheter eller IoT Edge-enheter.

  3. I den registreringsgrupp som du skapade väljer du Hantera primär.

  4. I panelen Primärt certifikat väljer du Lägg till certifikat.

  5. Ladda upp rotcertifikatfilen med namnet mytestrootcert_cert.pem som du genererade tidigare.

  6. Om du använder en mellanliggande certifikatutfärdare eller rotcertifikatutfärdare som du litar på och vet att du har fullständigt ägarskap för certifikatet kan du själv intyga att du har verifierat certifikatet genom att ange certifikatstatus som verifierats vid uppladdning till . Annars anger du certifikatstatus som verifierats vid uppladdning till Av.

  7. Om du anger certifikatstatus som verifierats vid uppladdning till Av väljer du Generera verifieringskod.

  8. Kopiera verifieringskoden, kopiera den och skapa sedan ett X.509-verifieringscertifikat. Till exempel i kommandotolken:

    node create_test_cert.js verification --ca mytestrootcert_cert.pem --key mytestrootcert_key.pem --nonce  {verification-code}
    
  9. Välj Verifiera för att ladda upp det signerade verifieringscertifikatet verification_cert.pem för att slutföra verifieringen.

  10. Status för det primära certifikatet är nu Verifierad:

    Screenshot that shows a verified X509 certificate.

Nu kan du ansluta enheter som har ett X.509-certifikat som härletts från det här primära rotcertifikatet.

När du har sparat registreringsgruppen antecknar du ID-omfånget. Du behöver det senare.

Kör enhetskodexempel

Om du använder Windows måste X.509-certifikaten finnas i Windows-certifikatarkivet för att exemplet ska fungera. I Utforskaren dubbelklickar du på DE PFX-filer som du genererade tidigare – mytestrootcert.pfx och sampleDevice01.pfx. I guiden Importera certifikat väljer du Aktuell användare som lagringsplats, anger 1234 som lösenord och låter guiden välja certifikatarkivet automatiskt. Guiden importerar certifikaten till den aktuella användarens personliga arkiv.

Så här ändrar du exempelkoden för att använda X.509-certifikaten:

  1. I Visual Studio-lösningen IoTHubDeviceSamples öppnar du filen Parameter.cs i TemperatureController-projektet.

  2. Lägg till följande två parameterdefinitioner i klassen:

    [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");
    

    Spara ändringarna.

  3. I Visual Studio-lösningen IoTHubDeviceSamples öppnar du filen Program.cs i TemperatureController-projektet.

  4. Lägg till följande using-uttryck:

    using System.Security.Cryptography.X509Certificates;
    using System.IO;
    
  5. Lägg till följande metod i klassen :

    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;
    }
    
  6. SetupDeviceClientAsync I -metoden ersätter du kodblocket för case "dps" med följande kod:

    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;
    
  7. Ersätt metoden ProvisionDeviceAsync med följande kod:

    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);
    }
    

    Spara ändringarna.

Så här kör du exemplet:

  1. Lägg till följande miljövariabler i projektet:

    • IOTHUB_DEVICE_X509_CERT: <full path to folder that contains PFX files>sampleDevice01.pfx
    • IOTHUB_DEVICE_X509_PASSWORD: 1234.
  2. Skapa och kör programmet. Kontrollera att enhetsbestämmelserna har slutförts.

Så här ändrar du exempelkoden för att använda X.509-certifikaten:

  1. Gå till mappen azure-iot-sdk-java/device/iot-device-samples/pnp-device-sample/temperature-controller-device-sample som innehåller mappen pom.xml fil och src för temperaturkontrollantens enhetsexempel.

  2. Redigera filen pom.xml för att lägga till följande beroendekonfiguration i <dependencies> noden:

    <dependency>
        <groupId>com.microsoft.azure.sdk.iot.provisioning.security</groupId>
        <artifactId>${x509-provider-artifact-id}</artifactId>
        <version>${x509-provider-version}</version>
    </dependency>
    

    Spara ändringarna.

  3. Öppna filen src/main/java/samples/com/microsoft/azure/sdk/iot/device/TemperatureController.java i textredigeraren.

  4. SecurityProviderSymmetricKey Ersätt importen med följande importer:

    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;
    
  5. Lägg till följande import:

    import java.nio.file.*;
    
  6. Lägg till SecurityProviderException i listan över undantag som main metoden genererar:

    public static void main(String[] args) throws IOException, URISyntaxException, ProvisioningDeviceClientException, InterruptedException, SecurityProviderException {
    
  7. Ersätt metoden initializeAndProvisionDevice med följande kod:

    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();
        }
    }
    

    Spara ändringarna.

Så här kör du exemplet:

  1. Lägg till följande två miljövariabler i shell-miljön. Kontrollera att du anger den fullständiga sökvägen till PEM-filerna och använd rätt sökvägsavgränsare för operativsystemet:

    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
    

    Dricks

    Du anger de andra miljövariablerna som krävs när du har slutfört självstudien Skapa och ansluta ett klientprogram till ditt Azure IoT Central-program .

  2. Skapa och kör programmet. Kontrollera att enhetsbestämmelserna har slutförts.

Så här ändrar du exempelkoden för att använda X.509-certifikaten:

  1. Gå till mappen azure-iot-sdk-node/device/samples/javascript som innehåller pnp_temperature_controller.js-programmet och kör följande kommando för att installera X.509-paketet:

    npm install azure-iot-security-x509 --save
    
  2. Öppna filen pnp_temperature_controller.js i en textredigerare.

  3. Redigera uttrycken require så att de innehåller följande kod:

    const fs = require('fs');
    const X509Security = require('azure-iot-security-x509').X509Security;
    
  4. Lägg till följande fyra rader i avsnittet "DPS-anslutningsinformation" för att initiera variabeln deviceCert :

    const deviceCert = {
      cert: fs.readFileSync(process.env.IOTHUB_DEVICE_X509_CERT).toString(),
      key: fs.readFileSync(process.env.IOTHUB_DEVICE_X509_KEY).toString()
    };
    
  5. Redigera funktionen provisionDevice som skapar klienten genom att ersätta den första raden med följande kod:

    var provSecurityClient = new X509Security(registrationId, deviceCert);
    
  6. I samma funktion ändrar du raden som anger variabeln enligt deviceConnectionString följande:

    deviceConnectionString = 'HostName=' + result.assignedHub + ';DeviceId=' + result.deviceId + ';x509=true';
    
  7. main I funktionen lägger du till följande rad efter raden som anropar Client.fromConnectionString:

    client.setOptions(deviceCert);
    

    Spara ändringarna.

Så här kör du exemplet:

  1. Lägg till följande två miljövariabler i shell-miljön. Kontrollera att du anger den fullständiga sökvägen till PEM-filerna och använd rätt sökvägsavgränsare för operativsystemet:

    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
    

    Dricks

    Du anger de andra miljövariablerna som krävs när du har slutfört självstudien Skapa och ansluta ett klientprogram till ditt Azure IoT Central-program .

  2. Kör skriptet och verifiera enhetsbestämmelserna:

    node pnp_temperature_controller.js
    

Så här ändrar du exempelkoden för att använda X.509-certifikaten:

  1. Gå till mappen azure-iot-device/samples/pnp och öppna filen temp_controller_with_thermostats.py i en textredigerare.

  2. Lägg till följande from instruktion för att importera X.509-funktionen:

    from azure.iot.device import X509
    
  3. Ändra den första delen av funktionen enligt provision_device följande:

    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,
        )
    
  4. main I funktionen ersätter du raden som anger variabeln symmetric_key med följande kod:

    x509 = X509(
        cert_file=os.getenv("IOTHUB_DEVICE_X509_CERT"),
        key_file=os.getenv("IOTHUB_DEVICE_X509_KEY"),
    )
    
  5. main I funktionen ersätter du anropet provision_device till funktionen med följande kod:

    registration_result = await provision_device(
        provisioning_host, id_scope, registration_id, x509, model_id
    )
    
  6. main I funktionen ersätter du anropet IoTHubDeviceClient.create_from_symmetric_key till funktionen med följande kod:

    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,
    )
    

    Spara ändringarna.

Så här kör du exemplet:

  1. Lägg till följande två miljövariabler i shell-miljön. Kontrollera att du anger den fullständiga sökvägen till PEM-filerna och använd rätt sökvägsavgränsare för operativsystemet:

    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
    

    Dricks

    Du anger de andra miljövariablerna som krävs när du har slutfört självstudien Skapa och ansluta ett klientprogram till ditt Azure IoT Central-program .

  2. Kör skriptet och verifiera enhetsbestämmelserna:

    python temp_controller_with_thermostats.py
    

Kontrollera att telemetri visas i enhetsvyn i ditt IoT Central-program:

Screenshot showing telemetry from a device that connected using X.509.

Använda individuell registrering

Använd X.509-certifikat med en enskild registrering för att testa din enhet och lösning. I en enskild registrering finns det inget rotcertifikat eller mellanliggande X.509-certifikat i ditt IoT Central-program. Enheter använder ett självsignerat X.509-certifikat för att ansluta till ditt program.

Generera självsignerat enhetscertifikat

I det här avsnittet använder du ett självsignerat X.509-certifikat för att ansluta enheter för individuell registrering, som används för att registrera en enda enhet. Självsignerade certifikat är endast till för testning.

Varning

Det här sättet att generera X.509-certifikat är endast till för testning. För en produktionsmiljö bör du använda din officiella, säkra mekanism för certifikatgenerering.

Skapa ett självsignerat X.509-enhetscertifikat genom att köra följande kommandon:

  cd azure-iot-sdk-node/provisioning/tools
  node create_test_cert.js device mytestselfcertprimary
  node create_test_cert.js device mytestselfcertsecondary 

Dricks

Ett enhets-ID kan innehålla bokstäver, siffror och - tecknet.

Dessa kommandon skapar följande enhetscertifikat:

filename Innehållet
mytestselfcertprimary_cert.pem Den offentliga delen av X509-certifikatet för den primära enheten
mytestselfcertprimary_key.pem Den privata nyckeln för X509-certifikatet för den primära enheten
mytestselfcertprimary_fullchain.pem Hela nyckelringen för X509-certifikatet för den primära enheten.
mytestselfcertprimary.pfx PFX-filen för X509-certifikatet för den primära enheten.
mytestselfcertsecondary_cert.pem Den offentliga delen av X509-certifikatet för den sekundära enheten
mytestselfcertsecondary_key.pem Den privata nyckeln för X509-certifikatet för den sekundära enheten
mytestselfcertsecondary_fullchain.pem Hela nyckelringen för den sekundära enhetens X509-certifikat.
mytestselfcertsecondary.pfx PFX-filen för X509-certifikatet för den sekundära enheten.

Skapa enskild registrering

  1. I Azure IoT Central-programmet väljer du Enheter och skapar en ny enhet med enhets-ID som mytestselfcertprimary från termostatenhetsmallen. Anteckna ID-omfånget. Du använder det senare.

  2. Öppna enheten som du skapade och välj Anslut.

  3. Välj Enskild registrering som autentiseringstyp och certifikat (X.509) som autentiseringsmetod.

  4. Ladda upp filen mytestselfcertprimary_cert.pem som du genererade tidigare som primärt certifikat.

  5. Ladda upp filen mytestselfcertsecondary_cert.pem som du genererade tidigare som det sekundära certifikatet. Välj sedan Spara.

  6. Enheten har nu en individuell registrering med X.509-certifikat.

    Screenshot that shows how to connect a device using an X.509 individual enrollment.

Kör ett exempel på en enskild registreringsenhet

Om du använder Windows måste X.509-certifikaten finnas i Windows-certifikatarkivet för att exemplet ska fungera. I Utforskaren dubbelklickar du på DE PFX-filer som du genererade tidigare – mytestselfcertprimary.pfx och mytestselfcertsecondary.pfx. I guiden Importera certifikat väljer du Aktuell användare som lagringsplats, anger 1234 som lösenord och låter guiden välja certifikatarkivet automatiskt. Guiden importerar certifikaten till den aktuella användarens personliga arkiv.

Så här ändrar du exempelkoden för att använda X.509-certifikaten:

  1. I Visual Studio-lösningen IoTHubDeviceSamples öppnar du filen Parameter.cs i TemperatureController-projektet.

  2. Lägg till följande två parameterdefinitioner i klassen:

    [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");
    

    Spara ändringarna.

  3. I Visual Studio-lösningen IoTHubDeviceSamples öppnar du filen Program.cs i TemperatureController-projektet.

  4. Lägg till följande using-uttryck:

    using System.Security.Cryptography.X509Certificates;
    using System.IO;
    
  5. Lägg till följande metod i klassen :

    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;
    }
    
  6. SetupDeviceClientAsync I -metoden ersätter du kodblocket för case "dps" med följande kod:

    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;
    
  7. Ersätt metoden ProvisionDeviceAsync med följande kod:

    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);
    }
    

    Spara ändringarna.

Så här kör du exemplet:

  1. Lägg till följande miljövariabler i projektet:

    • IOTHUB_DEVICE_DPS_DEVICE_ID: mytestselfcertprimary
    • IOTHUB_DEVICE_X509_CERT: <full path to folder that contains PFX files>mytestselfcertprimary.pfx
    • IOTHUB_DEVICE_X509_PASSWORD: 1234.
  2. Skapa och kör programmet. Kontrollera att enhetsbestämmelserna har slutförts.

Så här ändrar du exempelkoden för att använda X.509-certifikaten:

  1. Gå till mappen azure-iot-sdk-java/device/iot-device-samples/pnp-device-sample/temperature-controller-device-sample som innehåller mappen pom.xml fil och src för temperaturkontrollantens enhetsexempel.

  2. Redigera filen pom.xml för att lägga till följande beroendekonfiguration i <dependencies> noden:

    <dependency>
        <groupId>com.microsoft.azure.sdk.iot.provisioning.security</groupId>
        <artifactId>${x509-provider-artifact-id}</artifactId>
        <version>${x509-provider-version}</version>
    </dependency>
    

    Spara ändringarna.

  3. Öppna filen src/main/java/samples/com/microsoft/azure/sdk/iot/device/TemperatureController.java i textredigeraren.

  4. SecurityProviderSymmetricKey Ersätt importen med följande importer:

    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;
    
  5. Lägg till följande import:

    import java.nio.file.*;
    
  6. Lägg till SecurityProviderException i listan över undantag som main metoden genererar:

    public static void main(String[] args) throws IOException, URISyntaxException, ProvisioningDeviceClientException, InterruptedException, SecurityProviderException {
    
  7. Ersätt metoden initializeAndProvisionDevice med följande kod:

    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();
        }
    }
    

    Spara ändringarna.

Så här kör du exemplet:

  1. Lägg till följande två miljövariabler i shell-miljön. Kontrollera att du anger den fullständiga sökvägen till PEM-filerna och använd rätt sökvägsavgränsare för operativsystemet:

    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
    

    Dricks

    Du anger de andra miljövariablerna som krävs när du har slutfört självstudien Skapa och ansluta ett klientprogram till ditt Azure IoT Central-program .

  2. Skapa och kör programmet. Kontrollera att enhetsbestämmelserna har slutförts.

Du kan också upprepa stegen ovan för mytestselfcertsecondary-certifikatet .

Så här ändrar du exempelkoden för att använda X.509-certifikaten:

  1. Gå till mappen azure-iot-sdk-node/device/samples/javascript som innehåller pnp_temperature_controller.js-programmet och kör följande kommando för att installera X.509-paketet:

    npm install azure-iot-security-x509 --save
    
  2. Öppna filen pnp_temperature_controller.js i en textredigerare.

  3. Redigera uttrycken require så att de innehåller följande kod:

    const fs = require('fs');
    const X509Security = require('azure-iot-security-x509').X509Security;
    
  4. Lägg till följande fyra rader i avsnittet "DPS-anslutningsinformation" för att initiera variabeln deviceCert :

    const deviceCert = {
      cert: fs.readFileSync(process.env.IOTHUB_DEVICE_X509_CERT).toString(),
      key: fs.readFileSync(process.env.IOTHUB_DEVICE_X509_KEY).toString()
    };
    
  5. Redigera funktionen provisionDevice som skapar klienten genom att ersätta den första raden med följande kod:

    var provSecurityClient = new X509Security(registrationId, deviceCert);
    
  6. I samma funktion ändrar du raden som anger variabeln enligt deviceConnectionString följande:

    deviceConnectionString = 'HostName=' + result.assignedHub + ';DeviceId=' + result.deviceId + ';x509=true';
    
  7. main I funktionen lägger du till följande rad efter raden som anropar Client.fromConnectionString:

    client.setOptions(deviceCert);
    

    Spara ändringarna.

Så här kör du exemplet:

  1. Lägg till följande två miljövariabler i shell-miljön. Kontrollera att du anger den fullständiga sökvägen till PEM-filerna och använd rätt sökvägsavgränsare för operativsystemet:

    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
    

    Dricks

    Du anger de andra miljövariablerna som krävs när du har slutfört självstudien Skapa och ansluta ett klientprogram till ditt Azure IoT Central-program .

  2. Kör skriptet och verifiera enhetsbestämmelserna:

    node pnp_temperature_controller.js
    

Du kan också upprepa stegen ovan för mytestselfcertsecondary-certifikatet .

Så här ändrar du exempelkoden för att använda X.509-certifikaten:

  1. Gå till mappen azure-iot-device/samples/pnp och öppna filen temp_controller_with_thermostats.py i en textredigerare.

  2. Lägg till följande from instruktion för att importera X.509-funktionen:

    from azure.iot.device import X509
    
  3. Ändra den första delen av funktionen enligt provision_device följande:

    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,
        )
    
  4. main I funktionen ersätter du raden som anger variabeln symmetric_key med följande kod:

    x509 = X509(
        cert_file=os.getenv("IOTHUB_DEVICE_X509_CERT"),
        key_file=os.getenv("IOTHUB_DEVICE_X509_KEY"),
    )
    
  5. main I funktionen ersätter du anropet provision_device till funktionen med följande kod:

    registration_result = await provision_device(
        provisioning_host, id_scope, registration_id, x509, model_id
    )
    
  6. main I funktionen ersätter du anropet IoTHubDeviceClient.create_from_symmetric_key till funktionen med följande kod:

    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,
    )
    

    Spara ändringarna.

Så här kör du exemplet:

  1. Lägg till följande två miljövariabler i shell-miljön. Kontrollera att du anger den fullständiga sökvägen till PEM-filerna och använd rätt sökvägsavgränsare för operativsystemet:

    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
    

    Dricks

    Du anger de andra miljövariablerna som krävs när du har slutfört självstudien Skapa och ansluta ett klientprogram till ditt Azure IoT Central-program .

  2. Kör skriptet och verifiera enhetsbestämmelserna:

    python temp_controller_with_thermostats.py
    

Du kan också upprepa stegen ovan för mytestselfcertsecondary-certifikatet .

Ansluta en IoT Edge-enhet

Det här avsnittet förutsätter att du använder en gruppregistrering för att ansluta din IoT Edge-enhet. Följ stegen i föregående avsnitt för att:

Så här ansluter du IoT Edge-enheten till IoT Central med hjälp av X.509-enhetscertifikatet:

  • Kopiera enhetscertifikatet och nyckelfilerna till din IoT Edge-enhet. I föregående gruppregistreringsexempel kallades dessa filer sampleDevice01_key.pem och sampleDevice01_cert.pem.

  • På IoT Edge-enheten redigerar provisioning du avsnittet i konfigurationsfilen /etc/aziot/config.toml enligt följande:

    # 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"
    

    Dricks

    Du behöver inte lägga till något värde för registration_id. IoT Edge kan använda CN-värdet från X.509-certifikatet.

  • Kör följande kommando för att starta om IoT Edge-körningen:

    sudo iotedge config apply
    

Mer information finns i Skapa och etablera IoT Edge-enheter i stor skala i Linux med X.509-certifikat.

Anslut en nedströmsenhet till IoT Edge

IoT Edge använder X.509-certifikat för att skydda anslutningen mellan underordnade enheter och en IoT Edge-enhet som fungerar som en transparent gateway. Mer information om hur du konfigurerar det här scenariot finns i Anslut en nedströmsenhet till en Azure IoT Edge-gateway.

Rulla dina X.509-enhetscertifikat

Under livscykeln för ditt IoT Central-program kan du behöva rulla dina X.509-certifikat. Till exempel:

  • Om du har en säkerhetsöverträdelse är rullande certifikat en säkerhetsmetod som hjälper dig att skydda systemet.
  • X.509-certifikat har förfallodatum. Hur ofta du distribuerar certifikaten beror på lösningens säkerhetsbehov. Kunder med lösningar som involverar mycket känsliga data kan distribuera certifikat dagligen, medan andra distribuerar sina certifikat vartannat år.

För oavbruten anslutning kan du konfigurera primära och sekundära X.509-certifikat i IoT Central. Om de primära och sekundära certifikaten har olika utgångsdatum kan du återställa det utgångna certifikatet medan enheterna fortsätter att ansluta till det andra certifikatet.

Mer information finns i Anta metodik för intrång.

I det här avsnittet beskrivs hur du distribuerar certifikaten i IoT Central. När du distribuerar ett certifikat i IoT Central måste du också kopiera det nya enhetscertifikatet till dina enheter.

Skaffa nya X.509-certifikat

Hämta nya X.509-certifikat från certifikatprovidern. Du kan skapa egna X.509-certifikat med hjälp av ett verktyg som OpenSSL. Den här metoden är användbar för att testa X.509-certifikat men ger få säkerhetsgarantier. Använd endast den här metoden för testning om du inte är beredd att agera som din egen CA-provider.

Registreringsgrupper och säkerhetsöverträdelser

Om du vill uppdatera en gruppregistrering som svar på ett säkerhetsintrång bör du använda följande metod för att uppdatera det aktuella certifikatet omedelbart. Slutför de här stegen för de primära och sekundära certifikaten om båda är komprometterade:

  1. Gå till Behörigheter i det vänstra fönstret och välj Enhetsanslutningsgrupper.

  2. Välj gruppnamnet i listan under Registreringsgrupper.

  3. För certifikatuppdatering väljer du Hantera primär eller Hantera sekundär.

  4. Lägg till och verifiera X.509-rotcertifikatet i registreringsgruppen.

Enskilda registreringar och säkerhetsöverträdelser

Om du rullar certifikat som svar på en säkerhetsöverträdelse använder du följande metod för att uppdatera det aktuella certifikatet omedelbart. Slutför de här stegen för de primära och sekundära certifikaten om båda är komprometterade:

  1. Välj Enheter och välj enheten.

  2. Välj Anslut och välj anslut metod som enskild registrering

  3. Välj Certifikat (X.509) som mekanism.

  4. För certifikatuppdatering väljer du mappikonen för att välja det nya certifikat som ska laddas upp för registreringsposten. Välj Spara.

Registreringsgrupper och certifikat upphör att gälla

Om du vill hantera certifikatets giltighetstid använder du följande metod för att uppdatera det aktuella certifikatet omedelbart:

  1. Gå till Behörigheter i det vänstra fönstret och välj Enhetsanslutningsgrupper.

  2. Välj gruppnamnet i listan under Registreringsgrupper.

  3. För certifikatuppdatering väljer du Hantera primär.

  4. Lägg till och verifiera X.509-rotcertifikatet i registreringsgruppen.

  5. Senare när det sekundära certifikatet upphör att gälla kommer du tillbaka och uppdaterar det sekundära certifikatet.

Enskilda registreringar och certifikat upphör att gälla

Om du rullar certifikat för att hantera certifikatets förfallodatum bör du använda den sekundära certifikatkonfigurationen på följande sätt för att minska stilleståndstiden för enheter som försöker etablera i ditt program.

När det sekundära certifikatet närmar sig förfallodatum och måste rullas kan du rotera till med hjälp av den primära konfigurationen. Om du roterar mellan de primära och sekundära certifikaten på det här sättet minskar stilleståndstiden för enheter som försöker etablera i ditt program.

  1. Välj Enheter och välj enheten.

  2. Välj Anslut och välj anslut metod som enskild registrering

  3. Välj Certifikat (X.509) som mekanism.

  4. För sekundär certifikatuppdatering väljer du mappikonen för att välja det nya certifikat som ska laddas upp för registreringsposten. Välj Spara.

  5. När det primära certifikatet har upphört att gälla kommer du tillbaka och uppdaterar det primära certifikatet.