Tutorial: Bereitstellen mehrerer X.509-Geräte mit Registrierungsgruppen

In diesem Tutorial wird beschrieben, wie Sie Gruppen mit IoT-Geräten bereitstellen, bei denen X.509-Zertifikate für die Authentifizierung verwendet werden. Beispielgerätecode aus dem Azure IoT SDK wird auf Ihrem Entwicklungscomputer ausgeführt, um die Bereitstellung von X.509-Geräten zu simulieren. Auf realen Geräten wird der Gerätecode auf dem IoT-Gerät bereitgestellt und ausgeführt.

In Azure IoT Hub Device Provisioning Service werden zwei Registrierungsarten für Bereitstellungsgeräte unterstützt:

  • Registrierungsgruppen: Für die Registrierung mehrerer verbundener Geräte In diesem Tutorial wird die Bereitstellung mit Registrierungsgruppen veranschaulicht.
  • Individuelle Registrierung: Für die Registrierung eines einzelnen Geräts

Der Azure IoT Hub Device Provisioning Service unterstützt drei Arten der Authentifizierung für Bereitstellungsgeräte:

  • X.509-Zertifikate – In diesem Tutorial wird der X.509-Zertifikatnachweis veranschaulicht
  • TPM (Trusted Platform Module)
  • Symmetrische Schlüssel

In Produktionsszenarien wird ein Hardwaresicherheitsmodul (HSM) für die sichere, hardwarebasierte Speicherung von Gerätegeheimnissen verwendet. Ein HSM kann mit einem symmetrischen Schlüssel, X.509-Zertifikat oder TPM-Nachweis verwendet werden, um die sichere Speicherung für Geheimnisse zu ermöglichen. Die hardwarebasierte Speicherung von Gerätegeheimnissen wird dringend empfohlen, um zum Schutz vertraulicher Informationen (etwa des privaten Schlüssels Ihres Gerätezertifikats) beizutragen.

In diesem Tutorial führen Sie Folgendes durch:

  • Erstellen einer Zertifikatvertrauenskette zum Organisieren einer Gruppe von Geräten mit X.509-Zertifikaten
  • Erstellen einer neuen Gruppenregistrierung, für die die Zertifikatkette verwendet wird
  • Einrichten der Entwicklungsumgebung
  • Stellen Sie Geräte unter Verwendung der Zertifikatkette mithilfe von Beispielcode im Azure IoT-Geräte-SDK bereit.

Voraussetzungen

Die folgenden Voraussetzungen gelten für eine Windows-Entwicklungsumgebung, die zum Simulieren der Geräte verwendet wird. Informationen zu Linux oder macOS finden Sie in der SDK-Dokumentation im entsprechenden Abschnitt unter Vorbereiten Ihrer Entwicklungsumgebung.

  • Installieren Sie Visual Studio 2022 mit der aktivierten Workload Desktopentwicklung mit C++. Visual Studio 2015, Visual Studio 2017 und Visual Studio 2019 werden ebenfalls unterstützt.

  • Installieren Sie das neueste CMake-Buildsystem. Überprüfen Sie unbedingt die Option, mit der die ausführbare Datei „CMake“ Ihrem Pfad hinzugefügt wird.

    Wichtig

    Vergewissern Sie sich vor Beginn der Installation von CMake, dass die erforderlichen Visual Studio-Komponenten (Visual Studio und die Workload „Desktopentwicklung mit C++“) auf dem Computer installiert sind. Sobald die Voraussetzungen erfüllt sind und der Download überprüft wurde, installieren Sie das CMake-Buildsystem. Beachten Sie auch, dass ältere Versionen des CMake-Buildsystems die in diesem Tutorial verwendete Projektmappendatei nicht generieren können. Stellen Sie sicher, dass Sie die neueste Version von CMake verwenden.

Die folgenden Voraussetzungen gelten für eine Windows-Entwicklungsumgebung. Informationen zu Linux oder macOS finden Sie in der SDK-Dokumentation im entsprechenden Abschnitt unter Vorbereiten Ihrer Entwicklungsumgebung.

  • Installieren Sie das .NET SDK 6.0 oder höher auf Ihrem Windows-Computer. Sie können den folgenden Befehl ausführen, um Ihre Version zu überprüfen:

    dotnet --info
    

Die folgenden Voraussetzungen gelten für eine Windows-Entwicklungsumgebung. Informationen zu Linux oder macOS finden Sie in der SDK-Dokumentation im entsprechenden Abschnitt unter Vorbereiten Ihrer Entwicklungsumgebung.

Die folgenden Voraussetzungen gelten für eine Windows-Entwicklungsumgebung.

Die folgenden Voraussetzungen gelten für eine Windows-Entwicklungsumgebung. Informationen zu Linux oder macOS finden Sie in der SDK-Dokumentation im entsprechenden Abschnitt unter Vorbereiten Ihrer Entwicklungsumgebung.

  • Installieren Sie die aktuelle Version von Git. Stellen Sie sicher, dass Git den Umgebungsvariablen hinzugefügt wurde, auf die das Befehlsfenster Zugriff hat.

  • Sorgen Sie dafür, dass OpenSSL auf Ihrem Computer installiert wird. Unter Windows enthält Ihre Git-Installation eine Installation von OpenSSL. Sie können über die Git Bash-Eingabeaufforderung auf OpenSSL zugreifen. Zur Überprüfung, ob OpenSSL installiert ist, öffnen Sie eine Git Bash-Eingabeaufforderung, und geben Sie openssl version ein.

    Hinweis

    Außer wenn Sie mit OpenSSL vertraut sind und es auf Ihrem Windows-Computer bereits installiert haben, empfehlen wir die Verwendung von OpenSSL über die Git Bash-Eingabeaufforderung. Alternativ können Sie den Quellcode herunterladen und OpenSSL erstellen. Wenn Sie OpenSSL erstellen oder herunterladen möchten, sorgen Sie dafür, dass auf die OpenSSL-Binärdatei in Ihrem Pfad zugegriffen werden kann und dass die Umgebungsvariable OPENSSL_CNF auf den Pfad Ihrer Datei openssl.cnf festgelegt wird.

Vorbereiten Ihrer Entwicklungsumgebung

In diesem Abschnitt bereiten Sie eine Entwicklungsumgebung vor, die zum Erstellen des Azure IoT C SDK verwendet wird. Das SDK enthält Beispielcode und Tools für die Gerätebereitstellung mit DPS.

  1. Öffnen Sie einen Webbrowser, und wechseln Sie zur Releaseseite für das Azure IoT C SDK.

  2. Kopieren Sie den Tagnamen für das aktuelle Release des Azure IoT C SDK, z. B.: lts_03_2024.

  3. Öffnen Sie eine Windows-Eingabeaufforderung und führen Sie die folgenden Befehle zum Klonen des aktuellen Releases des GitHub-Repositorys Azure IoT-Geräte-SDK für C aus. Ersetzen Sie <release-tag> durch das Tag, das Sie im vorherigen Schritt kopiert haben.

    git clone -b <release-tag> https://github.com/Azure/azure-iot-sdk-c.git
    cd azure-iot-sdk-c
    git submodule update --init
    

    Dieser Vorgang kann mehrere Minuten dauern.

  4. Wenn der Vorgang abgeschlossen ist, führen Sie die folgenden Befehle aus dem Verzeichnis azure-iot-sdk-c aus:

    mkdir cmake
    cd cmake
    
  5. Das Codebeispiel verwendet ein X.509-Zertifikat für den Nachweis mittels X.509-Authentifizierung. Erstellen Sie mithilfe des folgenden Befehls eine spezifische SDK-Version für Ihre Entwicklungsplattform, die den Gerätebereitstellungsclient enthält. Im cmake-Verzeichnis wird eine Visual Studio-Projektmappe für das simulierte Gerät generiert.

    Ersetzen Sie <path durch den absoluten Pfad zum C SDK, das Sie geklont haben.

    cmake -Duse_prov_client:BOOL=ON -Dhsm_custom_lib=c:/<path>/azure-iot-sdk-c/cmake/provisioning_client/samples/custom_hsm_example/Debug/custom_hsm_example.lib ..
    

    Tipp

    Falls cmake Ihren C++-Compiler nicht findet, treten beim Ausführen des obigen Befehls unter Umständen Buildfehler auf. Führen Sie den Befehl in diesem Fall an der Visual Studio-Eingabeaufforderung aus.

  6. Nach erfolgreicher Erstellung ähneln die letzten Ausgabezeilen der folgenden Ausgabe:

    cmake -Duse_prov_client:BOOL=ON -Dhsm_custom_lib=c:/azure-iot-sdk-c/cmake/provisioning_client/samples/custom_hsm_example/Debug/custom_hsm_example.lib ..
    -- Building for: Visual Studio 17 2022
    -- Selecting Windows SDK version 10.0.19041.0 to target Windows 10.0.22000.
    -- The C compiler identification is MSVC 19.32.31329.0
    -- The CXX compiler identification is MSVC 19.32.31329.0
    
    ...
    
    -- Configuring done
    -- Generating done
    -- Build files have been written to: C:/azure-iot-sdk-c/cmake
    

Öffnen Sie eine Windows-Eingabeaufforderung und klonen Sie das GitHub-Repository mit dem Azure IoT SDK für C# mithilfe des folgenden Befehls:

git clone https://github.com/Azure/azure-iot-sdk-csharp.git

Öffnen Sie eine Windows-Eingabeaufforderung und klonen Sie das GitHub-Repository mit dem Azure IoT SDK für Node.js mithilfe des folgenden Befehls:

git clone https://github.com/Azure/azure-iot-sdk-node.git

Öffnen Sie eine Windows-Eingabeaufforderung und klonen Sie das GitHub-Repository Azure IoT-Geräte-SDK für Python mithilfe des folgenden Befehls:

git clone -b v2 https://github.com/Azure/azure-iot-sdk-python.git --recursive

Hinweis

Die in diesem Tutorial verwendeten Beispiele befinden sich im v2-Branch des Repositorys „azure-iot-sdk-python“. V3 des Python SDK ist für die Verwendung in der Betaversion verfügbar.

  1. Öffnen Sie eine Windows-Eingabeaufforderung und klonen Sie das GitHub-Repository mit den Azure IoT-Beispielen für Java mithilfe des folgenden Befehls:

    git clone https://github.com/Azure/azure-iot-sdk-java.git --recursive
    
  2. Navigieren Sie zum Stammverzeichnis azure-iot-sdk-java, und erstellen Sie das Projekt, um alle erforderlichen Pakete herunterzuladen.

    cd azure-iot-sdk-java
    mvn install -DskipTests=true
    

Erstellen einer X.509-Zertifikatkette

In diesem Abschnitt generieren Sie zum Testen der einzelnen Geräte für dieses Tutorial eine X.509-Zertifikatkette mit drei Zertifikaten. Die Zertifikate verfügen über die im Folgenden beschriebene Hierarchie.

Diagram that shows relationship of root C A, intermediate C A, and device certificates.

Stammzertifikat: Sie laden das Stammzertifikat mit DPS hoch und überprüfen es. Anhand dieser Überprüfung kann DPS dieses Zertifikat als vertrauenswürdig einstufen und die damit signierten Zertifikate verifizieren.

Zwischenzertifikat: Zwischenzertifikate werden häufig verwendet, um Geräte logisch nach Produktlinien, Unternehmensbereichen oder anderen Kriterien zu gruppieren. Dieses Tutorial verwendet eine Zertifikatkette mit einem Zwischenzertifikat, aber in einem Produktionsszenario haben Sie möglicherweise mehrere. Das Zwischenzertifikat wird vom Stammzertifikat signiert. Dieses Zertifikat wird auch in der in DPS erstellten Registrierungsgruppe verwendet. Diese Konfiguration ermöglicht die Verwaltung einer gesamten Gruppe mit Geräten, für die die Gerätezertifikate mit demselben Zwischenzertifikat signiert werden.

Gerätezertifikate: Ein Gerätezertifikat (manchmal auch Blattzertifikat genannt) wird vom Zwischenzertifikat signiert und zusammen mit dem privaten Schlüssel auf dem Gerät gespeichert. Im Idealfall werden diese vertraulichen Elemente sicher mit einem HSM gespeichert. Mehrere Gerätezertifikate können vom gleichen Zwischenzertifikat signiert werden. Jedes Gerät gibt sein Zertifikat und seinen privaten Schlüssel zusammen mit der Zertifikatkette an, wenn versucht wird, die Bereitstellung durchzuführen.

Weitere Informationen zu Zertifikaten finden Sie unter X.509-Zertifikatsnachweis.

Einrichten der X.509 OpenSSL-Umgebung

In diesem Abschnitt erstellen Sie die Openssl-Konfigurationsdateien, die Verzeichnisstruktur und andere Dateien, die von den Openssl-Befehlen verwendet werden.

  1. Öffnen Sie eine Git Bash-Eingabeaufforderung, und navigieren Sie zu einem Ordner, in dem Sie die X.509-Zertifikate und Schlüssel für dieses Tutorial generieren möchten.

  2. Erstellen Sie eine OpenSSL-Konfigurationsdatei mit dem Namen openssl_root_ca.cnf für Ihr Stammzertifizierungsstellen-Zertifikat. OpenSSL-Konfigurationsdateien enthalten Richtlinien und Definitionen, die von OpenSSL-Befehlen verwendet werden. Kopieren Sie den folgenden Text, und fügen Sie ihn in die Datei openssl_root_ca.cnf ein:

    # OpenSSL root CA configuration file.
    
    [ ca ]
    default_ca = CA_default
    
    [ CA_default ]
    # Directory and file locations.
    dir               = .
    certs             = $dir/certs
    crl_dir           = $dir/crl
    new_certs_dir     = $dir/newcerts
    database          = $dir/index.txt
    serial            = $dir/serial
    RANDFILE          = $dir/private/.rand
    
    # The root key and root certificate.
    private_key       = $dir/private/azure-iot-test-only.root.ca.key.pem
    certificate       = $dir/certs/azure-iot-test-only.root.ca.cert.pem
    
    # For certificate revocation lists.
    crlnumber         = $dir/crlnumber
    crl               = $dir/crl/azure-iot-test-only.intermediate.crl.pem
    crl_extensions    = crl_ext
    default_crl_days  = 30
    
    # SHA-1 is deprecated, so use SHA-2 instead.
    default_md        = sha256
    
    name_opt          = ca_default
    cert_opt          = ca_default
    default_days      = 375
    preserve          = no
    policy            = policy_loose
    
    [ policy_strict ]
    # The root CA should only sign intermediate certificates that match.
    countryName             = optional
    stateOrProvinceName     = optional
    organizationName        = optional
    organizationalUnitName  = optional
    commonName              = supplied
    emailAddress            = optional
    
    [ policy_loose ]
    # Allow the intermediate CA to sign a more diverse range of certificates.
    countryName             = optional
    stateOrProvinceName     = optional
    localityName            = optional
    organizationName        = optional
    organizationalUnitName  = optional
    commonName              = supplied
    emailAddress            = optional
    
    [ req ]
    default_bits        = 2048
    distinguished_name  = req_distinguished_name
    string_mask         = utf8only
    
    # SHA-1 is deprecated, so use SHA-2 instead.
    default_md          = sha256
    
    # Extension to add when the -x509 option is used.
    x509_extensions     = v3_ca
    
    [ req_distinguished_name ]
    # See <https://en.wikipedia.org/wiki/Certificate_signing_request>.
    countryName                     = Country Name (2 letter code)
    stateOrProvinceName             = State or Province Name
    localityName                    = Locality Name
    0.organizationName              = Organization Name
    organizationalUnitName          = Organizational Unit Name
    commonName                      = Common Name
    emailAddress                    = Email Address
    
    # Optionally, specify some defaults.
    countryName_default             = US
    stateOrProvinceName_default     = WA
    localityName_default            =
    0.organizationName_default      = My Organization
    organizationalUnitName_default  =
    emailAddress_default            =
    
    [ v3_ca ]
    # Extensions for a typical CA.
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:always,issuer
    basicConstraints = critical, CA:true
    keyUsage = critical, digitalSignature, cRLSign, keyCertSign
    
    [ v3_intermediate_ca ]
    # Extensions for a typical intermediate CA.
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:always,issuer
    basicConstraints = critical, CA:true
    keyUsage = critical, digitalSignature, cRLSign, keyCertSign
    
    [ usr_cert ]
    # Extensions for client certificates.
    basicConstraints = CA:FALSE
    nsComment = "OpenSSL Generated Client Certificate"
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer
    keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment
    extendedKeyUsage = clientAuth
    
    [ server_cert ]
    # Extensions for server certificates.
    basicConstraints = CA:FALSE
    nsComment = "OpenSSL Generated Server Certificate"
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer:always
    keyUsage = critical, digitalSignature, keyEncipherment
    extendedKeyUsage = serverAuth
    
    [ crl_ext ]
    # Extension for CRLs.
    authorityKeyIdentifier=keyid:always
    
    [ ocsp ]
    # Extension for OCSP signing certificates.
    basicConstraints = CA:FALSE
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer
    keyUsage = critical, digitalSignature
    extendedKeyUsage = critical, OCSPSigning
    
  3. Erstellen Sie eine OpenSSL-Konfigurationsdatei mit dem Namen openssl_device_intermediate_ca.cnf, die für Zwischen- und Gerätezertifikate verwendet werden soll. Kopieren Sie den folgenden Text, und fügen Sie ihn in die Datei openssl_device_intermediate_ca.cnf ein:

    # OpenSSL root CA configuration file.
    
    [ ca ]
    default_ca = CA_default
    
    [ CA_default ]
    # Directory and file locations.
    dir               = .
    certs             = $dir/certs
    crl_dir           = $dir/crl
    new_certs_dir     = $dir/newcerts
    database          = $dir/index.txt
    serial            = $dir/serial
    RANDFILE          = $dir/private/.rand
    
    # The root key and root certificate.
    private_key       = $dir/private/azure-iot-test-only.intermediate.key.pem
    certificate       = $dir/certs/azure-iot-test-only.intermediate.cert.pem
    
    # For certificate revocation lists.
    crlnumber         = $dir/crlnumber
    crl               = $dir/crl/azure-iot-test-only.intermediate.crl.pem
    crl_extensions    = crl_ext
    default_crl_days  = 30
    
    # SHA-1 is deprecated, so use SHA-2 instead.
    default_md        = sha256
    
    name_opt          = ca_default
    cert_opt          = ca_default
    default_days      = 375
    preserve          = no
    policy            = policy_loose
    
    [ policy_strict ]
    # The root CA should only sign intermediate certificates that match.
    countryName             = optional
    stateOrProvinceName     = optional
    organizationName        = optional
    organizationalUnitName  = optional
    commonName              = supplied
    emailAddress            = optional
    
    [ policy_loose ]
    # Allow the intermediate CA to sign a more diverse range of certificates.
    countryName             = optional
    stateOrProvinceName     = optional
    localityName            = optional
    organizationName        = optional
    organizationalUnitName  = optional
    commonName              = supplied
    emailAddress            = optional
    
    [ req ]
    default_bits        = 2048
    distinguished_name  = req_distinguished_name
    string_mask         = utf8only
    
    # SHA-1 is deprecated, so use SHA-2 instead.
    default_md          = sha256
    
    # Extension to add when the -x509 option is used.
    x509_extensions     = v3_ca
    
    [ req_distinguished_name ]
    # See <https://en.wikipedia.org/wiki/Certificate_signing_request>.
    countryName                     = Country Name (2 letter code)
    stateOrProvinceName             = State or Province Name
    localityName                    = Locality Name
    0.organizationName              = Organization Name
    organizationalUnitName          = Organizational Unit Name
    commonName                      = Common Name
    emailAddress                    = Email Address
    
    # Optionally, specify some defaults.
    countryName_default             = US
    stateOrProvinceName_default     = WA
    localityName_default            =
    0.organizationName_default      = My Organization
    organizationalUnitName_default  =
    emailAddress_default            =
    
    [ v3_ca ]
    # Extensions for a typical CA.
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:always,issuer
    basicConstraints = critical, CA:true
    keyUsage = critical, digitalSignature, cRLSign, keyCertSign
    
    [ v3_intermediate_ca ]
    # Extensions for a typical intermediate CA.
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:always,issuer
    basicConstraints = critical, CA:true
    keyUsage = critical, digitalSignature, cRLSign, keyCertSign
    
    [ usr_cert ]
    # Extensions for client certificates.
    basicConstraints = CA:FALSE
    nsComment = "OpenSSL Generated Client Certificate"
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer
    keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment
    extendedKeyUsage = clientAuth
    
    [ server_cert ]
    # Extensions for server certificates.
    basicConstraints = CA:FALSE
    nsComment = "OpenSSL Generated Server Certificate"
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer:always
    keyUsage = critical, digitalSignature, keyEncipherment
    extendedKeyUsage = serverAuth
    
    [ crl_ext ]
    # Extension for CRLs.
    authorityKeyIdentifier=keyid:always
    
    [ ocsp ]
    # Extension for OCSP signing certificates.
    basicConstraints = CA:FALSE
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer
    keyUsage = critical, digitalSignature
    extendedKeyUsage = critical, OCSPSigning
    
  4. Erstellen Sie die Verzeichnisstruktur, die Datenbankdatei index.txt und die Seriennummerndatei serial, die von OpenSSL-Befehlen in diesem Tutorial verwendet werden:

    mkdir certs csr newcerts private
    touch index.txt
    openssl rand -hex 16 > serial
    

Erstellen eines Stammzertifikats der Zertifizierungsstelle

Führen Sie die folgenden Befehle aus, um einen privaten Stammschlüssel der Zertifizierungsstelle und ein Stammzertifikat der Zertifizierungsstelle zu erstellen. Sie verwenden dieses Zertifikat und den Schlüssel, um Ihr Zwischenzertifikat zu signieren.

  1. Erstellen Sie in Ihrem Git Bash-Terminal einen privaten Stammschlüssel der Zertifizierungsstelle:

    openssl genrsa -aes256 -passout pass:1234 -out ./private/azure-iot-test-only.root.ca.key.pem 4096
    
  2. Erstellen Sie ein Stammzertifikat der Zertifizierungsstelle:

    openssl req -new -x509 -config ./openssl_root_ca.cnf -passin pass:1234 -key ./private/azure-iot-test-only.root.ca.key.pem -subj '//CN=Azure IoT Hub CA Cert Test Only' -days 30 -sha256 -extensions v3_ca -out ./certs/azure-iot-test-only.root.ca.cert.pem
    

    Wichtig

    Der zusätzliche Schrägstrich für den Antragstellernamen (//CN=Azure IoT Hub CA Cert Test Only) ist nur erforderlich, um die Zeichenfolge für Git auf Windows-Plattformen mit einem Escapezeichen zu versehen. Geben Sie auf Linux-Plattformen den Antragstellernamen nur mit einem Schrägstrich (/CN=Azure IoT Hub CA Cert Test Only) an.

  3. Untersuchen Sie das Stammzertifizierungsstellen-Zertifikat:

    openssl x509 -noout -text -in ./certs/azure-iot-test-only.root.ca.cert.pem
    

    Beachten Sie, dass der Aussteller und der Antragsteller beide die Stamm-ZS sind.

    Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number:
                1d:93:13:0e:54:07:95:1d:8c:57:4f:12:14:b9:5e:5f:15:c3:a9:d4
            Signature Algorithm: sha256WithRSAEncryption
            Issuer: CN = Azure IoT Hub CA Cert Test Only
            Validity
                Not Before: Jun 20 22:52:23 2022 GMT
                Not After : Jul 20 22:52:23 2022 GMT
            Subject: CN = Azure IoT Hub CA Cert Test Only
            Subject Public Key Info:
                Public Key Algorithm: rsaEncryption
                    RSA Public-Key: (4096 bit)
    

Erstellen Sie ein ZS-Zertifikat

Führen Sie die folgenden Befehle aus, um einen privaten Schlüssel der Zwischen-ZS und ein Zertifikat der Zwischen-ZS zu erstellen. Sie verwenden dieses Zertifikat und den Schlüssel, um Ihre Gerätezertifikate zu signieren.

  1. Erstellen Sie in Ihrem Git Bash-Terminal einen privaten Zwischenstammschlüssel der Zertifizierungsstelle:

    openssl genrsa -aes256 -passout pass:1234 -out ./private/azure-iot-test-only.intermediate.key.pem 4096
    
  2. Erstellen Sie eine Signaturanforderung des Zertifikats der Zwischen-ZS (CSR):

    openssl req -new -sha256 -passin pass:1234 -config ./openssl_device_intermediate_ca.cnf -subj '//CN=Azure IoT Hub Intermediate Cert Test Only' -key ./private/azure-iot-test-only.intermediate.key.pem -out ./csr/azure-iot-test-only.intermediate.csr.pem
    

    Wichtig

    Der zusätzliche Schrägstrich für den Antragstellernamen (//CN=Azure IoT Hub Intermediate Cert Test Only) ist nur erforderlich, um die Zeichenfolge für Git auf Windows-Plattformen mit einem Escapezeichen zu versehen. Geben Sie auf Linux-Plattformen den Antragstellernamen nur mit einem einzigen Schrägstrich (/CN=Azure IoT Hub Intermediate Cert Test Only) an.

  3. Erstellen Sie das Zwischenzertifikat mit dem Stamm-ZS-Zertifikat

    openssl ca -batch -config ./openssl_root_ca.cnf -passin pass:1234 -extensions v3_intermediate_ca -days 30 -notext -md sha256 -in ./csr/azure-iot-test-only.intermediate.csr.pem -out ./certs/azure-iot-test-only.intermediate.cert.pem
    
  4. Untersuchen Sie das Zwischen-ZS-Zertifikat:

    openssl x509 -noout -text -in ./certs/azure-iot-test-only.intermediate.cert.pem
    

    Beachten Sie, dass der Aussteller die Stamm-ZS und der Antragsteller die Zwischen-ZS ist.

    Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number:
                d9:55:87:57:41:c8:4c:47:6c:ee:ba:83:5d:ae:db:39
            Signature Algorithm: sha256WithRSAEncryption
            Issuer: CN = Azure IoT Hub CA Cert Test Only
            Validity
                Not Before: Jun 20 22:54:01 2022 GMT
                Not After : Jul 20 22:54:01 2022 GMT
            Subject: CN = Azure IoT Hub Intermediate Cert Test Only
            Subject Public Key Info:
                Public Key Algorithm: rsaEncryption
                    RSA Public-Key: (4096 bit)
    

Erstellen von Gerätezertifikaten

In diesem Abschnitt erstellen Sie zwei Gerätezertifikate und ihre vollständigen Kettenzertifikate. Das vollständige Kettenzertifikat enthält das Gerätezertifikat, das Zertifikat der Zwischen-ZS und das Zertifikat der Stamm-ZS. Das Gerät muss sein vollständiges Kettenzertifikat präsentieren, wenn es sich beim DPS registriert.

  1. Erstellen Sie den ersten privaten Geräteschlüssel.

    openssl genrsa -out ./private/device-01.key.pem 4096
    
  2. Erstellen Sie die CSR des Gerätezertifikats.

    Der allgemeine Name (CN) des Antragstellers des Gerätezertifikats muss auf die Registrierungs-ID festgelegt werden, die Ihr Gerät zum Registrieren mit DPS verwendet. Die Registrierungs-ID ist eine von der Groß- und Kleinschreibung unabhängige Zeichenfolge aus alphanumerischen Zeichen und Sonderzeichen: '-', '.', '_', ':'. Das letzte Zeichen muss alphanumerisch oder ein Bindestrich ('-') sein. Der allgemeine Name muss diesem Format entsprechen. DPS unterstützt Registrierungs-IDs mit einer Länge von bis zu 128 Zeichen; die maximale Länge des allgemeinen Namens des Antragstellers in einem X.509-Zertifikat beträgt jedoch 64 Zeichen. Die Registrierungs-ID ist daher auf 64 Zeichen beschränkt, wenn Sie X.509-Zertifikate verwenden. Bei Gruppenregistrierungen wird die Registrierungs-ID auch als Geräte-ID im IoT Hub verwendet.

    Der allgemeine Name des Antragstellers wird mithilfe des Parameters -subj festgelegt. Im folgenden Befehl wird der allgemeine Name auf device-01 festgelegt.

    openssl req -config ./openssl_device_intermediate_ca.cnf -key ./private/device-01.key.pem -subj '//CN=device-01' -new -sha256 -out ./csr/device-01.csr.pem
    

    Wichtig

    Der zusätzliche Schrägstrich für den Antragstellernamen (//CN=device-01) ist nur erforderlich, um die Zeichenfolge für Git auf Windows-Plattformen mit einem Escapezeichen zu versehen. Geben Sie auf Linux-Plattformen den Antragstellernamen nur mit einem einzigen Schrägstrich (/CN=device-01) an.

  3. Signieren Sie das Gerätezertifikat.

    openssl ca -batch -config ./openssl_device_intermediate_ca.cnf -passin pass:1234 -extensions usr_cert -days 30 -notext -md sha256 -in ./csr/device-01.csr.pem -out ./certs/device-01.cert.pem
    
  4. Untersuchen Sie das Gerätezertifikat:

    openssl x509 -noout -text -in ./certs/device-01.cert.pem
    

    Beachten Sie, dass der Aussteller die Zwischen-ZS und der Antragsteller die ID der Geräteregistrierung ist, device-01.

    Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number:
                d9:55:87:57:41:c8:4c:47:6c:ee:ba:83:5d:ae:db:3a
            Signature Algorithm: sha256WithRSAEncryption
            Issuer: CN = Azure IoT Hub Intermediate Cert Test Only
            Validity
                Not Before: Jun 20 22:55:39 2022 GMT
                Not After : Jul 20 22:55:39 2022 GMT
            Subject: CN = device-01
            Subject Public Key Info:
                Public Key Algorithm: rsaEncryption
                    RSA Public-Key: (4096 bit)
    
  5. Das Gerät muss die vollständige Zertifikatkette darstellen, wenn es sich mit DPS authentifiziert. Verwenden Sie den folgenden Befehl, um die Zertifikatkette zu erstellen:

    cat ./certs/device-01.cert.pem ./certs/azure-iot-test-only.intermediate.cert.pem ./certs/azure-iot-test-only.root.ca.cert.pem > ./certs/device-01-full-chain.cert.pem
    
  6. Öffnen Sie die Zertifikatkettendatei ./certs/new-device-01-full-chain.cert.pem in einem Text-Editor, um sie zu untersuchen. Der Text der Zertifikatkette enthält die gesamte Kette mit allen drei Zertifikaten. Sie verwenden diese Zertifikatkette später in diesem Tutorial, um device-01 bereitzustellen.

    Der Text für die gesamte Kette hat das folgende Format:

    -----BEGIN CERTIFICATE-----
        <Text for the device certificate includes public key>
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
        <Text for the intermediate certificate includes public key>
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
        <Text for the root certificate includes public key>
    -----END CERTIFICATE-----
    
  7. Zum Erstellen des privaten Schlüssels, des X.509-Zertifikats und des vollständigen Kettenzertifikats für das zweite Gerät kopieren Sie dieses Skript und fügen es in die Git Bash-Eingabeaufforderung ein. Um Zertifikate für weitere Geräte zu erstellen, können Sie die am Anfang des Skripts deklarierte Variable registration_id ändern.

    registration_id=device-02
    echo $registration_id
    openssl genrsa -out ./private/${registration_id}.key.pem 4096
    openssl req -config ./openssl_device_intermediate_ca.cnf -key ./private/${registration_id}.key.pem -subj "//CN=$registration_id" -new -sha256 -out ./csr/${registration_id}.csr.pem
    openssl ca -batch -config ./openssl_device_intermediate_ca.cnf -passin pass:1234 -extensions usr_cert -days 30 -notext -md sha256 -in ./csr/${registration_id}.csr.pem -out ./certs/${registration_id}.cert.pem
    cat ./certs/${registration_id}.cert.pem ./certs/azure-iot-test-only.intermediate.cert.pem ./certs/azure-iot-test-only.root.ca.cert.pem > ./certs/${registration_id}-full-chain.cert.pem
    

    Wichtig

    Der zusätzliche Schrägstrich für den Antragstellernamen (//CN=$registration_id) ist nur erforderlich, um die Zeichenfolge für Git auf Windows-Plattformen mit einem Escapezeichen zu versehen. Geben Sie auf Linux-Plattformen den Antragstellernamen nur mit einem einzigen Schrägstrich (/CN=$registration_id) an.

    Hinweis

    Dieses Skript verwendet die Registrierungs-ID als Basisdateinamen für den privaten Schlüssel und die Zertifikatsdateien. Wenn Ihre Registrierungs-ID Zeichen enthält, die keine gültigen Dateinamenzeichen sind, müssen Sie das Skript entsprechend ändern.

    Warnung

    Der Text für die Zertifikate enthält nur Informationen zum öffentlichen Schlüssel.

    Das Gerät muss aber auch über Zugriff auf den privaten Schlüssel für das Gerätezertifikat verfügen. Dies ist erforderlich, weil das Gerät zur Laufzeit, wenn die Bereitstellung durchgeführt werden soll, diesen Schlüssel für die Verifizierung verwenden muss. Die Vertraulichkeit dieses Schlüssels ist einer der Hauptgründe, warum wir Ihnen empfehlen, zum Schützen von privaten Schlüsseln für ein echtes HSM hardwarebasierten Speicher zu verwenden.

Sie verwenden die folgenden Dateien im restlichen Tutorial:

Zertifikat Datei BESCHREIBUNG
Zertifikat der Stammzertifizierungsstelle. certs/azure-iot-test-only.root.ca.cert.pem In DPS hochgeladen und überprüft.
Zertifikat der Zwischenzertifizierungsstelle certs/azure-iot-test-only.intermediate.cert.pem Wird verwendet, um eine Registrierungsgruppe in DPS zu erstellen.
Privater Schlüssel device-01 private/device-01.key.pem Wird vom Gerät verwendet, um den Besitz des Gerätezertifikats während der Authentifizierung mit DPS zu überprüfen.
Vollständiges Kettenzertifikat device-01 certs/device-01-full-chain.cert.pem Wird vom Gerät angegeben, um sich mit DPS zu authentifizieren und zu registrieren.
Privater Schlüssel device-02 private/device-02.key.pem Wird vom Gerät verwendet, um den Besitz des Gerätezertifikats während der Authentifizierung mit DPS zu überprüfen.
Vollständiges Kettenzertifikat device-02 certs/device-02-full-chain.cert.pem Wird vom Gerät angegeben, um sich mit DPS zu authentifizieren und zu registrieren.

Überprüfen der Eigentümerschaft des Stammzertifikats

Damit DPS die Zertifikatkette des Geräts während der Authentifizierung überprüfen kann, müssen Sie das Zertifikat der Stammzertifizierungsstelle hochladen und dessen Besitz verifizieren. Führen Sie die folgenden Schritte aus, um das ZS-Stammzertifikat ihrer DPS-Instanz hinzuzufügen:

  1. Navigieren Sie zu Ihrer Gerätebereitstellungsdienst-Instanz im Azure-Portal.

  2. Öffnen Sie Zertifikate im linken Menü, und wählen Sie dann Hinzufügen aus, um ein neues Zertifikat hinzuzufügen.

  3. Geben Sie einen Anzeigenamen für Ihr Zertifikat ein. Navigieren Sie zum Speicherort der ZS-Stammzertifikatsdatei certs/azure-iot-test-only.root.ca.cert.pem. Wählen Sie die Option Hochladen.

  4. Wählen Sie das Kontrollkästchen Zertifikatstatus beim Hochladen auf „überprüft“ festlegen.

    Screenshot that shows adding the root CA certificate and the set certificate status to verified on upload box selected.

  5. Wählen Sie Speichern.

  6. Stellen Sie sicher, dass Ihr Zertifikat auf der Registerkarte „Zertifikat“ mit dem Status Überprüft angezeigt wird.

    Screenshot that shows the verified root C A certificate in the list of certificates.

Aktualisieren des Zertifikatspeichers auf Windows-basierten Geräten

Auf anderen Geräten als Windows-Geräten können Sie die Zertifikatkette aus dem Code als Zertifikatspeicher übergeben.

Auf Windows-basierten Geräten müssen Sie die Signaturzertifikate (Stamm- und Zwischenzertifikat) einem Windows-Zertifikatspeicher hinzufügen. Andernfalls werden die Signaturzertifikate nicht über einen sicheren Kanal mit Transport Layer Security (TLS) an DPS übermittelt.

Tipp

Sie können anstelle eines sicheren Kanals (Schannel) auch OpenSSL mit dem C SDK verwenden. Weitere Informationen zur Verwendung von OpenSSL finden Sie unter Verwenden von OpenSSL im SDK.

Fügen Sie die Signaturzertifikate dem Zertifikatspeicher auf Windows-basierten Geräten wie folgt hinzu:

  1. Konvertieren Sie in Ihrem Git-Bash-Terminal Ihre Signierzertifikate wie folgt in .pfx.

    Zertifikat der Stammzertifizierungsstelle:

    openssl pkcs12 -inkey ./private/azure-iot-test-only.root.ca.key.pem -in ./certs/azure-iot-test-only.root.ca.cert.pem -export -passin pass:1234 -passout pass:1234 -out ./certs/root.pfx
    

    Zertifikat der Zwischenzertifizierungsstelle:

    openssl pkcs12 -inkey ./private/azure-iot-test-only.intermediate.key.pem -in ./certs/azure-iot-test-only.intermediate.cert.pem -export -passin pass:1234 -passout pass:1234 -out ./certs/intermediate.pfx
    
  2. Klicken Sie mit der rechten Maustaste auf die Windowsschaltfläche Start, und wählen Sie dann Ausführen aus. Geben Sie certmgr.msc ein, und wählen Sie OK, um den Zertifikat-Manager zu starten.

  3. Wählen Sie im Zertifikat-Manager unter Zertifikate > Aktueller BenutzerVertrauenswürdige Stammzertifizierungsstellen. Wählen Sie anschließend im Menü Aktion>Alle Aufgaben>Importieren aus.

  4. Führen Sie die Schritte des Zertifikatimport-Assistenten aus, um root.pfx zu importieren.

    • Suchen Sie nach Personal Information Exchange (.pfx) .
    • Verwenden Sie 1234 als Kennwort.
    • Fügen Sie das Zertifikat in den Zertifikatspeicher Vertrauenswürdige Stammzertifizierungsstellen ein.
  5. Wiederholen Sie diese Schritte des Zertifikat-Managers, um intermediate.pfx zu importieren.

    • Fügen Sie das Zertifikat in den Zertifikatspeicher Zwischenzertifizierungsstellen ein.

Ihre Signaturzertifikate werden auf dem Windows-basierten Gerät jetzt als vertrauenswürdig eingestuft, und die vollständige Kette kann an DPS übermittelt werden.

Erstellen einer Registrierungsgruppe

  1. Melden Sie sich beim Azure-Portal an, und navigieren Sie zur Dienstinstanz für die Gerätebereitstellung.

  2. Wählen Sie im Navigationsmenü im Abschnitt Einstellungen die Option Registrierungen verwalten aus.

  3. Wählen Sie oben auf der Seite Registrierungsgruppe hinzufügen aus.

  4. Geben Sie auf der Registerkarte Registrierung + Bereitstellung der Seite Registrierungsgruppe hinzufügen die folgenden Informationen an, um die Details der Registrierungsgruppe zu konfigurieren:

    Feld Beschreibung
    Nachweis Wählen Sie X.509-Zwischenzertifikate als Nachweismechanismus aus, wenn Sie Zwischenzertifikate hochladen möchten, die nur für diese Registrierungsgruppe verwendet werden sollen, oder wählen Sie In diesen Gerätebereitstellungsdienst hochgeladene X.509-Zertifikate aus, wenn Sie bereits Zwischenzertifikate hochgeladen haben.
    Einstellungen des X.509-Zertifikats Je nach gewählter Nachweismethode können Sie die primären und sekundären Zwischenzertifikate für diese Registrierungsgruppe hochladen oder auswählen.
    Gruppenname Geben Sie einen Namen für die Gerätegruppe an. Beim Namen der Registrierungsgruppe handelt es sich um eine Zeichenfolge (bis zu 128 Zeichen lang) alphanumerischer Zeichen ohne Beachtung der Groß-/Kleinschreibung plus diese Sonderzeichen: '-', '.', '_', ':'. Das letzte Zeichen muss alphanumerisch oder ein Bindestrich ('-') sein.
    Bereitstellungsstatus Aktivieren Sie das Kontrollkästchen Diese Registrierung aktivieren, wenn diese Registrierungsgruppe für die Bereitstellung von Geräten verfügbar sein soll. Deaktivieren Sie dieses Kontrollkästchen, wenn die Gruppe deaktiviert werden soll. Sie können diese Einstellung später ändern.
    Richtlinie für die erneute Bereitstellung Wählen Sie eine Richtlinie für die erneute Bereitstellung aus, die angibt, wie DPS Geräte, die eine erneute Bereitstellung anfordern, behandeln soll. Weitere Informationen finden Sie unter Richtlinie zur erneuten Bereitstellung.

    Screenshot that shows adding an enrollment group for X.509 certificate attestation.

  5. Wählen Sie Weiter: IoT Hubs aus.

  6. Geben Sie auf der Registerkarte IoT-Hubs der Seite Registrierungsgruppe hinzufügen die folgenden Informationen an, um zu bestimmen, für welche IoT-Hubs die Registrierungsgruppe Geräte bereitstellen kann:

    Feld Beschreibung
    Ziel-IoT-Hubs Wählen Sie einen oder mehrere Ihrer verknüpften IoT-Hubs aus, oder fügen Sie einem IoT-Hub einen neuen Link hinzu. Weitere Informationen zum Verknüpfen von IoT-Hubs mit Ihrer DPS-Instanz finden Sie unter Verknüpfen und Verwalten von IoT-Hubs.
    Zuordnungsrichtlinie Wenn Sie mehrere verknüpfte IoT-Hubs ausgewählt haben, wählen Sie aus, wie Sie den verschiedenen Hubs Geräte zuweisen möchten. Weitere Informationen zu Zuordnungsrichtlinien finden Sie unter Verwenden von Zuordnungsrichtlinien.

    Wenn Sie nur einen verknüpften IoT-Hub ausgewählt haben, empfehlen wir die Verwendung der Richtlinie Gleichmäßig gewichtete Verteilung.

    Screenshot that shows connecting IoT hubs to the new enrollment group.

  7. Wählen Sie Weiter: Geräteeinstellungen aus

  8. Geben Sie auf der Registerkarte Geräteeinstellungen der Seite Registrierungsgruppe hinzufügen die folgenden Informationen an, um zu definieren, wie neu bereitgestellte Geräte konfiguriert werden sollen:

    Feld Beschreibung
    IoT Edge Aktivieren Sie IoT Edge auf bereitgestellten Geräten aktivieren, wenn auf allen über diese Gruppe bereitgestellten Geräten Azure IoT Edge ausgeführt wird. Deaktivieren Sie dieses Kontrollkästchen, wenn diese Gruppe nur für IoT Edge-fähige Geräte verwendet werden soll. Entweder sind alle Geräte in einer Gruppe IoT Edge-fähig oder keines.
    Gerätetags Verwenden Sie dieses Textfeld, um alle Tags anzugeben, die Sie auf den Gerätezwillingen der bereitgestellten Geräte anwenden möchten.
    Gewünschte Eigenschaften Verwenden Sie dieses Textfeld, um alle gewünschten Eigenschaften anzugeben, die Sie auf den Gerätezwillingen der bereitgestellten Geräte anwenden möchten.

    Weitere Informationen finden Sie unter Verstehen und Verwenden von Gerätezwillingen in IoT Hub.

  9. Klicken Sie auf Weiter: Überprüfen + erstellen.

  10. Überprüfen Sie auf der Registerkarte Überprüfen + erstellen all Ihre Werte, und wählen Sie dann Erstellen aus.

Vorbereiten und Ausführen des Gerätebereitstellungscodes

In diesem Abschnitt aktualisieren Sie den Beispielcode mit den Informationen zu Ihrer Device Provisioning Service-Instanz. Wenn ein Gerät authentifiziert wurde, wird es einem IoT-Hub zugewiesen, der mit der in diesem Abschnitt konfigurierten Gerätebereitstellungs-Instanz verknüpft ist.

In diesem Abschnitt verwenden Sie Ihre Git Bash-Eingabeaufforderung und die Visual Studio-IDE.

Konfigurieren des Codes für die Bereitstellung des Geräts

In diesem Abschnitt aktualisieren Sie den Beispielcode mit den Informationen zu Ihrer Device Provisioning Service-Instanz.

  1. Navigieren Sie im Azure-Portal zur Registerkarte Übersicht für Ihre Gerätebereitstellungsinstanz, und notieren Sie sich den Wert unter ID-Bereich.

    Screenshot that shows the ID scope on the DPS overview pane.

  2. Starten Sie Visual Studio, und öffnen Sie die neue Projektmappendatei, die im Verzeichnis cmake erstellt wurde, das Sie im Stammverzeichnis des Git-Repositorys „azure-iot-sdk-c“ erstellt haben. Die Projektmappendatei hat den Namen azure_iot_sdks.sln.

  3. Navigieren Sie im Projektmappen-Explorer von Visual Studio zu Provision_Samples > prov_dev_client_sample > Source Files, und öffnen Sie prov_dev_client_sample.c.

  4. Suchen Sie die Konstante id_scope, und ersetzen Sie den Wert durch Ihren ID-Bereich-Wert, den Sie zuvor kopiert haben. Beispiel:

    static const char* id_scope = "0ne00000A0A";
    
  5. Suchen Sie die Definition für die Funktion main() in der gleichen Datei. Stellen Sie sicher, dass die Variable hsm_type auf SECURE_DEVICE_TYPE_X509 festgelegt ist und dass alle anderen hsm_type-Zeilen auskommentiert werden. Zum Beispiel:

    SECURE_DEVICE_TYPE hsm_type;
    //hsm_type = SECURE_DEVICE_TYPE_TPM;
    hsm_type = SECURE_DEVICE_TYPE_X509;
    //hsm_type = SECURE_DEVICE_TYPE_SYMMETRIC_KEY;
    
  6. Speichern Sie die Änderungen.

  7. Klicken Sie mit der rechten Maustaste auf das Projekt prov_dev_client_sample, und wählen Sie Als Startprojekt festlegen aus.

Konfigurieren des Stubcodes für das benutzerdefinierte HSM

Die Details der Interaktion mit sicherem hardwarebasiertem Speicher in der Praxis variieren je nach Gerätehardware. Die Zertifikatketten, die in diesem Tutorial von den simulierten Geräten genutzt werden, sind im Stubcode für das benutzerdefinierte HSM hartcodiert. In einem realen Fall wird die Zertifikatkette auf der eigentlichen HSM-Hardware gespeichert, um eine höhere Sicherheit für vertrauliche Informationen zu erzielen. Anschließend werden Methoden implementiert, die den Stubmethoden dieses Beispiels ähneln, um die Geheimnisse aus dem hardwarebasierten Speicher auszulesen.

HSM-Hardware ist zwar nicht erforderlich, wird aber empfohlen, um vertrauliche Informationen wie den privaten Schlüssel für das Zertifikat zu schützen. Wenn ein tatsächliches HSM durch das Beispiel aufgerufen werden würde, wäre der private Schlüssel nicht im Quellcode vorhanden. Ist der Schlüssel im Quellcode enthalten, wird er für jeden Benutzer verfügbar gemacht, der den Code anzeigen kann. Dieser Schritt wird in diesem Tutorial nur zu Lernzwecken ausgeführt.

So aktualisieren Sie den Stubcode für das benutzerdefinierte HSM zum Simulieren der Identität des Geräts mit der ID device-01:

  1. Navigieren Sie im Projektmappen-Explorer von Visual Studio zu Provision_Samples> custom_hsm_example > Source Files, und öffnen Sie custom_hsm_example.c.

  2. Aktualisieren Sie den Zeichenfolgenwert der Zeichenfolgenkonstante COMMON_NAME mit dem allgemeinen Namen (Common Name), den Sie beim Generieren des Gerätezertifikats verwendet haben.

    static const char* const COMMON_NAME = "device-01";
    
  3. Führen Sie in Ihrem Git Bash-Terminal den folgenden Befehl aus, um die Zeichenfolgenkonstante für Ihr Gerätezertifikat zu generieren:

    sed -e 's/^/"/;$ !s/$/""\\n"/;$ s/$/"/' ./certs/device-01-full-chain.cert.pem
    

    Kopieren Sie die Ausgabe dieses Befehls.

  4. Aktualisieren Sie den Zeichenfolgenwert der Zeichenfolgenkonstante CERTIFICATE mit der Zertifikatkette, die Sie nach dem Erstellen Ihrer Zertifikate in ./certs/device-01-full-chain.cert.pem gespeichert haben. Verwenden Sie den ausgegebenen Zertifikattext aus dem vorherigen Schritt für den konstanten Wert.

    Die Syntax des Zertifikattexts muss dem folgenden Muster (ohne zusätzliche Leerstellen oder eine Analyse durch Visual Studio) entsprechen.

    // <Device/leaf cert>
    // <intermediates>
    // <root>
    static const char* const CERTIFICATE = "-----BEGIN CERTIFICATE-----\n"
    "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n"
        ...
    "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n"
    "-----END CERTIFICATE-----\n"
    "-----BEGIN CERTIFICATE-----\n"
    "MIIFPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQsFADAqMSgwJgYDVQQDDB9BenVy\n"
        ...
    "MTEyMjIxMzAzM1owNDEyMDAGA1UEAwwpQXp1cmUgSW9UIEh1YiBJbnRlcm1lZGlh\n"
    "-----END CERTIFICATE-----\n"
    "-----BEGIN CERTIFICATE-----\n"
    "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n"
        ...
    "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n"
    "-----END CERTIFICATE-----";        
    
  5. Führen Sie in Git Bash den folgenden Befehl aus, um die Zeichenfolgenkonstante für Ihren privaten Geräteschlüssel zu generieren:

    sed -e 's/^/"/;$ !s/$/""\\n"/;$ s/$/"/' ./private/device-01.key.pem
    

    Kopieren Sie die Ausgabe dieses Befehls.

  6. Aktualisieren Sie den Zeichenfolgenwert der Zeichenfolgenkonstante PRIVATE_KEY mit dem privaten Schlüssel für Ihr Gerätezertifikat. Verwenden Sie den ausgegebenen Text des privaten Schlüssels aus dem vorherigen Schritt für den konstanten Wert.

    Die Syntax des Texts des privaten Schlüssels muss dem folgenden Muster ohne zusätzliche Leerstellen oder eine Analyse durch Visual Studio entsprechen.

    static const char* const PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----\n"
    "MIIJJwIBAAKCAgEAtjvKQjIhp0EE1PoADL1rfF/W6v4vlAzOSifKSQsaPeebqg8U\n"
        ...
    "X7fi9OZ26QpnkS5QjjPTYI/wwn0J9YAwNfKSlNeXTJDfJ+KpjXBcvaLxeBQbQhij\n"
    "-----END RSA PRIVATE KEY-----";
    
  7. Speichern Sie die Änderungen.

  8. Klicken Sie mit der rechten Maustaste auf das Projekt custom_hsm_-_example, und wählen Sie Erstellen aus.

    Wichtig

    Sie müssen das Projekt custom_hsm_example erstellen, bevor Sie die restliche Projektmappe im nächsten Abschnitt erstellen.

Ausführen des Beispiels

  1. Wählen Sie im Visual Studio-Menü die Option Debuggen>Starten ohne Debugging aus, um die Projektmappe auszuführen. Wählen Sie in der Aufforderung zum erneuten Erstellen des Projekts Ja aus, um das Projekt vor der Ausführung neu zu erstellen.

    Die folgende Ausgabe ist ein Beispiel dafür, wie das simulierte Gerät device-01 erfolgreich hochfährt und sich mit dem Bereitstellungsdienst verbindet. Das Gerät wurde einem IoT-Hub zugewiesen und registriert:

    Provisioning API Version: 1.8.0
    
    Registering Device
    
    Provisioning Status: PROV_DEVICE_REG_STATUS_CONNECTED
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    
    Registration Information received from service: contoso-hub-2.azure-devices.net, deviceId: device-01
    Press enter key to exit:
    
  2. Wiederholen Sie die Schritte in Konfigurieren des Stubcodes für das benutzerdefinierte HSM für Ihr zweites Gerät (device-02) und führen Sie das Beispiel erneut aus. Verwenden Sie für dieses Gerät die folgenden Werte:

    BESCHREIBUNG Wert
    Allgemeiner Name "device-02"
    Vollständige Zertifikatkette Generieren Sie den Text mithilfe von ./certs/device-02-full-chain.cert.pem
    Privater Schlüssel Generieren Sie den Text mithilfe von ./private/device-02.key.pem

    Die folgende Ausgabe ist ein Beispiel dafür, wie das simulierte Gerät device-02 erfolgreich hochfährt und sich mit dem Bereitstellungsdienst verbindet. Das Gerät wurde einem IoT-Hub zugewiesen und registriert:

    Provisioning API Version: 1.8.0
    
    Registering Device
    
    Provisioning Status: PROV_DEVICE_REG_STATUS_CONNECTED
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    
    Registration Information received from service: contoso-hub-2.azure-devices.net, deviceId: device-02
    Press enter key to exit:
    

Der C#-Beispielcode ist für die Verwendung von X.509-Zertifikaten konzipiert, die in einer kennwortgeschützten Datei im PKCS12-Format (.pfx) gespeichert sind. Die vollständigen Kettenzertifikate, die Sie zuvor erstellt haben, haben das PEM-Format. Um die vollständigen Kettenzertifikate in das PKCS#12-Format zu konvertieren, geben Sie die folgenden Befehle an Ihrer Git Bash-Eingabeaufforderung aus dem Verzeichnis ein, in dem Sie zuvor die OpenSSL-Befehle ausgeführt haben.

  • device-01

    openssl pkcs12 -inkey ./private/device-01.key.pem -in ./certs/device-01-full-chain.cert.pem -export -passin pass:1234 -passout pass:1234 -out ./certs/device-01-full-chain.cert.pfx
    
  • device-02

    openssl pkcs12 -inkey ./private/device-02.key.pem -in ./certs/device-02-full-chain.cert.pem -export -passin pass:1234 -passout pass:1234 -out ./certs/device-02-full-chain.cert.pfx
    

Im Rest dieses Abschnitts verwenden Sie Ihre Windows-Eingabeaufforderung.

  1. Wählen Sie im Azure-Portal die Registerkarte Übersicht für Ihre Device Provisioning Service-Instanz.

  2. Kopieren Sie den Wert von ID-Bereich.

    Screenshot of the ID scope on Azure portal.

  3. Wechseln Sie in Ihrer Windows-Eingabeaufforderung zum Verzeichnis X509Sample. Dieses Verzeichnis befindet sich im SDK-Repository, das Sie in einem früheren Schritt geklont haben: .\azure-iot-sdk-csharp\provisioning\device\samples\getting started\X509Sample.

  4. Geben Sie den folgenden Befehl ein, um das X.509-Gerätebereitstellungsbeispiel zu erstellen und auszuführen. Ersetzen Sie <id-scope> durch den ID-Bereich, den Sie im Azure-Portal kopiert haben. Ersetzen Sie <your-certificate-folder> durch den Pfad zu dem Ordner, in dem Sie Ihre OpenSSL-Befehle ausgeführt haben.

    dotnet run -- -s <id-scope> -c <your-certificate-folder>\certs\device-01-full-chain.cert.pfx -p 1234
    

    Das Gerät stellt eine Verbindung mit DPS her und wird einem IoT-Hub zugewiesen. Dann sendet das Gerät eine Telemetrienachricht an den IoT-Hub. Die Ausgabe sollte etwa folgendem Beispiel entsprechen:

    Loading the certificate...
    Found certificate: 3E5AA3C234B2032251F0135E810D75D38D2AA477 CN=Azure IoT Hub CA Cert Test Only; PrivateKey: False
    Found certificate: 81FE182C08D18941CDEEB33F53F8553BA2081E60 CN=Azure IoT Hub Intermediate Cert Test Only; PrivateKey: False
    Found certificate: 5BA1DB226D50EBB7A6A6071CED4143892855AE43 CN=device-01; PrivateKey: True
    Using certificate 5BA1DB226D50EBB7A6A6071CED4143892855AE43 CN=device-01
    Initializing the device provisioning client...
    Initialized for registration Id device-01.
    Registering with the device provisioning service...
    Registration status: Assigned.
    Device device-01 registered to contoso-hub-2.azure-devices.net.
    Creating X509 authentication for IoT Hub...
    Testing the provisioned device with IoT Hub...
    Sending a telemetry message...
    Finished.
    

    Hinweis

    Wenn Sie Zertifikat und Kennwort nicht in der Befehlszeile angeben, wird die Zertifikatdatei standardmäßig unter ./certificate.pfx erstellt, und Sie werden zur Eingabe Ihres Kennworts aufgefordert.

    Zusätzliche Parameter können übergeben werden, um TransportType (-t) und GlobalDeviceEndpoint (-g) zu ändern. Eine vollständige Liste der Parameter erhalten Sie durch Eingabe von dotnet run -- --help.

  5. Führen Sie zum Registrieren Ihres zweiten Geräts das Beispiel mithilfe des vollständigen Kettenzertifikats erneut aus.

    dotnet run -- -s <id-scope> -c <your-certificate-folder>\certs\device-02-full-chain.cert.pfx -p 1234
    

Verwenden Sie in den folgenden Schritten Ihre Windows-Eingabeaufforderung.

  1. Wählen Sie im Azure-Portal die Registerkarte Übersicht für Ihre Device Provisioning Service-Instanz.

  2. Kopieren Sie den Wert von ID-Bereich.

    Screenshot of the ID scope in the Azure portal.

  3. Wechseln Sie in Ihrer Windows-Eingabeaufforderung zum Beispielverzeichnis, und installieren Sie die für das Beispiel erforderlichen Pakete. Der angezeigte Pfad ist relativ zu dem Speicherort, in dem Sie das SDK geklont haben.

    cd .\azure-iot-sdk-node\provisioning\device\samples
    npm install
    
  4. Öffnen Sie im Ordner provisioning\device\samples die Datei register_x509.js, und überprüfen Sie den Code.

    Das Beispiel ist standardmäßig auf MQTT als Transportprotokoll festgelegt. Wenn Sie ein anderes Protokoll verwenden möchten, kommentieren Sie die folgende Zeile aus, und heben Sie die Auskommentierung für das geeignete Protokoll aus.

    var ProvisioningTransport = require('azure-iot-provisioning-device-mqtt').Mqtt;
    

    In dem Beispiel werden fünf Umgebungsvariablen für die Authentifizierung und Bereitstellung eines IoT-Geräts per DPS genutzt. Dies sind die folgenden Umgebungsvariablen:

    Variablenname BESCHREIBUNG
    PROVISIONING_HOST Der Endpunkt, der zum Herstellen einer Verbindung mit Ihrer DPS-Instanz verwendet werden soll. Verwenden Sie für dieses Tutorial den globalen Endpunkt global.azure-devices-provisioning.net.
    PROVISIONING_IDSCOPE Der ID-Bereich für Ihre DPS-Instanz.
    PROVISIONING_REGISTRATION_ID Registrierungs-ID für Ihre Geräteregistrierung Er muss mit dem allgemeinen Namen des Antragstellers im Gerätezertifikat übereinstimmen.
    CERTIFICATE_FILE Der Pfad zur Datei mit dem vollständigen Kettenzertifikat Ihres Geräts.
    KEY_FILE Der Pfad zur privaten Schlüsseldatei für das Gerätezertifikat.

    Die Methode ProvisioningDeviceClient.register() versucht, Ihr Gerät zu registrieren.

  5. Fügen Sie Umgebungsvariablen für den globalen Geräteendpunkt und den ID-Bereich hinzu. Ersetzen Sie <id-scope> durch den Wert, den Sie aus dem Azure-Portal kopiert haben.

    set PROVISIONING_HOST=global.azure-devices-provisioning.net
    set PROVISIONING_IDSCOPE=<id-scope>
    
  6. Legen Sie die Umgebungsvariable für die Registrierungs-ID für das Gerät fest. Die Registrierungs-ID für das IoT-Gerät muss mit dem allgemeinen Namen des Antragstellers im Gerätezertifikat übereinstimmen. In diesem Tutorial ist device-01 sowohl der Antragstellername als auch die Registrierungs-ID für das Gerät.

    set PROVISIONING_REGISTRATION_ID=device-01
    
  7. Legen Sie die Umgebungsvariablen für das vollständige Kettenzertifikat des Geräts und die Dateien des privaten Geräteschlüssels fest, die Sie zuvor generiert haben. Ersetzen Sie <your-certificate-folder> durch den Pfad zu dem Ordner, in dem Sie Ihre OpenSSL-Befehle ausgeführt haben.

    set CERTIFICATE_FILE=<your-certificate-folder>\certs\device-01-full-chain.cert.pem
    set KEY_FILE=<your-certificate-folder>\private\device-01.key.pem
    
  8. Führen Sie das Beispiel aus, und überprüfen Sie, ob das Gerät erfolgreich bereitgestellt wurde.

    node register_x509.js
    

    Die Ausgabe sollte etwa folgendem Beispiel entsprechen:

    registration succeeded
    assigned hub=contoso-hub-2.azure-devices.net
    deviceId=device-01
    Client connected
    send status: MessageEnqueued
    
  9. Aktualisieren Sie die Umgebungsvariablen für Ihr zweites Gerät (device-02) gemäß der folgenden Tabelle, und führen Sie das Beispiel erneut aus.

    Umgebungsvariable Wert
    PROVISIONING_REGISTRATION_ID device-02
    CERTIFICATE_FILE <your-certificate-folder>\certs\device-02-full-chain.cert.pem
    KEY_FILE <your-certificate-folder>\private\device-02.key.pem

Verwenden Sie in den folgenden Schritten Ihre Windows-Eingabeaufforderung.

  1. Wählen Sie im Azure-Portal die Registerkarte Übersicht für Ihre Device Provisioning Service-Instanz.

  2. Kopieren Sie den Wert von ID-Bereich.

    Screenshot of the ID scope in the Azure portal.

  3. Wechseln Sie in Ihrer Windows-Eingabeaufforderung zum Verzeichnis des Beispiels provision_x509.py. Der angezeigte Pfad ist relativ zu dem Speicherort, in dem Sie das SDK geklont haben.

    cd .\azure-iot-sdk-python\samples\async-hub-scenarios
    

    In diesem Beispiel werden sechs Umgebungsvariablen für die Authentifizierung und Bereitstellung eines IoT-Geräts per DPS genutzt. Dies sind die folgenden Umgebungsvariablen:

    Variablenname BESCHREIBUNG
    PROVISIONING_HOST Der Endpunkt, der zum Herstellen einer Verbindung mit Ihrer DPS-Instanz verwendet werden soll. Verwenden Sie für dieses Tutorial den globalen Endpunkt global.azure-devices-provisioning.net.
    PROVISIONING_IDSCOPE Der ID-Bereich für Ihre DPS-Instanz.
    DPS_X509_REGISTRATION_ID Registrierungs-ID für Ihre Geräteregistrierung Er muss mit dem allgemeinen Namen des Antragstellers im Gerätezertifikat übereinstimmen.
    X509_CERT_FILE Der Pfad zur Datei mit dem vollständigen Kettenzertifikat Ihres Geräts.
    X509_KEY_FILE Der Pfad zur privaten Schlüsseldatei für das Gerätezertifikat.
    PASS_PHRASE Die Passphrase, die Sie zum Verschlüsseln der Datei für den privaten Schlüssel verwendet haben (sofern zutreffend). Für dieses Tutorial nicht erforderlich.
  4. Fügen Sie die Umgebungsvariablen für den globalen Geräteendpunkt und den ID-Bereich hinzu. Verwenden Sie für die Variable ID Bereich den Wert, den Sie aus dem Azure-Portal kopiert haben.

    set PROVISIONING_HOST=global.azure-devices-provisioning.net
    set PROVISIONING_IDSCOPE=<ID scope for your DPS resource>
    
  5. Legen Sie die Umgebungsvariable für die Registrierungs-ID für das Gerät fest. Die Registrierungs-ID für das IoT-Gerät muss mit dem allgemeinen Namen des Antragstellers im Gerätezertifikat übereinstimmen. In diesem Tutorial ist device-01 sowohl der Antragstellername als auch die Registrierungs-ID für das Gerät.

    set DPS_X509_REGISTRATION_ID=device-01
    
  6. Legen Sie die Umgebungsvariablen für das vollständige Kettenzertifikat des Geräts und die Dateien des privaten Geräteschlüssels fest, die Sie zuvor generiert haben. Ersetzen Sie <your-certificate-folder> durch den Pfad zu dem Ordner, in dem Sie Ihre OpenSSL-Befehle ausgeführt haben.

    set X509_CERT_FILE=<your-certificate-folder>\certs\device-01-full-chain.cert.pem
    set X509_KEY_FILE=<your-certificate-folder>\private\device-01.key.pem
    
  7. Sehen Sie sich den Code für provision_x509.py an. Wenn Sie nicht die Python-Version 3.7 oder höher verwenden, führen Sie die hier beschriebene Codeänderung durch, um asyncio.run(main()) zu ersetzen.

  8. Führen Sie das Beispiel aus. Das Beispiel stellt eine Verbindung mit DPS her, wodurch das Gerät für einen IoT-Hub bereitgestellt wird. Nachdem das Gerät bereitgestellt wurde, sendet das Beispiel einige Testnachrichten an den IoT-Hub.

    python provision_x509.py
    

    Die Ausgabe sollte etwa folgendem Beispiel entsprechen:

    The complete registration result is
    device-01
    contoso-hub-2.azure-devices.net
    initialAssignment
    null
    Will send telemetry from the provisioned device
    sending message #1
    sending message #2
    sending message #3
    sending message #4
    sending message #5
    sending message #6
    sending message #7
    sending message #8
    sending message #9
    sending message #10
    done sending message #1
    done sending message #2
    done sending message #3
    done sending message #4
    done sending message #5
    done sending message #6
    done sending message #7
    done sending message #8
    done sending message #9
    done sending message #10
    
  9. Aktualisieren Sie die Umgebungsvariablen für Ihr zweites Gerät (device-02) gemäß der folgenden Tabelle, und führen Sie das Beispiel erneut aus.

    Umgebungsvariable Wert
    DPS_X509_REGISTRATION_ID device-02
    X509_CERT_FILE <your-certificate-folder>\certs\device-02-full-chain.cert.pem
    X509_KEY_FILE <your-certificate-folder>\private\device-02.key.pem

In den folgenden Schritten verwenden Sie sowohl Ihre Windows-Eingabeaufforderung als auch Ihre Git Bash-Eingabeaufforderung.

  1. Wählen Sie im Azure-Portal die Registerkarte Übersicht für Ihre Device Provisioning Service-Instanz.

  2. Kopieren Sie den Wert von ID-Bereich.

    Screenshot of the ID scope in the Azure portal.

  3. Navigieren Sie in Ihrer Windows-Eingabeaufforderung zum Ordner des Beispielprojekts. Der angezeigte Pfad ist relativ zu dem Speicherort, in dem Sie das SDK geklont haben.

    cd .\azure-iot-sdk-java\provisioning\provisioning-device-client-samples\provisioning-X509-sample
    
  4. Geben Sie im Beispielcode den Bereitstellungsdienst und die X.509-Identitätsinformationen ein. Diese Angaben werden während der Bereitstellung als Nachweis für das simulierte Gerät verwendet, bevor es registriert wird.

    1. Öffnen Sie die Datei .\src\main\java\samples\com\microsoft\azure\sdk\iot\ProvisioningX509Sample.java in Ihrem bevorzugten Text-Editor.

    2. Aktualisieren Sie die folgenden Werte. Verwenden Sie für idScope den ID-Bereich, den Sie zuvor kopiert haben. Verwenden Sie für den globalen Endpunkt den Wert für Globaler Geräteendpunkt. Dieser Endpunkt ist für alle DPS-Instanzen identisch (global.azure-devices-provisioning.net).

      private static final String idScope = "[Your ID scope here]";
      private static final String globalEndpoint = "[Your Provisioning Service Global Endpoint here]";
      
    3. Das Beispiel ist standardmäßig auf HTTPS als Transportprotokoll festgelegt. Wenn Sie das Protokoll ändern möchten, kommentieren Sie die folgende Zeile aus, und heben Sie die Auskommentierung der Zeile für das gewünschte Protokoll auf.

      private static final ProvisioningDeviceClientTransportProtocol PROVISIONING_DEVICE_CLIENT_TRANSPORT_PROTOCOL = ProvisioningDeviceClientTransportProtocol.HTTPS;
      
    4. Aktualisieren Sie den Wert der konstanten Zeichenfolge leafPublicPem mit dem Wert Ihres Gerätezertifikats device-01.cert.pem.

      Die Syntax des Zertifikattexts muss dem unten folgenden Muster (ohne zusätzliche Leerstellen oder Zeichen) entsprechen.

      private static final String leafPublicPem = "-----BEGIN CERTIFICATE-----\n"
      "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n"
          ...
      "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n"
      "-----END CERTIFICATE-----";        
      

      Das manuelle Aktualisieren dieses Zeichenfolgenwerts kann fehleranfällig sein. Zum Generieren der richtigen Syntax können Sie den folgenden Befehl kopieren und in Ihre Git Bash-Eingabeaufforderung einfügen. Drücken Sie dann die EINGABETASTE. Dieser Befehl generiert die Syntax für den Wert der Zeichenfolgenkonstante leafPublicPem und schreibt sie in die Ausgabe.

      sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' ./certs/device-01.cert.pem
      

      Kopieren Sie den ausgegebenen Zertifikattext für den konstanten Wert, und fügen Sie ihn ein.

    5. Aktualisieren Sie den Zeichenfolgenwert der Konstante leafPrivateKey mit dem unverschlüsselten privaten Schlüssel für Ihr Gerätezertifikat, unencrypted-device-key.pem.

      Die Syntax des Texts zum privaten Schlüssel muss dem folgenden Muster (ohne zusätzliche Leerstellen oder Zeichen) entsprechen.

      private static final String leafPrivateKey = "-----BEGIN PRIVATE KEY-----\n" +
      "MIIJJwIBAAKCAgEAtjvKQjIhp0EE1PoADL1rfF/W6v4vlAzOSifKSQsaPeebqg8U\n" +
          ...
      "X7fi9OZ26QpnkS5QjjPTYI/wwn0J9YAwNfKSlNeXTJDfJ+KpjXBcvaLxeBQbQhij\n" +
      "-----END PRIVATE KEY-----";
      

      Zum Generieren der richtigen Syntax können Sie den folgenden Befehl kopieren und in Ihre Git Bash-Eingabeaufforderung einfügen. Drücken Sie dann die EINGABETASTE. Dieser Befehl generiert die Syntax für den Wert der Zeichenfolgenkonstante leafPrivateKey und schreibt sie in die Ausgabe.

      sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' ./private/device-01.key.pem
      

      Kopieren Sie den ausgegebenen Text zum privaten Schlüssel für den konstanten Wert, und fügen Sie ihn ein.

    6. Fügen Sie die konstante Zeichenfolge rootPublicPem mit dem Wert Ihres Zertifikats der Stammzertifizierungsstelle azure-iot-test-only.root.ca.cert.pem hinzu. Sie können ihn direkt nach der Konstante leafPrivateKey hinzufügen.

      Die Syntax des Zertifikattexts muss dem unten folgenden Muster (ohne zusätzliche Leerstellen oder Zeichen) entsprechen.

      private static final String rootPublicPem = "-----BEGIN CERTIFICATE-----\n"
      "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n"
          ...
      "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n"
      "-----END CERTIFICATE-----";        
      

      Zum Generieren der richtigen Syntax können Sie den folgenden Befehl kopieren und in Ihre Git Bash-Eingabeaufforderung einfügen. Drücken Sie dann die EINGABETASTE. Dieser Befehl generiert die Syntax für den Wert der Zeichenfolgenkonstante rootPublicPem und schreibt sie in die Ausgabe.

      sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' ./certs/azure-iot-test-only.root.ca.cert.pem
      

      Kopieren Sie den ausgegebenen Zertifikattext für den konstanten Wert, und fügen Sie ihn ein.

    7. Fügen Sie die konstante Zeichenfolge intermediatePublicPem mit dem Wert Ihres Zertifikats der Zwischenzertifizierungsstelle azure-iot-test-only.intermediate.cert.pem hinzu. Sie können ihn direkt nach der vorherigen Konstante hinzufügen.

      Die Syntax des Zertifikattexts muss dem unten folgenden Muster (ohne zusätzliche Leerstellen oder Zeichen) entsprechen.

      private static final String intermediatePublicPem = "-----BEGIN CERTIFICATE-----\n"
      "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n"
          ...
      "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n"
      "-----END CERTIFICATE-----";        
      

      Zum Generieren der richtigen Syntax können Sie den folgenden Befehl kopieren und in Ihre Git Bash-Eingabeaufforderung einfügen. Drücken Sie dann die EINGABETASTE. Dieser Befehl generiert die Syntax für den Wert der Zeichenfolgenkonstante intermediatePublicPem und schreibt sie in die Ausgabe.

      sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' ./certs/azure-iot-test-only.intermediate.cert.pem
      

      Kopieren Sie den ausgegebenen Zertifikattext für den konstanten Wert, und fügen Sie ihn ein.

    8. Suchen Sie in der main-Methode die folgenden Zeilen:

      // For group enrollment uncomment this line
      //signerCertificatePemList.add("<Your Signer/intermediate Certificate Here>");
      

      Fügen Sie diese beiden Zeilen direkt darunter hinzu, um der Signaturkette die Zertifikate der Zwischen- und Stammzertifizierungsstelle hinzuzufügen. Ihre Signaturkette sollte die gesamte Zertifikatkette bis hin zu einem Zertifikat umfassen, das Sie mit DPS überprüft haben.

      signerCertificatePemList.add(intermediatePublicPem);
      signerCertificatePemList.add(rootPublicPem);
      

      Hinweis

      Die Reihenfolge, in der die Signaturzertifikate hinzugefügt werden, ist wichtig. Wird sie geändert, ist das Beispiel nicht erfolgreich.

    9. Speichern Sie die Änderungen.

  5. Erstellen Sie das Beispiel, und wechseln Sie zum Ordner target.

    mvn clean install
    cd target
    
  6. Der Build gibt die JAR-Datei im Ordner target mit folgendem Dateiformat aus: provisioning-x509-sample-{version}-with-deps.jar; Beispiel: provisioning-x509-sample-1.8.1-with-deps.jar. Führen Sie die JAR-Datei aus. Möglicherweise müssen Sie die Version im folgenden Befehl ersetzen.

    java -jar ./provisioning-x509-sample-1.8.1-with-deps.jar
    

    Das Beispiel stellt eine Verbindung mit DPS her, wodurch das Gerät für einen IoT-Hub bereitgestellt wird. Nachdem das Gerät bereitgestellt wurde, sendet das Beispiel einige Testnachrichten an den IoT-Hub.

    Starting...
    Beginning setup.
    WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance.
    2022-10-21 10:41:20,476 DEBUG (main) [com.microsoft.azure.sdk.iot.provisioning.device.ProvisioningDeviceClient] - Initialized a ProvisioningDeviceClient instance using SDK version 2.0.2
    2022-10-21 10:41:20,479 DEBUG (main) [com.microsoft.azure.sdk.iot.provisioning.device.ProvisioningDeviceClient] - Starting provisioning thread...
    Waiting for Provisioning Service to register
    2022-10-21 10:41:20,482 INFO (global.azure-devices-provisioning.net-4f8279ac-CxnPendingConnectionId-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Opening the connection to device provisioning service...
    2022-10-21 10:41:20,652 INFO (global.azure-devices-provisioning.net-4f8279ac-Cxn4f8279ac-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Connection to device provisioning service opened successfully, sending initial device registration message
    2022-10-21 10:41:20,680 INFO (global.azure-devices-provisioning.net-4f8279ac-Cxn4f8279ac-azure-iot-sdk-RegisterTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.RegisterTask] - Authenticating with device provisioning service using x509 certificates
    2022-10-21 10:41:21,603 INFO (global.azure-devices-provisioning.net-4f8279ac-Cxn4f8279ac-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Waiting for device provisioning service to provision this device...
    2022-10-21 10:41:21,605 INFO (global.azure-devices-provisioning.net-4f8279ac-Cxn4f8279ac-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Current provisioning status: ASSIGNING
    2022-10-21 10:41:24,868 INFO (global.azure-devices-provisioning.net-4f8279ac-Cxn4f8279ac-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Device provisioning service assigned the device successfully
    IotHUb Uri : contoso-hub-2.azure-devices.net
    Device ID : device-01
    2022-10-21 10:41:30,514 INFO (main) [com.microsoft.azure.sdk.iot.device.transport.ExponentialBackoffWithJitter] - NOTE: A new instance of ExponentialBackoffWithJitter has been created with the following properties. Retry Count: 2147483647, Min Backoff Interval: 100, Max Backoff Interval: 10000, Max Time Between Retries: 100, Fast Retry Enabled: true
    2022-10-21 10:41:30,526 INFO (main) [com.microsoft.azure.sdk.iot.device.transport.ExponentialBackoffWithJitter] - NOTE: A new instance of ExponentialBackoffWithJitter has been created with the following properties. Retry Count: 2147483647, Min Backoff Interval: 100, Max Backoff Interval: 10000, Max Time Between Retries: 100, Fast Retry Enabled: true
    2022-10-21 10:41:30,533 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Initialized a DeviceClient instance using SDK version 2.1.2
    2022-10-21 10:41:30,590 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - Opening MQTT connection...
    2022-10-21 10:41:30,625 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT CONNECT packet...
    2022-10-21 10:41:31,452 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT CONNECT packet was acknowledged
    2022-10-21 10:41:31,453 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT SUBSCRIBE packet for topic devices/device-01/messages/devicebound/#
    2022-10-21 10:41:31,523 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT SUBSCRIBE packet for topic devices/device-01/messages/devicebound/# was acknowledged
    2022-10-21 10:41:31,525 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - MQTT connection opened successfully
    2022-10-21 10:41:31,528 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - The connection to the IoT Hub has been established
    2022-10-21 10:41:31,531 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Updating transport status to new status CONNECTED with reason CONNECTION_OK
    2022-10-21 10:41:31,532 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceIO] - Starting worker threads
    2022-10-21 10:41:31,535 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Invoking connection status callbacks with new status details
    2022-10-21 10:41:31,536 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Client connection opened successfully
    2022-10-21 10:41:31,537 INFO (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Device client opened successfully
    Sending message from device to IoT Hub...
    2022-10-21 10:41:31,539 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Message was queued to be sent later ( Message details: Correlation Id [0d143280-dbc7-405f-a61e-fcc7a1d80b87] Message Id [4d8d39c8-5a38-4299-8f07-3ae02cdc3218] )
    Press any key to exit...
    2022-10-21 10:41:31,540 DEBUG (contoso-hub-2.azure-devices.net-device-01-d7c67552-Cxn0bd73809-420e-46fe-91ee-942520b775db-azure-iot-sdk-IotHubSendTask) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Sending message ( Message details: Correlation Id [0d143280-dbc7-405f-a61e-fcc7a1d80b87] Message Id [4d8d39c8-5a38-4299-8f07-3ae02cdc3218] )
    2022-10-21 10:41:31,844 DEBUG (MQTT Call: device-01) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - IotHub message was acknowledged. Checking if there is record of sending this message ( Message details: Correlation Id [0d143280-dbc7-405f-a61e-fcc7a1d80b87] Message Id [4d8d39c8-5a38-4299-8f07-3ae02cdc3218] )
    2022-10-21 10:41:31,846 DEBUG (contoso-hub-2.azure-devices.net-device-01-d7c67552-Cxn0bd73809-420e-46fe-91ee-942520b775db-azure-iot-sdk-IotHubSendTask) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Invoking the callback function for sent message, IoT Hub responded to message ( Message details: Correlation Id [0d143280-dbc7-405f-a61e-fcc7a1d80b87] Message Id [4d8d39c8-5a38-4299-8f07-3ae02cdc3218] ) with status OK
    Message sent!
    
  7. Aktualisieren Sie die Konstanten für Ihr zweites Gerät (device-02) gemäß der folgenden Tabelle, erstellen Sie das Beispiel neu, und führen Sie es erneut aus.

    Dauerhaft Zu verwendende Datei
    leafPublicPem ./certs/device-02.cert.pem
    leafPrivateKey ./private/device-02.key.pem

Bestätigen der Registrierung der Gerätebereitstellung

Überprüfen Sie die Registrierungsdatensätze der Registrierungsgruppe, um die Registrierungsdetails für Ihre Geräte anzuzeigen:

  1. Navigieren Sie im Azure-Portal zu Ihrer Instanz des Gerätebereitstellungsdiensts.

  2. Wählen Sie im Menü Einstellungen die Option Registrierungen verwalten aus.

  3. Wählen Sie Registrierungsgruppen aus. Der von Ihnen zuvor erstellte X.509-Registrierungsgruppeneintrag sollte in der Liste angezeigt werden.

  4. Wählen Sie den Registrierungseintrag aus. Wählen Sie dann Details neben Registrierungsstatus aus, um die Geräte anzuzeigen, die über die Registrierungsgruppe registriert wurden. Der IoT-Hub, dem jede Ihrer Geräte zugewiesen wurde, deren Geräte-IDs und die Datums- und Uhrzeitangaben, zu denen sie registriert wurden, werden in der Liste angezeigt.

    Screenshot that shows the registration status details for the enrollment group on Azure portal.

  5. Sie können eines der Geräte auswählen, um weitere Details für dieses Gerät anzuzeigen.

So überprüfen Sie das Gerät auf Ihrem IoT-Hub:

  1. Wechseln Sie im Azure-Portal zu dem IoT-Hub, dem Ihr Gerät zugewiesen wurde.

  2. Wählen Sie im Menü Geräteverwaltung die Option Geräte aus.

  3. Wenn Ihre Geräte erfolgreich bereitgestellt wurden, sollten ihre Geräte-IDs, Geräte-01 und Geräte-02 in der Liste angezeigt werden, wobei Status als aktiviert festgelegt ist. Wenn Ihr Gerät nicht angezeigt wird, wählen Sie Aktualisieren aus.

    Screenshot that shows the devices are registered with the I o T hub in Azure portal.

Bereinigen von Ressourcen

Führen Sie die unten angegebenen Schritte aus, um alle in diesem Tutorial erstellten Ressourcen zu löschen, nachdem Sie das Testen und Erkunden dieses Geräteclientbeispiels abgeschlossen haben.

  1. Schließen Sie auf Ihrem Computer das Ausgabefenster des Geräteclientbeispiels.

Löschen Ihrer Registrierungsgruppe

  1. Wählen Sie im Azure-Portal im linken Menü die Option Alle Ressourcen aus.

  2. Wählen Sie Ihre DPS-Instanz aus.

  3. Wählen Sie im Menü Einstellungen die Option Registrierungen verwalten aus.

  4. Wählen Sie die Registerkarte Registrierungsgruppen aus.

  5. Wählen Sie die Registrierungsgruppe aus, die Sie für dieses Tutorial verwendet haben.

  6. Wählen Sie auf der Seite Registrierungsdetails die Option Details neben dem Registrierungsstatus aus. Aktivieren Sie dann das Kontrollkästchen neben der Spaltenüberschrift Geräte-ID, um alle Registrierungsdatensätze für die Registrierungsgruppe auszuwählen. Wählen Sie oben auf der Seite Löschen aus, um die Registrierungsdatensätze zu löschen.

    Wichtig

    Das Löschen einer Registrierungsgruppe führt nicht dazu, dass die ihr zugeordneten Registrierungsdatensätze gelöscht werden. Diese verwaisten Datensätze werden auf das Registrierungskontingent für die DPS-Instanz angerechnet. Aus diesem Grund sollten Sie alle mit einer Registrierungsgruppe verbundenen Registrierungsdatensätze löschen, bevor Sie die Registrierungsgruppe selbst löschen.

  7. Wechseln Sie zurück zur Seite Registrierungen verwalten, und stellen Sie sicher, dass die Registerkarte Registrierungsgruppen ausgewählt ist.

  8. Aktivieren Sie das Kontrollkästchen neben dem Gruppennamen der Registrierungsgruppe, die Sie für dieses Tutorial verwendet haben.

  9. Wählen Sie oben auf der Seite Löschen aus.

Löschen registrierter Zertifizierungsstellenzertifikate aus DPS

  1. Wählen Sie im linken Menü Ihrer DPS-Instanz die Option Zertifikate aus. Wählen Sie für jedes Zertifikat, das Sie in diesem Tutorial hochgeladen und verifiziert haben, zunächst das Zertifikat und dann die Schaltfläche Löschen aus, und bestätigen Sie den Löschvorgang.

Löschen der Geräteregistrierungen aus IoT Hub

  1. Wählen Sie im Azure-Portal im linken Menü die Option Alle Ressourcen aus.

  2. Wählen Sie Ihren IoT Hub aus.

  3. Wählen Sie im Menü Explorer die Option IoT-Geräte aus.

  4. Aktivieren Sie das Kontrollkästchen neben der Geräte-ID für die Geräte, die Sie in diesem Tutorial registriert haben. Beispiel: Gerät-01 und Gerät-02.

  5. Wählen Sie oben auf der Seite Löschen aus.

Nächste Schritte

In diesem Tutorial haben Sie mehrere X.509-Geräte mithilfe einer Registrierungsgruppe für Ihren IoT-Hub bereitgestellt. Informieren Sie sich als Nächstes, wie IoT-Geräte auf mehreren IoT-Hubs bereitgestellt werden.