Připojení zařízení pomocí certifikátů X.509 k aplikaci IoT Central

IoT Central podporuje sdílené přístupové podpisy (SAS) i certifikáty X.509 k zabezpečení komunikace mezi zařízením a vaší aplikací. Kurz Vytvoření a připojení klientské aplikace k aplikaci Azure IoT Central používá SAS. V tomto článku se dozvíte, jak upravit vzorový kód tak, aby používal certifikáty X.509. Certifikáty X.509 se doporučují v produkčních prostředích. Další informace najdete v tématu Koncepty ověřování zařízení.

Tato příručka ukazuje dva způsoby použití certifikátů X.509 – skupinové registrace obvykle používané v produkčním prostředí a jednotlivé registrace užitečné pro testování. Tento článek také popisuje, jak zavádět certifikáty zařízení, aby se zachovalo připojení po vypršení platnosti certifikátů.

Tato příručka vychází z ukázek zobrazených v tématu Vytvoření a připojení klientské aplikace k kurzu aplikace Azure IoT Central, který používá C#, Javu, JavaScript a Python. Příklad, který používá programovací jazyk C, najdete v tématu Zřizování více zařízení X.509 pomocí skupin registrací.

Požadavky

Abyste mohli dokončit kroky v tomto průvodci postupy, měli byste nejprve dokončit vytvoření a připojit klientskou aplikaci k kurzu aplikace Azure IoT Central. Kód, který jste použili v kurzu, upravíte, když budete postupovat podle kroků v této příručce.

V tomto návodu vygenerujete některé testovací certifikáty X.509. Abyste mohli tyto certifikáty vygenerovat, potřebujete:

  • Vývojový počítač s nainstalovaným Node.js verze 6 nebo novější. Verzi můžete zkontrolovat spuštěním node --version na příkazovém řádku. Pokyny v tomto kurzu předpokládají, že spouštíte příkaz node na příkazovém řádku Windows. Můžete ale použít Node.js v mnoha dalších operačních systémech.
  • Místní kopie sady Microsoft Azure IoT SDK pro Node.js úložiště GitHub, která obsahuje skripty pro vygenerování testovacích certifikátů X.509. Pomocí tohoto odkazu si můžete stáhnout kopii úložiště: Stáhnout soubor ZIP. Potom soubor rozbalte do vhodného umístění na místním počítači.

Použití skupinové registrace

Používejte certifikáty X.509 se skupinou v produkčním prostředí. V registraci skupiny přidáte do aplikace IoT Central kořenový nebo zprostředkující certifikát X.509. Zařízení s listovými certifikáty odvozenými z kořenového nebo zprostředkujícího certifikátu se můžou připojit k vaší aplikaci.

Generování kořenových certifikátů a certifikátů zařízení

V této části použijete certifikát X.509 k připojení zařízení s certifikátem odvozeným z certifikátu skupiny registrací IoT Central.

Upozorňující

Tímto způsobem se generují certifikáty X.509 pouze pro testování. V produkčním prostředí byste měli používat oficiální zabezpečený mechanismus pro generování certifikátů.

  1. Přejděte do skriptu generátoru certifikátů v sadě Microsoft Azure IoT SDK pro Node.js jste si stáhli. Nainstalujte požadované balíčky:

    cd azure-iot-sdk-node/provisioning/tools
    npm install
    
  2. Vytvořte kořenový certifikát a potom odvodit certifikát zařízení spuštěním skriptu:

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

    Tip

    ID zařízení může obsahovat písmena, číslice a - znak.

Tyto příkazy vytvoří následující kořenový adresář a certifikáty zařízení:

filename Obsah
mytestrootcert_cert.pem Veřejná část kořenového certifikátu X509
mytestrootcert_key.pem Privátní klíč pro kořenový certifikát X509
mytestrootcert_fullchain.pem Celý klíčence kořenového certifikátu X509.
mytestrootcert.pfx Soubor PFX pro kořenový certifikát X509.
sampleDevice01_cert.pem Veřejná část certifikátu X509 zařízení
sampleDevice01_key.pem Privátní klíč pro certifikát X509 zařízení
sampleDevice01_fullchain.pem Celý klíčence pro certifikát X509 zařízení.
sampleDevice01.pfx Soubor PFX pro certifikát X509 zařízení.

Poznamenejte si umístění těchto souborů. Budete ho potřebovat později.

Vytvoření skupinové registrace

  1. Otevřete aplikaci IoT Central a v levém podokně přejděte na Oprávnění a vyberte Skupiny připojení zařízení.

  2. Vyberte + Nový a vytvořte novou skupinu registrací s názvem MyX509Group s typem ověření identity certifikátů (X.509). Skupiny registrací můžete vytvořit pro zařízení IoT nebo zařízení IoT Edge.

  3. Ve skupině registrací, kterou jste vytvořili, vyberte Spravovat primární.

  4. Na panelu Primární certifikát vyberte Přidat certifikát.

  5. Nahrajte soubor kořenového certifikátu s názvem mytestrootcert_cert.pem , který jste předtím vygenerovali.

  6. Pokud používáte zprostředkující nebo kořenovou certifikační autoritu, které důvěřujete a víte, že máte úplné vlastnictví certifikátu, můžete certifikát ověřit tak, že jste certifikát ověřili nastavením stavu certifikátu ověřeného při nahrání na zapnuto. V opačném případě nastavte stav certifikátu ověřený při nahrání na vypnuto.

  7. Pokud nastavíte stav certifikátu ověřený při nahrání na vypnuto, vyberte Vygenerovat ověřovací kód.

  8. Zkopírujte ověřovací kód, zkopírujte ho a pak vytvořte ověřovací certifikát X.509. Například na příkazovém řádku:

    node create_test_cert.js verification --ca mytestrootcert_cert.pem --key mytestrootcert_key.pem --nonce  {verification-code}
    
  9. Výběrem možnosti Ověřit nahrajte podepsaný ověřovací certifikát verification_cert.pem a dokončete ověření.

  10. Stav primárního certifikátu je teď ověřený:

    Screenshot that shows a verified X509 certificate.

Teď můžete připojit zařízení, která mají certifikát X.509 odvozený z tohoto primárního kořenového certifikátu.

Po uložení skupiny registrací si poznamenejte rozsah ID. Budete ho potřebovat později.

Spuštění ukázkového kódu zařízení

Pokud používáte Windows, musí být certifikáty X.509 v úložišti certifikátů Windows, aby ukázka fungovala. V Průzkumníku Windows poklikejte na soubory PFX, které jste vygenerovali dříve – mytestrootcert.pfx a sampleDevice01.pfx. V Průvodci importem certifikátu vyberte jako umístění úložiště aktuálního uživatele, zadejte 1234 heslo a nechte průvodce zvolit úložiště certifikátů automaticky. Průvodce importuje certifikáty do osobního úložiště aktuálního uživatele.

Úprava vzorového kódu tak, aby používala certifikáty X.509:

  1. V řešení sady Visual Studio IoTHubDeviceSamples otevřete soubor Parameter.cs v projektu TemperatureController.

  2. Do třídy přidejte následující dvě definice parametrů:

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

    Uložte změny.

  3. V řešení Sady Visual Studio IoTHubDeviceSamples otevřete soubor Program.cs v projektu TemperatureController.

  4. Přidejte následující příkazy using:

    using System.Security.Cryptography.X509Certificates;
    using System.IO;
    
  5. Do třídy přidejte následující metodu:

    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 V metodě nahraďte blok kódu case "dps" následujícím kódem:

    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. Nahraďte metodu ProvisionDeviceAsync následujícím kódem:

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

    Uložte změny.

Spuštění ukázky:

  1. Do projektu přidejte následující proměnné prostředí:

    • IOTHUB_DEVICE_X509_CERT: <full path to folder that contains PFX files>sampleDevice01.pfx
    • IOTHUB_DEVICE_X509_PASSWORD: 1234.
  2. Sestavte a spusťte aplikaci. Ověřte, že zařízení bylo úspěšně zřídí.

Úprava vzorového kódu tak, aby používala certifikáty X.509:

  1. Přejděte do složky azure-iot-sdk-java/device/iot-device-samples/pnp-device-sample/temperature-controller-device-sample , která obsahuje soubor pom.xml a složku src pro ukázku zařízení kontroleru teploty.

  2. Upravte soubor pom.xml a přidejte do uzlu následující konfiguraci <dependencies> závislostí:

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

    Uložte změny.

  3. Otevřete soubor src/main/java/samples/com/microsoft/azure/sdk/iot/device/TemperatureController.java v textovém editoru.

  4. SecurityProviderSymmetricKey Import nahraďte následujícími importy:

    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. Přidejte následující import:

    import java.nio.file.*;
    
  6. Přidejte SecurityProviderException do seznamu výjimek, které main metoda vyvolá:

    public static void main(String[] args) throws IOException, URISyntaxException, ProvisioningDeviceClientException, InterruptedException, SecurityProviderException {
    
  7. Nahraďte metodu initializeAndProvisionDevice následujícím kódem:

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

    Uložte změny.

Spuštění ukázky:

  1. Do prostředí prostředí přidejte následující dvě proměnné prostředí. Ujistěte se, že zadáte úplnou cestu k souborům PEM a použijete správný oddělovač cest pro váš operační systém:

    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

    Ostatní požadované proměnné prostředí nastavíte po dokončení vytvoření a připojení klientské aplikace k kurzu aplikace Azure IoT Central.

  2. Sestavte a spusťte aplikaci. Ověřte, že zařízení bylo úspěšně zřídí.

Úprava vzorového kódu tak, aby používala certifikáty X.509:

  1. Přejděte do složky azure-iot-sdk-node/device/samples/javascript , která obsahuje aplikaci pnp_temperature_controller.js , a spuštěním následujícího příkazu nainstalujte balíček X.509:

    npm install azure-iot-security-x509 --save
    
  2. Otevřete soubor pnp_temperature_controller.js v textovém editoru.

  3. require Upravte příkazy tak, aby zahrnovaly následující kód:

    const fs = require('fs');
    const X509Security = require('azure-iot-security-x509').X509Security;
    
  4. Do části Informace o připojení DPS přidejte následující čtyři řádky, které inicializují proměnnou deviceCert :

    const deviceCert = {
      cert: fs.readFileSync(process.env.IOTHUB_DEVICE_X509_CERT).toString(),
      key: fs.readFileSync(process.env.IOTHUB_DEVICE_X509_KEY).toString()
    };
    
  5. provisionDevice Upravte funkci, která vytvoří klienta nahrazením prvního řádku následujícím kódem:

    var provSecurityClient = new X509Security(registrationId, deviceCert);
    
  6. Ve stejné funkci upravte řádek, který nastaví deviceConnectionString proměnnou následujícím způsobem:

    deviceConnectionString = 'HostName=' + result.assignedHub + ';DeviceId=' + result.deviceId + ';x509=true';
    
  7. main Do funkce přidejte následující řádek za řádek, který voláClient.fromConnectionString:

    client.setOptions(deviceCert);
    

    Uložte změny.

Spuštění ukázky:

  1. Do prostředí prostředí přidejte následující dvě proměnné prostředí. Ujistěte se, že zadáte úplnou cestu k souborům PEM a použijete správný oddělovač cest pro váš operační systém:

    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

    Ostatní požadované proměnné prostředí nastavíte po dokončení vytvoření a připojení klientské aplikace k kurzu aplikace Azure IoT Central.

  2. Spusťte skript a ověřte, že zařízení úspěšně zřídí:

    node pnp_temperature_controller.js
    

Úprava vzorového kódu tak, aby používala certifikáty X.509:

  1. Přejděte do složky azure-iot-device/samples/pnp a otevřete soubor temp_controller_with_thermostats.py v textovém editoru.

  2. Přidejte následující from příkaz pro import funkce X.509:

    from azure.iot.device import X509
    
  3. Upravte první část provision_device funkce následujícím způsobem:

    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 Ve funkci nahraďte řádek, který nastaví symmetric_key proměnnou následujícím kódem:

    x509 = X509(
        cert_file=os.getenv("IOTHUB_DEVICE_X509_CERT"),
        key_file=os.getenv("IOTHUB_DEVICE_X509_KEY"),
    )
    
  5. main Ve funkci nahraďte volání provision_device funkce následujícím kódem:

    registration_result = await provision_device(
        provisioning_host, id_scope, registration_id, x509, model_id
    )
    
  6. main Ve funkci nahraďte volání IoTHubDeviceClient.create_from_symmetric_key funkce následujícím kódem:

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

    Uložte změny.

Spuštění ukázky:

  1. Do prostředí prostředí přidejte následující dvě proměnné prostředí. Ujistěte se, že zadáte úplnou cestu k souborům PEM a použijete správný oddělovač cest pro váš operační systém:

    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

    Ostatní požadované proměnné prostředí nastavíte po dokončení vytvoření a připojení klientské aplikace k kurzu aplikace Azure IoT Central.

  2. Spusťte skript a ověřte, že zařízení úspěšně zřídí:

    python temp_controller_with_thermostats.py
    

Ověřte, že se telemetrie zobrazuje v zobrazení zařízení ve vaší aplikaci IoT Central:

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

Použití jednotlivé registrace

K otestování zařízení a řešení použijte certifikáty X.509 s jednotlivými registracemi. V individuální registraci není v aplikaci IoT Central žádný kořenový ani zprostředkující certifikát X.509. Zařízení k připojení k aplikaci používají certifikát X.509 podepsaný svým držitelem.

Generování certifikátu zařízení podepsaného svým držitelem

V této části použijete certifikát X.509 podepsaný svým držitelem k připojení zařízení pro jednotlivé registrace, které slouží k registraci jednoho zařízení. Certifikáty podepsané svým držitelem slouží pouze k testování.

Upozorňující

Tímto způsobem se generují certifikáty X.509 pouze pro testování. V produkčním prostředí byste měli používat oficiální zabezpečený mechanismus pro generování certifikátů.

Spuštěním následujících příkazů vytvořte certifikát zařízení X.509 podepsaný svým držitelem:

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

Tip

ID zařízení může obsahovat písmena, číslice a - znak.

Tyto příkazy vytvářejí následující certifikáty zařízení:

filename Obsah
mytestselfcertprimary_cert.pem Veřejná část primárního certifikátu X509 zařízení
mytestselfcertprimary_key.pem Privátní klíč pro primární certifikát X509 zařízení
mytestselfcertprimary_fullchain.pem Celý klíčence pro primární certifikát X509 zařízení.
mytestselfcertprimary.pfx Soubor PFX pro primární certifikát X509 zařízení.
mytestselfcertsecondary_cert.pem Veřejná část certifikátu X509 sekundárního zařízení
mytestselfcertsecondary_key.pem Privátní klíč pro certifikát X509 sekundárního zařízení
mytestselfcertsecondary_fullchain.pem Celá řetězce klíčů pro certifikát X509 sekundárního zařízení.
mytestselfcertsecondary.pfx Soubor PFX pro certifikát X509 sekundárního zařízení.

Vytvoření jednotlivé registrace

  1. V aplikaci Azure IoT Central vyberte Zařízení a vytvořte nové zařízení s ID zařízení jako mytestselfcertprimary ze šablony termostatu zařízení. Poznamenejte si obor ID, který použijete později.

  2. Otevřete zařízení, které jste vytvořili, a vyberte Připojení.

  3. Jako metodu ověřování vyberte jednotlivé registrace jako typ ověřování a certifikáty (X.509).

  4. Nahrajte soubor mytestselfcertprimary_cert.pem, který jste předtím vygenerovali jako primární certifikát.

  5. Nahrajte soubor mytestselfcertsecondary_cert.pem, který jste předtím vygenerovali jako sekundární certifikát. Pak vyberte Uložit.

  6. Zařízení teď má jednotlivou registraci s certifikáty X.509.

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

Spuštění ukázkového jednotlivého registračního zařízení

Pokud používáte Windows, musí být certifikáty X.509 v úložišti certifikátů Windows, aby ukázka fungovala. V Průzkumníku Windows poklikejte na soubory PFX, které jste vygenerovali dříve – mytestselfcertprimary.pfx a mytestselfcertsecondary.pfx. V Průvodci importem certifikátu vyberte jako umístění úložiště aktuálního uživatele, zadejte 1234 heslo a nechte průvodce zvolit úložiště certifikátů automaticky. Průvodce importuje certifikáty do osobního úložiště aktuálního uživatele.

Úprava vzorového kódu tak, aby používala certifikáty X.509:

  1. V řešení sady Visual Studio IoTHubDeviceSamples otevřete soubor Parameter.cs v projektu TemperatureController.

  2. Do třídy přidejte následující dvě definice parametrů:

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

    Uložte změny.

  3. V řešení Sady Visual Studio IoTHubDeviceSamples otevřete soubor Program.cs v projektu TemperatureController.

  4. Přidejte následující příkazy using:

    using System.Security.Cryptography.X509Certificates;
    using System.IO;
    
  5. Do třídy přidejte následující metodu:

    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 V metodě nahraďte blok kódu case "dps" následujícím kódem:

    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. Nahraďte metodu ProvisionDeviceAsync následujícím kódem:

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

    Uložte změny.

Spuštění ukázky:

  1. Do projektu přidejte následující proměnné prostředí:

    • 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. Sestavte a spusťte aplikaci. Ověřte, že zařízení bylo úspěšně zřídí.

Úprava vzorového kódu tak, aby používala certifikáty X.509:

  1. Přejděte do složky azure-iot-sdk-java/device/iot-device-samples/pnp-device-sample/temperature-controller-device-sample , která obsahuje soubor pom.xml a složku src pro ukázku zařízení kontroleru teploty.

  2. Upravte soubor pom.xml a přidejte do uzlu následující konfiguraci <dependencies> závislostí:

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

    Uložte změny.

  3. Otevřete soubor src/main/java/samples/com/microsoft/azure/sdk/iot/device/TemperatureController.java v textovém editoru.

  4. SecurityProviderSymmetricKey Import nahraďte následujícími importy:

    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. Přidejte následující import:

    import java.nio.file.*;
    
  6. Přidejte SecurityProviderException do seznamu výjimek, které main metoda vyvolá:

    public static void main(String[] args) throws IOException, URISyntaxException, ProvisioningDeviceClientException, InterruptedException, SecurityProviderException {
    
  7. Nahraďte metodu initializeAndProvisionDevice následujícím kódem:

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

    Uložte změny.

Spuštění ukázky:

  1. Do prostředí prostředí přidejte následující dvě proměnné prostředí. Ujistěte se, že zadáte úplnou cestu k souborům PEM a použijete správný oddělovač cest pro váš operační systém:

    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

    Ostatní požadované proměnné prostředí nastavíte po dokončení vytvoření a připojení klientské aplikace k kurzu aplikace Azure IoT Central.

  2. Sestavte a spusťte aplikaci. Ověřte, že zařízení bylo úspěšně zřídí.

Výše uvedené kroky můžete zopakovat i pro certifikát mytestselfcertsecondary .

Úprava vzorového kódu tak, aby používala certifikáty X.509:

  1. Přejděte do složky azure-iot-sdk-node/device/samples/javascript , která obsahuje aplikaci pnp_temperature_controller.js , a spuštěním následujícího příkazu nainstalujte balíček X.509:

    npm install azure-iot-security-x509 --save
    
  2. Otevřete soubor pnp_temperature_controller.js v textovém editoru.

  3. require Upravte příkazy tak, aby zahrnovaly následující kód:

    const fs = require('fs');
    const X509Security = require('azure-iot-security-x509').X509Security;
    
  4. Do části Informace o připojení DPS přidejte následující čtyři řádky, které inicializují proměnnou deviceCert :

    const deviceCert = {
      cert: fs.readFileSync(process.env.IOTHUB_DEVICE_X509_CERT).toString(),
      key: fs.readFileSync(process.env.IOTHUB_DEVICE_X509_KEY).toString()
    };
    
  5. provisionDevice Upravte funkci, která vytvoří klienta nahrazením prvního řádku následujícím kódem:

    var provSecurityClient = new X509Security(registrationId, deviceCert);
    
  6. Ve stejné funkci upravte řádek, který nastaví deviceConnectionString proměnnou následujícím způsobem:

    deviceConnectionString = 'HostName=' + result.assignedHub + ';DeviceId=' + result.deviceId + ';x509=true';
    
  7. main Do funkce přidejte následující řádek za řádek, který voláClient.fromConnectionString:

    client.setOptions(deviceCert);
    

    Uložte změny.

Spuštění ukázky:

  1. Do prostředí prostředí přidejte následující dvě proměnné prostředí. Ujistěte se, že zadáte úplnou cestu k souborům PEM a použijete správný oddělovač cest pro váš operační systém:

    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

    Ostatní požadované proměnné prostředí nastavíte po dokončení vytvoření a připojení klientské aplikace k kurzu aplikace Azure IoT Central.

  2. Spusťte skript a ověřte, že zařízení úspěšně zřídí:

    node pnp_temperature_controller.js
    

Výše uvedené kroky můžete zopakovat i pro certifikát mytestselfcertsecondary .

Úprava vzorového kódu tak, aby používala certifikáty X.509:

  1. Přejděte do složky azure-iot-device/samples/pnp a otevřete soubor temp_controller_with_thermostats.py v textovém editoru.

  2. Přidejte následující from příkaz pro import funkce X.509:

    from azure.iot.device import X509
    
  3. Upravte první část provision_device funkce následujícím způsobem:

    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 Ve funkci nahraďte řádek, který nastaví symmetric_key proměnnou následujícím kódem:

    x509 = X509(
        cert_file=os.getenv("IOTHUB_DEVICE_X509_CERT"),
        key_file=os.getenv("IOTHUB_DEVICE_X509_KEY"),
    )
    
  5. main Ve funkci nahraďte volání provision_device funkce následujícím kódem:

    registration_result = await provision_device(
        provisioning_host, id_scope, registration_id, x509, model_id
    )
    
  6. main Ve funkci nahraďte volání IoTHubDeviceClient.create_from_symmetric_key funkce následujícím kódem:

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

    Uložte změny.

Spuštění ukázky:

  1. Do prostředí prostředí přidejte následující dvě proměnné prostředí. Ujistěte se, že zadáte úplnou cestu k souborům PEM a použijete správný oddělovač cest pro váš operační systém:

    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

    Ostatní požadované proměnné prostředí nastavíte po dokončení vytvoření a připojení klientské aplikace k kurzu aplikace Azure IoT Central.

  2. Spusťte skript a ověřte, že zařízení úspěšně zřídí:

    python temp_controller_with_thermostats.py
    

Výše uvedené kroky můžete zopakovat i pro certifikát mytestselfcertsecondary .

Připojení zařízení IoT Edge

V této části se předpokládá, že k připojení zařízení IoT Edge používáte skupinovou registraci. Postupujte podle kroků v předchozích částech:

Připojení zařízení IoT Edge k IoT Central pomocí certifikátu zařízení X.509:

  • Zkopírujte certifikát zařízení a soubory klíčů do zařízení IoT Edge. V předchozím příkladu registrace skupiny se tyto soubory nazývají sampleDevice01_key.pem a sampleDevice01_cert.pem.

  • Na zařízení IoT Edge upravte provisioning oddíl v konfiguračním souboru /etc/aziot/config.toml následujícím způsobem:

    # 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

    Pro tuto registration_idhodnotu není nutné přidat hodnotu . IoT Edge může použít hodnotu CN z certifikátu X.509.

  • Spuštěním následujícího příkazu restartujte modul runtime IoT Edge:

    sudo iotedge config apply
    

Další informace najdete v tématu Vytváření a zřizování zařízení IoT Edge ve velkém měřítku v Linuxu pomocí certifikátů X.509.

Připojení podřízeného zařízení do IoT Edge

IoT Edge používá certifikáty X.509 k zabezpečení připojení mezi podřízenými zařízeními a zařízením IoT Edge fungujícím jako transparentní brána. Další informace o konfiguraci tohoto scénáře najdete v tématu Připojení podřízeného zařízení do brány Azure IoT Edge.

Vrácení certifikátů zařízení X.509

Během životního cyklu aplikace IoT Central možná budete muset vrátit certifikáty X.509. Příklad:

  • Pokud dojde k porušení zabezpečení, jsou kumulativní certifikáty osvědčeným postupem zabezpečení, který pomáhá zabezpečit systém.
  • Certifikáty X.509 mají data vypršení platnosti. Frekvence, ve které certifikáty zahrnete, závisí na potřebách zabezpečení vašeho řešení. Zákazníci s řešeními, která zahrnují vysoce citlivá data, můžou denně vyvádět certifikáty, zatímco ostatní každý pár let zahrnou certifikáty.

Pro nepřerušované připojení vám IoT Central umožňuje nakonfigurovat primární a sekundární certifikáty X.509. Pokud primární a sekundární certifikáty mají různá data vypršení platnosti, můžete certifikát s vypršenou platností vrátit, zatímco se zařízení budou dál připojovat k jinému certifikátu.

Další informace najdete v tématu Předpokládat metodologii porušení zabezpečení.

Tato část popisuje, jak v IoT Central zavádět certifikáty. Když v IoT Central zahrnete certifikát, musíte do zařízení zkopírovat také nový certifikát zařízení.

Získání nových certifikátů X.509

Získejte nové certifikáty X.509 od poskytovatele certifikátů. Vlastní certifikáty X.509 můžete vytvořit pomocí nástroje, jako je OpenSSL. Tento přístup je užitečný pro testování certifikátů X.509, ale poskytuje několik záruk zabezpečení. Tento přístup použijte pouze k testování, pokud nejste připraveni jednat jako váš vlastní poskytovatel certifikační autority.

Skupiny registrací a porušení zabezpečení

Pokud chcete aktualizovat skupinovou registraci v reakci na porušení zabezpečení, měli byste aktuální certifikát okamžitě aktualizovat pomocí následujícího přístupu. Pokud dojde k ohrožení zabezpečení obou certifikátů, proveďte tyto kroky pro primární a sekundární certifikáty:

  1. V levém podokně přejděte na Oprávnění a vyberte skupiny připojení zařízení.

  2. V seznamu v části Skupiny registrací vyberte název skupiny.

  3. U aktualizace certifikátu vyberte Spravovat primární nebo Spravovat sekundární.

  4. Přidejte a ověřte kořenový certifikát X.509 ve skupině registrací.

Jednotlivé registrace a porušení zabezpečení

Pokud certifikáty v reakci na porušení zabezpečení děláte, aktualizujte aktuální certifikát okamžitě následujícím postupem. Pokud dojde k ohrožení zabezpečení primárního a sekundárního certifikátu, proveďte tyto kroky:

  1. Vyberte Zařízení a vyberte zařízení.

  2. Vyberte Připojení a jako jednotlivou registraci vyberte metodu připojení.

  3. Jako mechanismus vyberte certifikáty (X.509 ).

  4. Pokud chcete aktualizovat certifikát, vyberte ikonu složky a vyberte nový certifikát, který se má nahrát pro položku registrace. Zvolte Uložit.

Skupiny registrací a vypršení platnosti certifikátu

Pokud chcete zpracovat vypršení platnosti certifikátu, použijte následující přístup k okamžité aktualizaci aktuálního certifikátu:

  1. V levém podokně přejděte na Oprávnění a vyberte skupiny připojení zařízení.

  2. V seznamu v části Skupiny registrací vyberte název skupiny.

  3. V případě aktualizace certifikátu vyberte Spravovat primární.

  4. Přidejte a ověřte kořenový certifikát X.509 ve skupině registrací.

  5. Po vypršení platnosti sekundárního certifikátu se vraťte a aktualizujte sekundární certifikát.

Jednotlivé registrace a vypršení platnosti certifikátu

Pokud provádíte kumulativní certifikáty pro zpracování vypršení platnosti certifikátů, měli byste použít konfiguraci sekundárního certifikátu následujícím způsobem, abyste snížili prostoje zařízení, která se pokoušejí zřídit ve vaší aplikaci.

Pokud sekundární certifikát blíží vypršení platnosti a je potřeba ho vrátit, můžete ho otočit pomocí primární konfigurace. Rotace mezi primárními a sekundárními certifikáty tímto způsobem snižuje výpadky zařízení, která se pokoušejí zřídit ve vaší aplikaci.

  1. Vyberte Zařízení a vyberte zařízení.

  2. Vyberte Připojení a jako jednotlivou registraci vyberte metodu připojení.

  3. Jako mechanismus vyberte certifikáty (X.509 ).

  4. Pro aktualizaci sekundárního certifikátu vyberte ikonu složky a vyberte nový certifikát, který se má nahrát pro položku registrace. Zvolte Uložit.

  5. Po vypršení platnosti primárního certifikátu se vraťte a aktualizujte primární certifikát.