Delen via


Apparaten verbinden met X.509-certificaten met IoT Central-toepassing

IoT Central ondersteunt zowel SAS-certificaten (Shared Access Signatures) als X.509-certificaten om de communicatie tussen een apparaat en uw toepassing te beveiligen. De zelfstudie Een clienttoepassing maken en verbinden met uw Azure IoT Central-toepassing maakt gebruik van SAS. In dit artikel leert u hoe u het codevoorbeeld wijzigt om X.509-certificaten te gebruiken. X.509-certificaten worden aanbevolen in productieomgevingen. Zie Apparaatverificatieconcepten voor meer informatie.

In deze handleiding ziet u twee manieren om X.509-certificaten te gebruiken: groepsinschrijvingen die doorgaans worden gebruikt in een productieomgeving en afzonderlijke inschrijvingen die nuttig zijn voor testen. In het artikel wordt ook beschreven hoe u apparaatcertificaten kunt implementeren om connectiviteit te behouden wanneer certificaten verlopen.

Deze handleiding bouwt voort op de voorbeelden die worden weergegeven in de zelfstudie Een clienttoepassing maken en verbinden met uw Azure IoT Central-toepassing die gebruikmaakt van C#, Java, JavaScript en Python. Zie voor een voorbeeld waarin de programmeertaal C wordt gebruikt, meerdere X.509-apparaten inrichten met behulp van inschrijvingsgroepen.

Vereisten

Als u de stappen in deze instructiegids wilt voltooien, moet u eerst de zelfstudie Een clienttoepassing maken en verbinden met uw Azure IoT Central-toepassing voltooien. U wijzigt de code die u in de zelfstudie hebt gebruikt wanneer u de stappen in deze handleiding volgt.

In deze handleiding genereert u enkele X.509-testcertificaten. Als u deze certificaten wilt kunnen genereren, hebt u het volgende nodig:

  • Een ontwikkelmachine waarop Node.js versie 6 of hoger is geïnstalleerd. Voer node --version uit op de opdrachtregel om uw versie te controleren. In de instructies in deze zelfstudie wordt ervan uitgegaan dat u de opdracht node uitvoert vanaf de Windows-opdrachtprompt. U kunt Node.js echter gebruiken met verschillende andere besturingssystemen.
  • Een lokale kopie van de Microsoft Azure IoT SDK voor Node.js GitHub-opslagplaats die de scripts bevat voor het genereren van de X.509-testcertificaten. Gebruik deze koppeling om een kopie van de opslagplaats te downloaden: ZIP downloaden. Pak het bestand vervolgens uit op een geschikte locatie op uw lokale computer.

Groepsinschrijving gebruiken

Gebruik X.509-certificaten met een groepsinschrijving in een productieomgeving. In een groepsinschrijving voegt u een basis- of tussenliggend X.509-certificaat toe aan uw IoT Central-toepassing. Apparaten met leaf-certificaten die zijn afgeleid van het basis- of tussencertificaat, kunnen verbinding maken met uw toepassing.

Basis- en apparaatcertificaten genereren

In deze sectie gebruikt u een X.509-certificaat om een apparaat te verbinden met een certificaat dat is afgeleid van het certificaat van de IoT Central-inschrijvingsgroep.

Waarschuwing

Deze manier om X.509-certificaten te genereren, is alleen bedoeld voor testen. Voor een productieomgeving moet u uw officiële, veilige mechanisme gebruiken voor het genereren van certificaten.

  1. Navigeer naar het script voor de certificaatgenerator in de Microsoft Azure IoT SDK voor Node.js u hebt gedownload. Installeer de vereiste pakketten:

    cd azure-iot-sdk-node/provisioning/tools
    npm install
    
  2. Maak een basiscertificaat en leid vervolgens een apparaatcertificaat af door het script uit te voeren:

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

    Tip

    Een apparaat-id mag alleen letters, cijfers en het teken - bevatten.

Met deze opdrachten worden de volgende basis- en apparaatcertificaten geproduceerd:

filename Inhoud
mytestrootcert_cert.pem Het openbare gedeelte van het X509-basiscertificaat
mytestrootcert_key.pem De persoonlijke sleutel voor het X509-basiscertificaat
mytestrootcert_fullchain.pem De hele sleutelhanger voor het X509-basiscertificaat.
mytestrootcert.pfx Het PFX-bestand voor het X509-basiscertificaat.
sampleDevice01_cert.pem Het openbare gedeelte van het X509-certificaat van het apparaat
sampleDevice01_key.pem De persoonlijke sleutel voor het X509-certificaat van het apparaat
sampleDevice01_fullchain.pem De hele sleutelhanger voor het X509-certificaat van het apparaat.
sampleDevice01.pfx Het PFX-bestand voor het X509-certificaat van het apparaat.

Noteer de locatie van deze bestanden. U hebt het later nodig.

Een groepsinschrijving maken

  1. Open uw IoT Central-toepassing en navigeer naar Machtigingen in het linkerdeelvenster en selecteer Apparaatverbindingsgroepen.

  2. Selecteer + Nieuw om een nieuwe inschrijvingsgroep met de naam MyX509Group te maken met een attestation-type certificaten (X.509). U kunt inschrijvingsgroepen maken voor IoT-apparaten of IoT Edge-apparaten.

  3. Selecteer primaire beheren in de inschrijvingsgroep die u hebt gemaakt.

  4. Selecteer In het deelvenster Primair certificaat de optie Certificaat toevoegen.

  5. Upload het basiscertificaatbestand met de naam mytestrootcert_cert.pem dat u eerder hebt gegenereerd.

  6. Als u een tussenliggende of basiscertificeringsinstantie gebruikt die u vertrouwt en weet dat u volledig eigendom van het certificaat hebt, kunt u zelf attesteren dat u het certificaat hebt geverifieerd door de certificaatstatus in te stellen die is geverifieerd bij uploaden naar Aan. Anders stelt u de certificaatstatus in die is geverifieerd bij uploaden naar Uit.

  7. Als u de certificaatstatus hebt ingesteld die is geverifieerd bij uploaden naar Uit, selecteert u Verificatiecode genereren.

  8. Kopieer de verificatiecode, kopieer deze en maak vervolgens een X.509-verificatiecertificaat. Bijvoorbeeld bij de opdrachtprompt:

    node create_test_cert.js verification --ca mytestrootcert_cert.pem --key mytestrootcert_key.pem --nonce  {verification-code}
    
  9. Selecteer Verifiëren om het ondertekende verificatiecertificaat te uploaden verification_cert.pem om de verificatie te voltooien.

  10. De status van het primaire certificaat is nu geverifieerd:

    Screenshot that shows a verified X509 certificate.

U kunt nu apparaten verbinden die een X.509-certificaat hebben dat is afgeleid van dit primaire basiscertificaat.

Nadat u de inschrijvingsgroep hebt opgeslagen, noteert u het id-bereik. U hebt het later nodig.

Voorbeeldcode van apparaat uitvoeren

Als u Windows gebruikt, moeten de X.509-certificaten zich in het Windows-certificaatarchief bevinden, zodat het voorbeeld werkt. Dubbelklik in Windows Verkenner op de PFX-bestanden die u eerder hebt gegenereerd en mytestrootcert.pfxsampleDevice01.pfx. Selecteer in de wizard Certificaat importeren huidige gebruiker als de opslaglocatie, voer 1234 het wachtwoord in en laat de wizard het certificaatarchief automatisch kiezen. De wizard importeert de certificaten naar het persoonlijke archief van de huidige gebruiker.

De voorbeeldcode wijzigen om de X.509-certificaten te gebruiken:

  1. Open in de Visual Studio-oplossing IoTHubDeviceSamples het Parameter.cs-bestand in het TemperatureController-project .

  2. Voeg de volgende twee parameterdefinities toe aan de klasse:

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

    De wijzigingen opslaan.

  3. Open in de Visual Studio-oplossing IoTHubDeviceSamples het bestand Program.cs in het TemperatureController-project .

  4. Voeg de volgende using instructies toe:

    using System.Security.Cryptography.X509Certificates;
    using System.IO;
    
  5. Voeg de volgende methode toe aan de klasse :

    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. Vervang in de SetupDeviceClientAsync methode het codeblok door case "dps" de volgende code:

    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. Vervang de ProvisionDeviceAsync-methode door de volgende code:

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

    De wijzigingen opslaan.

Het voorbeeld uitvoeren:

  1. Voeg de volgende omgevingsvariabelen toe aan het project:

    • IOTHUB_DEVICE_X509_CERT: <full path to folder that contains PFX files>sampleDevice01.pfx
    • IOTHUB_DEVICE_X509_PASSWORD: 1234.
  2. Maak de toepassing en voer deze uit. Controleer of de inrichting van het apparaat is geslaagd.

De voorbeeldcode wijzigen om de X.509-certificaten te gebruiken:

  1. Navigeer naar de map azure-iot-sdk-java/device/iot-device-samples/pnp-device-sample/temperature-controller-device-sample die het pom.xml-bestand en de src-map voor het apparaatvoorbeeld van de temperatuurcontroller bevat.

  2. Bewerk het pom.xml-bestand om de volgende afhankelijkheidsconfiguratie toe te voegen in het <dependencies> knooppunt:

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

    De wijzigingen opslaan.

  3. Open het bestand src/main/java/samples/com/microsoft/azure/sdk/iot/device/TemperatureController.java in uw teksteditor.

  4. Vervang het SecurityProviderSymmetricKey importeren door de volgende importbewerkingen:

    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. Voeg de volgende import toe:

    import java.nio.file.*;
    
  6. Voeg SecurityProviderException toe aan de lijst met uitzonderingen die de main methode genereert:

    public static void main(String[] args) throws IOException, URISyntaxException, ProvisioningDeviceClientException, InterruptedException, SecurityProviderException {
    
  7. Vervang de initializeAndProvisionDevice-methode door de volgende code:

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

    De wijzigingen opslaan.

Het voorbeeld uitvoeren:

  1. Voeg in uw shell-omgeving de volgende twee omgevingsvariabelen toe. Zorg ervoor dat u het volledige pad naar de PEM-bestanden opgeeft en gebruik het juiste padscheidingsteken voor uw besturingssysteem:

    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
    

    Tip

    U stelt de andere vereiste omgevingsvariabelen in wanneer u de zelfstudie Een clienttoepassing maken en verbinden met uw Azure IoT Central-toepassing hebt voltooid.

  2. Maak de toepassing en voer deze uit. Controleer of de inrichting van het apparaat is geslaagd.

De voorbeeldcode wijzigen om de X.509-certificaten te gebruiken:

  1. Navigeer naar de map azure-iot-sdk-node/device/samples/javascript die de pnp_temperature_controller.js-toepassing bevat en voer de volgende opdracht uit om het X.509-pakket te installeren:

    npm install azure-iot-security-x509 --save
    
  2. Open het bestand pnp_temperature_controller.js in een teksteditor.

  3. Bewerk de require instructies om de volgende code op te nemen:

    const fs = require('fs');
    const X509Security = require('azure-iot-security-x509').X509Security;
    
  4. Voeg de volgende vier regels toe aan de sectie DPS-verbindingsgegevens om de deviceCert variabele te initialiseren:

    const deviceCert = {
      cert: fs.readFileSync(process.env.IOTHUB_DEVICE_X509_CERT).toString(),
      key: fs.readFileSync(process.env.IOTHUB_DEVICE_X509_KEY).toString()
    };
    
  5. Bewerk de provisionDevice functie waarmee de client wordt gemaakt door de eerste regel te vervangen door de volgende code:

    var provSecurityClient = new X509Security(registrationId, deviceCert);
    
  6. Wijzig in dezelfde functie de regel waarmee de deviceConnectionString variabele als volgt wordt ingesteld:

    deviceConnectionString = 'HostName=' + result.assignedHub + ';DeviceId=' + result.deviceId + ';x509=true';
    
  7. Voeg in de main functie de volgende regel toe na de regel die aanroept Client.fromConnectionString:

    client.setOptions(deviceCert);
    

    De wijzigingen opslaan.

Het voorbeeld uitvoeren:

  1. Voeg in uw shell-omgeving de volgende twee omgevingsvariabelen toe. Zorg ervoor dat u het volledige pad naar de PEM-bestanden opgeeft en gebruik het juiste padscheidingsteken voor uw besturingssysteem:

    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
    

    Tip

    U stelt de andere vereiste omgevingsvariabelen in wanneer u de zelfstudie Een clienttoepassing maken en verbinden met uw Azure IoT Central-toepassing hebt voltooid.

  2. Voer het script uit en controleer of de inrichting van het apparaat is geslaagd:

    node pnp_temperature_controller.js
    

De voorbeeldcode wijzigen om de X.509-certificaten te gebruiken:

  1. Navigeer naar de map azure-iot-device/samples/pnp en open het bestand temp_controller_with_thermostats.py in een teksteditor.

  2. Voeg de volgende from instructie toe om de X.509-functionaliteit te importeren:

    from azure.iot.device import X509
    
  3. Wijzig het eerste deel van de provision_device functie als volgt:

    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. Vervang in de main functie de regel waarmee de symmetric_key variabele wordt ingesteld door de volgende code:

    x509 = X509(
        cert_file=os.getenv("IOTHUB_DEVICE_X509_CERT"),
        key_file=os.getenv("IOTHUB_DEVICE_X509_KEY"),
    )
    
  5. Vervang in de main functie de aanroep van de provision_device functie door de volgende code:

    registration_result = await provision_device(
        provisioning_host, id_scope, registration_id, x509, model_id
    )
    
  6. Vervang in de main functie de aanroep van de IoTHubDeviceClient.create_from_symmetric_key functie door de volgende code:

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

    De wijzigingen opslaan.

Het voorbeeld uitvoeren:

  1. Voeg in uw shell-omgeving de volgende twee omgevingsvariabelen toe. Zorg ervoor dat u het volledige pad naar de PEM-bestanden opgeeft en gebruik het juiste padscheidingsteken voor uw besturingssysteem:

    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
    

    Tip

    U stelt de andere vereiste omgevingsvariabelen in wanneer u de zelfstudie Een clienttoepassing maken en verbinden met uw Azure IoT Central-toepassing hebt voltooid.

  2. Voer het script uit en controleer of de inrichting van het apparaat is geslaagd:

    python temp_controller_with_thermostats.py
    

Controleer of telemetrie wordt weergegeven in de apparaatweergave in uw IoT Central-toepassing:

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

Afzonderlijke inschrijving gebruiken

Gebruik X.509-certificaten met een afzonderlijke inschrijving om uw apparaat en oplossing te testen. In een afzonderlijke inschrijving is er geen basis- of tussenliggend X.509-certificaat in uw IoT Central-toepassing. Apparaten gebruiken een zelfondertekend X.509-certificaat om verbinding te maken met uw toepassing.

Zelfondertekend apparaatcertificaat genereren

In deze sectie gebruikt u een zelfondertekend X.509-certificaat om apparaten te verbinden voor afzonderlijke inschrijving, die worden gebruikt om één apparaat in te schrijven. Zelfondertekende certificaten zijn alleen bedoeld voor testen.

Waarschuwing

Deze manier om X.509-certificaten te genereren, is alleen bedoeld voor testen. Voor een productieomgeving moet u uw officiële, veilige mechanisme gebruiken voor het genereren van certificaten.

Maak een zelfondertekend X.509-apparaatcertificaat door de volgende opdrachten uit te voeren:

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

Tip

Een apparaat-id mag alleen letters, cijfers en het teken - bevatten.

Met deze opdrachten worden de volgende apparaatcertificaten geproduceerd:

filename Inhoud
mytestselfcertprimary_cert.pem Het openbare gedeelte van het X509-certificaat van het primaire apparaat
mytestselfcertprimary_key.pem De persoonlijke sleutel voor het X509-certificaat van het primaire apparaat
mytestselfcertprimary_fullchain.pem De hele sleutelhanger voor het X509-certificaat van het primaire apparaat.
mytestselfcertprimary.pfx Het PFX-bestand voor het X509-certificaat van het primaire apparaat.
mytestselfcertsecondary_cert.pem Het openbare gedeelte van het X509-certificaat van het secundaire apparaat
mytestselfcertsecondary_key.pem De persoonlijke sleutel voor het X509-certificaat van het secundaire apparaat
mytestselfcertsecondary_fullchain.pem De hele sleutelhanger voor het X509-certificaat van het secundaire apparaat.
mytestselfcertsecondary.pfx Het PFX-bestand voor het X509-certificaat van het secundaire apparaat.

Afzonderlijke inschrijving maken

  1. Selecteer Apparaten in de Azure IoT Central-toepassing en maak een nieuw apparaat met apparaat-id als mytestselfcertprimary op basis van de thermostaatapparaatsjabloon. Noteer het id-bereik en gebruik het later.

  2. Open het apparaat dat u hebt gemaakt en selecteer Verbinding maken.

  3. Selecteer Afzonderlijke inschrijving als verificatietypeen certificaten (X.509) als verificatiemethode.

  4. Upload het bestand mytestselfcertprimary_cert.pem dat u eerder hebt gegenereerd als het primaire certificaat.

  5. Upload het bestand mytestselfcertsecondary_cert.pem dat u eerder hebt gegenereerd als het secundaire certificaat. Selecteer vervolgens Opslaan.

  6. Het apparaat heeft nu een afzonderlijke inschrijving met X.509-certificaten.

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

Een voorbeeld van een individueel inschrijvingsapparaat uitvoeren

Als u Windows gebruikt, moeten de X.509-certificaten zich in het Windows-certificaatarchief bevinden, zodat het voorbeeld werkt. Dubbelklik in Windows Verkenner op de PFX-bestanden die u eerder hebt gegenereerd en mytestselfcertprimary.pfxmytestselfcertsecondary.pfx. Selecteer in de wizard Certificaat importeren huidige gebruiker als de opslaglocatie, voer 1234 het wachtwoord in en laat de wizard het certificaatarchief automatisch kiezen. De wizard importeert de certificaten naar het persoonlijke archief van de huidige gebruiker.

De voorbeeldcode wijzigen om de X.509-certificaten te gebruiken:

  1. Open in de Visual Studio-oplossing IoTHubDeviceSamples het Parameter.cs-bestand in het TemperatureController-project .

  2. Voeg de volgende twee parameterdefinities toe aan de klasse:

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

    De wijzigingen opslaan.

  3. Open in de Visual Studio-oplossing IoTHubDeviceSamples het bestand Program.cs in het TemperatureController-project .

  4. Voeg de volgende using instructies toe:

    using System.Security.Cryptography.X509Certificates;
    using System.IO;
    
  5. Voeg de volgende methode toe aan de klasse :

    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. Vervang in de SetupDeviceClientAsync methode het codeblok door case "dps" de volgende code:

    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. Vervang de ProvisionDeviceAsync-methode door de volgende code:

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

    De wijzigingen opslaan.

Het voorbeeld uitvoeren:

  1. Voeg de volgende omgevingsvariabelen toe aan het project:

    • 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. Maak de toepassing en voer deze uit. Controleer of de inrichting van het apparaat is geslaagd.

De voorbeeldcode wijzigen om de X.509-certificaten te gebruiken:

  1. Navigeer naar de map azure-iot-sdk-java/device/iot-device-samples/pnp-device-sample/temperature-controller-device-sample die het pom.xml-bestand en de src-map voor het apparaatvoorbeeld van de temperatuurcontroller bevat.

  2. Bewerk het pom.xml-bestand om de volgende afhankelijkheidsconfiguratie toe te voegen in het <dependencies> knooppunt:

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

    De wijzigingen opslaan.

  3. Open het bestand src/main/java/samples/com/microsoft/azure/sdk/iot/device/TemperatureController.java in uw teksteditor.

  4. Vervang het SecurityProviderSymmetricKey importeren door de volgende importbewerkingen:

    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. Voeg de volgende import toe:

    import java.nio.file.*;
    
  6. Voeg SecurityProviderException toe aan de lijst met uitzonderingen die de main methode genereert:

    public static void main(String[] args) throws IOException, URISyntaxException, ProvisioningDeviceClientException, InterruptedException, SecurityProviderException {
    
  7. Vervang de initializeAndProvisionDevice-methode door de volgende code:

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

    De wijzigingen opslaan.

Het voorbeeld uitvoeren:

  1. Voeg in uw shell-omgeving de volgende twee omgevingsvariabelen toe. Zorg ervoor dat u het volledige pad naar de PEM-bestanden opgeeft en gebruik het juiste padscheidingsteken voor uw besturingssysteem:

    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
    

    Tip

    U stelt de andere vereiste omgevingsvariabelen in wanneer u de zelfstudie Een clienttoepassing maken en verbinden met uw Azure IoT Central-toepassing hebt voltooid.

  2. Maak de toepassing en voer deze uit. Controleer of de inrichting van het apparaat is geslaagd.

U kunt ook de bovenstaande stappen voor mytestselfcertsecondary-certificaat herhalen.

De voorbeeldcode wijzigen om de X.509-certificaten te gebruiken:

  1. Navigeer naar de map azure-iot-sdk-node/device/samples/javascript die de pnp_temperature_controller.js-toepassing bevat en voer de volgende opdracht uit om het X.509-pakket te installeren:

    npm install azure-iot-security-x509 --save
    
  2. Open het bestand pnp_temperature_controller.js in een teksteditor.

  3. Bewerk de require instructies om de volgende code op te nemen:

    const fs = require('fs');
    const X509Security = require('azure-iot-security-x509').X509Security;
    
  4. Voeg de volgende vier regels toe aan de sectie DPS-verbindingsgegevens om de deviceCert variabele te initialiseren:

    const deviceCert = {
      cert: fs.readFileSync(process.env.IOTHUB_DEVICE_X509_CERT).toString(),
      key: fs.readFileSync(process.env.IOTHUB_DEVICE_X509_KEY).toString()
    };
    
  5. Bewerk de provisionDevice functie waarmee de client wordt gemaakt door de eerste regel te vervangen door de volgende code:

    var provSecurityClient = new X509Security(registrationId, deviceCert);
    
  6. Wijzig in dezelfde functie de regel waarmee de deviceConnectionString variabele als volgt wordt ingesteld:

    deviceConnectionString = 'HostName=' + result.assignedHub + ';DeviceId=' + result.deviceId + ';x509=true';
    
  7. Voeg in de main functie de volgende regel toe na de regel die aanroept Client.fromConnectionString:

    client.setOptions(deviceCert);
    

    De wijzigingen opslaan.

Het voorbeeld uitvoeren:

  1. Voeg in uw shell-omgeving de volgende twee omgevingsvariabelen toe. Zorg ervoor dat u het volledige pad naar de PEM-bestanden opgeeft en gebruik het juiste padscheidingsteken voor uw besturingssysteem:

    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
    

    Tip

    U stelt de andere vereiste omgevingsvariabelen in wanneer u de zelfstudie Een clienttoepassing maken en verbinden met uw Azure IoT Central-toepassing hebt voltooid.

  2. Voer het script uit en controleer of de inrichting van het apparaat is geslaagd:

    node pnp_temperature_controller.js
    

U kunt ook de bovenstaande stappen voor mytestselfcertsecondary-certificaat herhalen.

De voorbeeldcode wijzigen om de X.509-certificaten te gebruiken:

  1. Navigeer naar de map azure-iot-device/samples/pnp en open het bestand temp_controller_with_thermostats.py in een teksteditor.

  2. Voeg de volgende from instructie toe om de X.509-functionaliteit te importeren:

    from azure.iot.device import X509
    
  3. Wijzig het eerste deel van de provision_device functie als volgt:

    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. Vervang in de main functie de regel waarmee de symmetric_key variabele wordt ingesteld door de volgende code:

    x509 = X509(
        cert_file=os.getenv("IOTHUB_DEVICE_X509_CERT"),
        key_file=os.getenv("IOTHUB_DEVICE_X509_KEY"),
    )
    
  5. Vervang in de main functie de aanroep van de provision_device functie door de volgende code:

    registration_result = await provision_device(
        provisioning_host, id_scope, registration_id, x509, model_id
    )
    
  6. Vervang in de main functie de aanroep van de IoTHubDeviceClient.create_from_symmetric_key functie door de volgende code:

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

    De wijzigingen opslaan.

Het voorbeeld uitvoeren:

  1. Voeg in uw shell-omgeving de volgende twee omgevingsvariabelen toe. Zorg ervoor dat u het volledige pad naar de PEM-bestanden opgeeft en gebruik het juiste padscheidingsteken voor uw besturingssysteem:

    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
    

    Tip

    U stelt de andere vereiste omgevingsvariabelen in wanneer u de zelfstudie Een clienttoepassing maken en verbinden met uw Azure IoT Central-toepassing hebt voltooid.

  2. Voer het script uit en controleer of de inrichting van het apparaat is geslaagd:

    python temp_controller_with_thermostats.py
    

U kunt ook de bovenstaande stappen voor mytestselfcertsecondary-certificaat herhalen.

Een IoT Edge-apparaat verbinden

In deze sectie wordt ervan uitgegaan dat u een groepsinschrijving gebruikt om verbinding te maken met uw IoT Edge-apparaat. Volg de stappen in de vorige secties om:

Als u het IoT Edge-apparaat wilt verbinden met IoT Central met behulp van het X.509-apparaatcertificaat:

  • Kopieer het apparaatcertificaat en de sleutelbestanden naar uw IoT Edge-apparaat. In het vorige voorbeeld van groepsinschrijving werden deze bestanden sampleDevice01_key.pem en sampleDevice01_cert.pem genoemd.

  • Bewerk provisioning op het IoT Edge-apparaat als volgt de sectie in het configuratiebestand /etc/aziot/config.toml :

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

    Tip

    U hoeft geen waarde toe te voegen voor de registration_id. IoT Edge kan de CN-waarde van het X.509-certificaat gebruiken.

  • Voer de volgende opdracht uit om de IoT Edge-runtime opnieuw te starten:

    sudo iotedge config apply
    

Zie IoT Edge-apparaten op schaal maken en inrichten in Linux met behulp van X.509-certificaten voor meer informatie.

Verbinding maken een downstreamapparaat naar IoT Edge

IoT Edge maakt gebruik van X.509-certificaten om de verbinding tussen downstreamapparaten en een IoT Edge-apparaat te beveiligen dat fungeert als een transparante gateway. Zie Verbinding maken een downstreamapparaat naar een Azure IoT Edge-gateway voor meer informatie over het configureren van dit scenario.

Uw X.509-apparaatcertificaten uitrollen

Tijdens de levenscyclus van uw IoT Central-toepassing moet u mogelijk uw X.509-certificaten rollen. Voorbeeld:

  • Als u een beveiligingsschending hebt, is rolling certificaten een best practice voor beveiliging om uw systeem te beveiligen.
  • X.509-certificaten hebben vervaldatums. De frequentie waarin u uw certificaten rolt, is afhankelijk van de beveiligingsbehoeften van uw oplossing. Klanten met oplossingen waarbij zeer gevoelige gegevens betrokken zijn, kunnen certificaten dagelijks rollen, terwijl anderen hun certificaten elke paar jaar uitrollen.

Voor ononderbroken connectiviteit kunt u met IoT Central primaire en secundaire X.509-certificaten configureren. Als de primaire en secundaire certificaten verschillende vervaldatums hebben, kunt u het verlopen certificaat samenrollen terwijl apparaten verbinding blijven maken met het andere certificaat.

Voor meer informatie raadpleegt u De methodologie Van inbreuk aannemen.

In deze sectie wordt beschreven hoe u de certificaten in IoT Central kunt implementeren. Wanneer u een certificaat in IoT Central rolt, moet u ook het nieuwe apparaatcertificaat naar uw apparaten kopiëren.

Nieuwe X.509-certificaten verkrijgen

Verkrijg nieuwe X.509-certificaten van uw certificaatprovider. U kunt uw eigen X.509-certificaten maken met behulp van een hulpprogramma zoals OpenSSL. Deze methode is handig voor het testen van X.509-certificaten, maar biedt weinig beveiligingsgaranties. Gebruik deze methode alleen voor testen, tenzij u bent voorbereid om te fungeren als uw eigen CA-provider.

Inschrijvingsgroepen en beveiligingsschendingen

Als u een groepsinschrijving wilt bijwerken als reactie op een beveiligingsschending, moet u de volgende methode gebruiken om het huidige certificaat onmiddellijk bij te werken. Voer deze stappen uit voor de primaire en secundaire certificaten als beide zijn aangetast:

  1. Navigeer naar Machtigingen in het linkerdeelvenster en selecteer Apparaatverbindingsgroepen.

  2. Selecteer de groepsnaam in de lijst onder Inschrijvingsgroepen.

  3. Voor certificaatupdate selecteert u Primair beheren of Secundair beheren.

  4. Voeg het X.509-basiscertificaat toe en controleer het in de inschrijvingsgroep.

Individuele inschrijvingen en beveiligingsschendingen

Als u certificaten rolt als reactie op een beveiligingsschending, gebruikt u de volgende methode om het huidige certificaat onmiddellijk bij te werken. Voer deze stappen uit voor de primaire en secundaire certificaten, als beide zijn aangetast:

  1. Selecteer Apparaten en selecteer het apparaat.

  2. Selecteer Verbinding maken en selecteer de verbindingsmethode als afzonderlijke inschrijving

  3. Selecteer Certificaten (X.509) als mechanisme.

  4. Selecteer voor het bijwerken van het certificaat het mappictogram om het nieuwe certificaat te selecteren dat moet worden geüpload voor de inschrijvingsvermelding. Selecteer Opslaan.

Inschrijvingsgroepen en vervaldatum van certificaat

Als u vervaldatums van certificaten wilt verwerken, gebruikt u de volgende methode om het huidige certificaat onmiddellijk bij te werken:

  1. Navigeer naar Machtigingen in het linkerdeelvenster en selecteer Apparaatverbindingsgroepen.

  2. Selecteer de groepsnaam in de lijst onder Inschrijvingsgroepen.

  3. Voor certificaatupdate selecteert u Primair beheren.

  4. Voeg het X.509-basiscertificaat toe en controleer het in de inschrijvingsgroep.

  5. Later wanneer het secundaire certificaat verloopt, komt u terug en werkt u het secundaire certificaat bij.

Afzonderlijke inschrijvingen en vervaldatum van certificaten

Als u certificaten rolling voor het afhandelen van verlopen certificaten gebruikt, moet u de secundaire certificaatconfiguratie als volgt gebruiken om de downtime te verminderen voor apparaten die in uw toepassing proberen in te richten.

Wanneer het secundaire certificaat bijna verloopt en moet worden gerolld, kunt u naar de primaire configuratie draaien. Als u op deze manier tussen de primaire en secundaire certificaten roteert, vermindert u de downtime voor apparaten die proberen in te richten in uw toepassing.

  1. Selecteer Apparaten en selecteer het apparaat.

  2. Selecteer Verbinding maken en selecteer de verbindingsmethode als afzonderlijke inschrijving

  3. Selecteer Certificaten (X.509) als mechanisme.

  4. Selecteer voor het bijwerken van secundaire certificaten het mappictogram om het nieuwe certificaat te selecteren dat moet worden geüpload voor de inschrijvingsvermelding. Selecteer Opslaan.

  5. Later wanneer het primaire certificaat is verlopen, komt u terug en werkt u het primaire certificaat bij.