Samouczek: aprowizuj wiele urządzeń X.509 przy użyciu grup rejestracji

Z tego samouczka dowiesz się, jak aprowizować grupy urządzeń IoT, które używają certyfikatów X.509 do uwierzytelniania. Przykładowy kod urządzenia z zestawu Azure IoT SDK zostanie wykonany na maszynie dewelopera w celu symulowania aprowizacji urządzeń X.509. Na rzeczywistych urządzeniach kod urządzenia zostanie wdrożony i uruchomiony z urządzenia IoT.

Usługa Azure IoT Hub Device Provisioning obsługuje dwa typy rejestracji na potrzeby aprowizacji urządzeń:

  • Grupy rejestracji: służą do rejestrowania wielu pokrewnych urządzeń. W tym samouczku przedstawiono aprowizowanie przy użyciu grup rejestracji.
  • Rejestracje indywidualne: służy do rejestrowania pojedynczego urządzenia.

Usługa Azure IoT Hub Device Provisioning obsługuje trzy formy uwierzytelniania na potrzeby aprowizacji urządzeń:

  • Certyfikaty X.509 — w tym samouczku przedstawiono zaświadczenie certyfikatu X.509
  • Moduł TPM (Trusted Platform Module)
  • Klucze symetryczne

W scenariuszach produkcyjnych sprzętowy moduł zabezpieczeń (HSM) jest używany do bezpiecznego, sprzętowego przechowywania wpisów tajnych urządzeń. Moduł HSM może być używany z kluczem symetrycznym, certyfikatem X.509 lub zaświadczeniem modułu TPM w celu zapewnienia bezpiecznego magazynu dla wpisów tajnych. Zalecane jest przechowywanie wpisów tajnych urządzeń opartych na sprzęcie w celu ochrony poufnych informacji, takich jak klucz prywatny certyfikatu urządzenia.

W tym samouczku wykonasz następujące cele:

  • Utwórz łańcuch zaufania certyfikatów, aby zorganizować zestaw urządzeń przy użyciu certyfikatów X.509.
  • Utwórz nową rejestrację grupową korzystającą z łańcucha certyfikatów.
  • Konfigurowanie środowiska projektowego.
  • Aprowizuj urządzenia przy użyciu łańcucha certyfikatów przy użyciu przykładowego kodu w zestawie SDK urządzenia Usługi Azure IoT.

Wymagania wstępne

Poniższe wymagania wstępne dotyczą środowiska deweloperskiego systemu Windows używanego do symulowania urządzeń. W przypadku systemu Linux lub macOS zapoznaj się z odpowiednią sekcją w temacie Przygotowywanie środowiska projektowego w dokumentacji zestawu SDK.

  • Zainstaluj program Visual Studio 2022 z włączonym obciążeniem "Programowanie aplikacji klasycznych z językiem C++". Obsługiwane są również programy Visual Studio 2015, Visual Studio 2017 i Visual Studio 19.

  • Zainstaluj najnowszy system kompilacji narzędzia CMake. Upewnij się, że zaznaczono opcję, która dodaje plik wykonywalny narzędzia CMake do ścieżki.

    Ważne

    Przed rozpoczęciem CMake instalacji upewnij się, że na maszynie są zainstalowane wymagania wstępne programu Visual Studio (Visual Studio i pakiet roboczy Programowanie aplikacji klasycznych z językiem C++). Gdy wymagania wstępne zostaną spełnione, a pobrane pliki zweryfikowane, zainstaluj system kompilacji CMake. Należy również pamiętać, że starsze wersje systemu kompilacji CMake nie mogą wygenerować pliku rozwiązania używanego w tym samouczku. Upewnij się, że używasz najnowszej wersji narzędzia CMake.

Poniższe wymagania wstępne dotyczą środowiska deweloperskiego systemu Windows. W przypadku systemu Linux lub macOS zapoznaj się z odpowiednią sekcją w temacie Przygotowywanie środowiska projektowego w dokumentacji zestawu SDK.

  • Zainstaluj zestaw .NET SDK 6.0 lub nowszy na maszynie z systemem Windows. Aby sprawdzić wersję, możesz użyć następującego polecenia.

    dotnet --info
    

Poniższe wymagania wstępne dotyczą środowiska deweloperskiego systemu Windows. W przypadku systemu Linux lub macOS zapoznaj się z odpowiednią sekcją w temacie Przygotowywanie środowiska projektowego w dokumentacji zestawu SDK.

Poniższe wymagania wstępne dotyczą środowiska deweloperskiego systemu Windows.

Poniższe wymagania wstępne dotyczą środowiska deweloperskiego systemu Windows. W przypadku systemu Linux lub macOS zapoznaj się z odpowiednią sekcją w temacie Przygotowywanie środowiska projektowego w dokumentacji zestawu SDK.

  • Zainstaluj najnowszą wersję usługi Git. Upewnij się, że usługa Git jest dodawana do zmiennych środowiskowych dostępnych w oknie polecenia.

  • Upewnij się, że na maszynie jest zainstalowany program OpenSSL . W systemie Windows instalacja narzędzia Git obejmuje instalację programu OpenSSL. Dostęp do protokołu OpenSSL można uzyskać z poziomu wiersza polecenia powłoki Git Bash. Aby sprawdzić, czy program OpenSSL jest zainstalowany, otwórz wiersz polecenia powłoki Git Bash i wprowadź polecenie openssl version.

    Uwaga

    Jeśli nie znasz programu OpenSSL i nie masz go już zainstalowanego na maszynie z systemem Windows, zalecamy używanie biblioteki OpenSSL z poziomu wiersza polecenia powłoki Git Bash. Alternatywnie możesz pobrać kod źródłowy i skompilować bibliotekę OpenSSL. Jeśli zdecydujesz się skompilować lub pobrać plik OpenSSL, upewnij się, że plik binarny OpenSSL jest dostępny w ścieżce i że OPENSSL_CNF zmienna środowiskowa jest ustawiona na ścieżkę pliku openssl.cnf .

przygotowywanie środowiska programistycznego

W tej sekcji przygotujesz środowisko programistyczne używane do kompilowania zestawu SDK języka C usługi Azure IoT. Zestaw SDK zawiera przykładowy kod i narzędzia używane przez urządzenia aprowizowania za pomocą usługi DPS.

  1. W przeglądarce internetowej przejdź do strony Wydanie zestawu AZURE IoT C SDK.

  2. Skopiuj nazwę tagu dla najnowszej wersji zestawu AZURE IoT C SDK, na przykład: lts_03_2024.

  3. Otwórz wiersz polecenia systemu Windows i uruchom następujące polecenia, aby sklonować najnowszą wersję zestawu AZURE IoT Device SDK for C GitHub. Zastąp <release-tag> element tagiem skopiowanymi w poprzednim kroku.

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

    Wykonanie tej operacji może potrwać kilka minut.

  4. Po zakończeniu operacji uruchom następujące polecenia z azure-iot-sdk-c katalogu:

    mkdir cmake
    cd cmake
    
  5. Przykładowy kod używa certyfikatu X.509 w celu dostarczenia poświadczeń za pośrednictwem uwierzytelniania X.509. Uruchom następujące polecenie, aby skompilować wersję zestawu SDK specyficzną dla platformy programistycznej, która obejmuje klienta aprowizacji urządzeń. W katalogu jest generowane cmake rozwiązanie programu Visual Studio dla symulowanego urządzenia.

    Zastąp ciąg <path ścieżką bezwzględną do sklonowanego zestawu SDK języka C.

    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 ..
    

    Napiwek

    Jeśli cmake nie znajdziesz kompilatora języka C++, podczas uruchamiania powyższego polecenia mogą wystąpić błędy kompilacji. W takim przypadku spróbuj uruchomić polecenie w wierszu polecenia programu Visual Studio.

  6. Po pomyślnym zakończeniu kompilacji ostatnie kilka wierszy wyjściowych będzie wyglądać podobnie do następujących danych wyjściowych:

    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
    

Otwórz wiersz polecenia systemu Windows i sklonuj repozytorium GitHub zestawu AZURE IoT SDK dla języka C# , używając następującego polecenia:

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

Otwórz wiersz polecenia systemu Windows i sklonuj zestaw SDK usługi Azure IoT dla repozytorium Node.js GitHub przy użyciu następującego polecenia:

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

Otwórz wiersz polecenia systemu Windows i sklonuj repozytorium Azure IoT Device SDK for Python GitHub przy użyciu następującego polecenia:

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

Uwaga

Przykłady używane w tym samouczku znajdują się w gałęzi w wersji 2 repozytorium azure-iot-sdk-python. Wersja 3 zestawu SDK języka Python jest dostępna do użycia w wersji beta.

  1. Otwórz wiersz polecenia systemu Windows i sklonuj repozytorium GitHub przykłady usługi Azure IoT dla języka Java przy użyciu następującego polecenia:

    git clone https://github.com/Azure/azure-iot-sdk-java.git --recursive
    
  2. Przejdź do katalogu głównego azure-iot-sdk-java i skompiluj projekt, aby pobrać wszystkie potrzebne pakiety.

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

Tworzenie łańcucha certyfikatów X.509

W tej sekcji wygenerujesz łańcuch certyfikatów X.509 z trzech certyfikatów na potrzeby testowania każdego urządzenia w ramach tego samouczka. Certyfikaty mają następującą hierarchię.

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

Certyfikat główny Przekazujesz i weryfikujesz certyfikat główny za pomocą usługi DPS. Ta weryfikacja umożliwia usłudze DPS ufanie temu certyfikatowi i weryfikowanie podpisanych przez niego certyfikatów.

Certyfikat pośredni: często używać certyfikatów pośrednich do grupowania urządzeń logicznie według linii produktów, podziałów firmy lub innych kryteriów. W tym samouczku jest używany łańcuch certyfikatów z jednym certyfikatem pośrednim, ale w scenariuszu produkcyjnym może istnieć kilka. Certyfikat pośredni w tym łańcuchu jest podpisany przez certyfikat główny. Ten certyfikat jest udostępniany grupie rejestracji utworzonej w usłudze DPS. Ta konfiguracja umożliwia zarządzanie całą grupą urządzeń z certyfikatami urządzeń podpisanymi przez ten sam certyfikat pośredni.

Certyfikaty urządzeń: certyfikaty urządzeń (czasami nazywane certyfikatem liścia) są podpisane przez certyfikat pośredni i przechowywane na urządzeniu wraz z jego kluczem prywatnym. Najlepiej, aby te poufne elementy były bezpiecznie przechowywane za pomocą modułu HSM. Wiele certyfikatów urządzeń może być podpisanych przez ten sam certyfikat pośredni. Każde urządzenie przedstawia swój certyfikat i klucz prywatny wraz z łańcuchem certyfikatów podczas próby aprowizacji.

Aby uzyskać więcej informacji na temat łańcuchów certyfikatów, zobacz Zaświadczenie certyfikatu X.509.

Konfigurowanie środowiska X.509 OpenSSL

W tej sekcji utworzysz pliki konfiguracji Openssl, strukturę katalogu i inne pliki używane przez polecenia Openssl.

  1. Otwórz wiersz polecenia powłoki Git Bash i przejdź do folderu, w którym chcesz wygenerować certyfikaty i klucze X.509 na potrzeby tego samouczka.

  2. Utwórz plik konfiguracji OpenSSL o nazwie openssl_root_ca.cnf dla certyfikatu głównego urzędu certyfikacji. Pliki konfiguracji openSSL zawierają zasady i definicje używane przez polecenia OpenSSL. Skopiuj i wklej następujący tekst do pliku openssl_root_ca.cnf :

    # 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. Utwórz plik konfiguracji OpenSSL o nazwie openssl_device_intermediate_ca.cnf do użycia dla certyfikatów pośrednich i urządzeń. Skopiuj i wklej następujący tekst do pliku openssl_device_intermediate_ca.cnf :

    # 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. Utwórz strukturę katalogów, plik bazy danych index.txt i numer seryjny, który jest używany przez polecenia OpenSSL w tym samouczku:

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

Tworzenie certyfikatu głównego urzędu certyfikacji

Uruchom następujące polecenia, aby utworzyć klucz prywatny głównego urzędu certyfikacji i certyfikat głównego urzędu certyfikacji. Ten certyfikat i klucz służą do podpisywania certyfikatu pośredniego.

  1. W terminalu powłoki Git Bash utwórz klucz prywatny głównego urzędu certyfikacji:

    openssl genrsa -aes256 -passout pass:1234 -out ./private/azure-iot-test-only.root.ca.key.pem 4096
    
  2. Utwórz certyfikat głównego urzędu certyfikacji:

    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
    

    Ważne

    Dodatkowy ukośnik podany dla nazwy podmiotu (//CN=Azure IoT Hub CA Cert Test Only) jest wymagany tylko do ucieczki ciągu z usługą Git na platformach Windows. Na platformach Linux podaj nazwę podmiotu z tylko jednym ukośnikiem (/CN=Azure IoT Hub CA Cert Test Only).

  3. Sprawdź certyfikat głównego urzędu certyfikacji:

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

    Zwróć uwagę, że wystawca i podmiot są zarówno głównym urzędem certyfikacji.

    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)
    

Tworzenie pośredniego certyfikatu urzędu certyfikacji

Uruchom następujące polecenia, aby utworzyć pośredni klucz prywatny urzędu certyfikacji i pośredni certyfikat urzędu certyfikacji. Ten certyfikat i klucz służą do podpisywania certyfikatów urządzenia.

  1. W terminalu powłoki Git Bash utwórz pośredni klucz prywatny urzędu certyfikacji:

    openssl genrsa -aes256 -passout pass:1234 -out ./private/azure-iot-test-only.intermediate.key.pem 4096
    
  2. Utwórz żądanie podpisania certyfikatu pośredniego urzędu certyfikacji (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
    

    Ważne

    Dodatkowy ukośnik podany dla nazwy podmiotu (//CN=Azure IoT Hub Intermediate Cert Test Only) jest wymagany tylko do ucieczki ciągu z usługą Git na platformach Windows. Na platformach Linux podaj nazwę podmiotu z pojedynczym ukośnikiem (/CN=Azure IoT Hub Intermediate Cert Test Only).

  3. Podpisywanie certyfikatu pośredniego przy użyciu certyfikatu głównego urzędu certyfikacji

    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. Sprawdź certyfikat pośredniego urzędu certyfikacji:

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

    Zwróć uwagę, że wystawca jest głównym urzędem certyfikacji, a podmiot jest pośrednim urzędem certyfikacji.

    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)
    

Tworzenie certyfikatów urządzeń

W tej sekcji utworzysz dwa certyfikaty urządzeń i ich certyfikaty w pełnym łańcuchu. Certyfikat pełnego łańcucha zawiera certyfikat urządzenia, certyfikat pośredniego urzędu certyfikacji i certyfikat głównego urzędu certyfikacji. Urządzenie musi przedstawić certyfikat pełnego łańcucha podczas rejestrowania w usłudze DPS.

  1. Utwórz pierwszy klucz prywatny urządzenia.

    openssl genrsa -out ./private/device-01.key.pem 4096
    
  2. Utwórz certyfikat urządzenia CSR.

    Nazwa pospolita podmiotu certyfikatu urządzenia (CN) musi być ustawiona na identyfikator rejestracji używany przez urządzenie do rejestracji w usłudze DPS. Identyfikator rejestracji jest ciągiem bez uwzględniania wielkości liter znaków alfanumerycznych oraz znakami specjalnymi: '-', , '.''_', ':'. Ostatni znak musi być alfanumeryczny lub kreskowy ('-'). Nazwa pospolita musi być zgodna z tym formatem. Usługa DPS obsługuje identyfikatory rejestracji o długości do 128 znaków; jednak maksymalna długość nazwy pospolitej podmiotu w certyfikacie X.509 wynosi 64 znaki. W związku z tym identyfikator rejestracji jest ograniczony do 64 znaków w przypadku używania certyfikatów X.509. W przypadku rejestracji grup identyfikator rejestracji jest również używany jako identyfikator urządzenia w usłudze IoT Hub.

    Nazwa pospolita podmiotu jest ustawiana przy użyciu parametru -subj . W poniższym poleceniu nazwa pospolita jest ustawiona na device-01.

    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
    

    Ważne

    Dodatkowy ukośnik podany dla nazwy podmiotu (//CN=device-01) jest wymagany tylko do ucieczki ciągu z usługą Git na platformach Windows. Na platformach Linux podaj nazwę podmiotu z pojedynczym ukośnikiem (/CN=device-01).

  3. Podpisz certyfikat urządzenia.

    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. Sprawdź certyfikat urządzenia:

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

    Zwróć uwagę, że wystawca jest pośrednim urzędem certyfikacji, a temat jest identyfikatorem rejestracji urządzenia, 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. Urządzenie musi przedstawić pełny łańcuch certyfikatów podczas uwierzytelniania w usłudze DPS. Użyj następującego polecenia, aby utworzyć łańcuch certyfikatów:

    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. Otwórz plik łańcucha certyfikatów . /certs/device-01-full-chain.cert.pem w edytorze tekstów, aby go zbadać. Tekst łańcucha certyfikatów zawiera pełny łańcuch wszystkich trzech certyfikatów. W dalszej części tego samouczka użyjesz tego łańcucha certyfikatów, aby aprowizować device-01usługę .

    Pełny tekst łańcucha ma następujący 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. Aby utworzyć klucz prywatny, certyfikat X.509 i certyfikat pełnego łańcucha dla drugiego urządzenia, skopiuj i wklej ten skrypt w wierszu polecenia powłoki Git Bash. Aby utworzyć certyfikaty dla większej liczby urządzeń, możesz zmodyfikować zmienną registration_id zadeklarowaną na początku skryptu.

    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
    

    Ważne

    Dodatkowy ukośnik podany dla nazwy podmiotu (//CN=$registration_id) jest wymagany tylko do ucieczki ciągu z usługą Git na platformach Windows. Na platformach Linux podaj nazwę podmiotu z pojedynczym ukośnikiem (/CN=$registration_id).

    Uwaga

    Ten skrypt używa identyfikatora rejestracji jako podstawowej nazwy pliku klucza prywatnego i plików certyfikatów. Jeśli identyfikator rejestracji zawiera znaki, które nie są prawidłowymi znakami nazwy pliku, należy odpowiednio zmodyfikować skrypt.

    Ostrzeżenie

    Tekst certyfikatów zawiera tylko informacje o kluczu publicznym.

    Jednak urządzenie musi mieć również dostęp do klucza prywatnego certyfikatu urządzenia. Jest to konieczne, ponieważ urządzenie musi przeprowadzić weryfikację przy użyciu tego klucza w czasie wykonywania podczas próby aprowizacji. Czułość tego klucza jest jednym z głównych powodów, dla których zaleca się użycie magazynu opartego na sprzęcie w rzeczywistym module HSM w celu zabezpieczenia kluczy prywatnych.

W pozostałej części tego samouczka użyjesz następujących plików:

Certyfikat Plik opis
Certyfikat głównego urzędu certyfikacji. certs/azure-iot-test-only.root.ca.cert.pem Przekazano do usługi DPS i zweryfikowano.
Certyfikat pośredniego urzędu certyfikacji certs/azure-iot-test-only.intermediate.cert.pem Służy do tworzenia grupy rejestracji w usłudze DPS.
klucz prywatny device-01 private/device-01.key.pem Używany przez urządzenie do weryfikowania własności certyfikatu urządzenia podczas uwierzytelniania za pomocą usługi DPS.
certyfikat pełnego łańcucha urządzenia-01 certs/device-01-full-chain.cert.pem Prezentowane przez urządzenie do uwierzytelniania i rejestrowania w usłudze DPS.
klucz prywatny device-02 private/device-02.key.pem Używany przez urządzenie do weryfikowania własności certyfikatu urządzenia podczas uwierzytelniania za pomocą usługi DPS.
certyfikat pełnego łańcucha urządzenia-02 certs/device-02-full-chain.cert.pem Prezentowane przez urządzenie do uwierzytelniania i rejestrowania w usłudze DPS.

Weryfikowanie własności certyfikatu głównego

Aby usługa DPS mogła zweryfikować łańcuch certyfikatów urządzenia podczas uwierzytelniania, należy przekazać i zweryfikować własność certyfikatu głównego urzędu certyfikacji. Aby dodać certyfikat głównego urzędu certyfikacji do wystąpienia usługi DPS, wykonaj następujące kroki:

  1. W witrynie Azure Portal przejdź do wystąpienia usługi Device Provisioning Service.

  2. Otwórz pozycję Certyfikaty z menu po lewej stronie, a następnie wybierz pozycję Dodaj , aby dodać nowy certyfikat.

  3. Wprowadź przyjazną nazwę wyświetlaną certyfikatu. Przejdź do lokalizacji pliku certs/azure-iot-test-only.root.ca.cert.pemcertyfikatu głównego urzędu certyfikacji . Wybierz Przekaż.

  4. Wybierz pole ustaw stan certyfikatu na zweryfikowane podczas przekazywania.

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

  5. Wybierz pozycję Zapisz.

  6. Upewnij się, że certyfikat jest wyświetlany na karcie certyfikatu ze stanem Zweryfikowano.

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

Aktualizowanie magazynu certyfikatów na urządzeniach z systemem Windows

Na urządzeniach z systemem innych niż Windows można przekazać łańcuch certyfikatów z kodu jako magazyn certyfikatów.

Na urządzeniach z systemem Windows należy dodać certyfikaty podpisywania (główny i pośredni) do magazynu certyfikatów systemu Windows. W przeciwnym razie certyfikaty podpisywania nie będą transportowane do usługi DPS przez bezpieczny kanał z protokołem Transport Layer Security (TLS).

Napiwek

Istnieje również możliwość używania protokołu OpenSSL zamiast bezpiecznego kanału (Schannel) z zestawem SDK języka C. Aby uzyskać więcej informacji na temat korzystania z biblioteki OpenSSL, zobacz Using OpenSSL in the SDK (Używanie biblioteki OpenSSL w zestawie SDK).

Aby dodać certyfikaty podpisywania do magazynu certyfikatów na urządzeniach z systemem Windows:

  1. W terminalu powłoki Git Bash przekonwertuj certyfikaty podpisywania na .pfx w następujący sposób.

    Certyfikat głównego urzędu certyfikacji:

    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
    

    Certyfikat pośredniego urzędu certyfikacji:

    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. Kliknij prawym przyciskiem myszy przycisk Start systemu Windows, a następnie wybierz polecenie Uruchom. Wprowadź certmgr.msc i wybierz przycisk OK , aby uruchomić menedżera certyfikatów.

  3. W Menedżerze certyfikatów w obszarze Certyfikaty — bieżący użytkownik wybierz pozycję Zaufane główne urzędy certyfikacji. Następnie w menu wybierz pozycję Akcja>Wszystkie zadania>importu.

  4. Postępuj zgodnie z instrukcjami Kreatora importu certyfikatów, aby zaimportować plik root.pfx.

    • Pamiętaj, aby wyszukać dane osobowe w programie Exchange (pfx)
    • Użyj 1234 jako hasła.
    • Umieść certyfikat w magazynie certyfikatów zaufanych głównych urzędów certyfikacji.
  5. Powtórz te kroki menedżera certyfikatów, aby zaimportować intermediate.pfxplik .

    • Umieść certyfikat w magazynie certyfikatów pośrednich urzędów certyfikacji.

Certyfikaty podpisywania są teraz zaufane na urządzeniu z systemem Windows, a pełny łańcuch można transportować do usługi DPS.

Tworzenie grupy rejestracji

  1. Zaloguj się do witryny Azure Portal i przejdź do wystąpienia usługi Device Provisioning Service.

  2. Wybierz pozycję Zarządzaj rejestracjami w sekcji Ustawienia menu nawigacji.

  3. W górnej części strony wybierz pozycję Dodaj grupę rejestracji.

  4. Na karcie Rejestracja i aprowizacja na stronie Dodawanie grupy rejestracji podaj następujące informacje, aby skonfigurować szczegóły grupy rejestracji:

    Pole opis
    Zaświadczanie Wybierz certyfikaty pośrednie X.509 jako mechanizm zaświadczania, jeśli chcesz przekazać certyfikaty pośrednie do użycia tylko dla tej grupy rejestracji, lub wybierz certyfikaty X.509 przekazane do tej usługi Device Provisioning, jeśli zostały już przekazane certyfikaty pośrednie.
    Ustawienia certyfikatu X.509 W zależności od wybranej metody zaświadczania przekaż lub wybierz podstawowe i pomocnicze certyfikaty pośrednie dla tej grupy rejestracji.
    Nazwa grupy Podaj nazwę grupy urządzeń. Nazwa grupy rejestracji jest ciągiem bez uwzględniania wielkości liter (do 128 znaków) znaków alfanumerycznych oraz znakami specjalnymi: '-', , '.''_', ':'. Ostatni znak musi być alfanumeryczny lub kreskowy ('-').
    Stan aprowizacji Zaznacz pole Włącz tę rejestrację, jeśli ta grupa rejestracji ma być dostępna do aprowizowania urządzeń. Usuń zaznaczenie tego pola, jeśli chcesz, aby grupa została wyłączona. To ustawienie można zmienić później.
    Zasady ponownej aprowizacji Wybierz zasady ponownej aprowizacji, które odzwierciedlają sposób obsługi urządzeń, które żądają ponownej aprowizacji przez usługę DPS. Aby uzyskać więcej informacji, zobacz Zasady ponownej aprowizacji

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

  5. Wybierz pozycję Dalej: centra IoT.

  6. Na karcie Centra IoT na stronie Dodawanie grupy rejestracji podaj następujące informacje, aby określić, które centra IoT mogą aprowizować urządzenia do:

    Pole opis
    Docelowe centra IoT Wybierz co najmniej jedno połączone centra IoT lub dodaj nowy link do centrum IoT. Aby dowiedzieć się więcej na temat łączenia centrów IoT z wystąpieniem usługi DPS, zobacz Jak połączyć centra IoT i zarządzać nimi.
    Zasady alokacji Jeśli wybrano więcej niż jedno połączone centrum IoT, wybierz sposób przypisywania urządzeń do różnych centrów. Aby dowiedzieć się więcej na temat zasad alokacji, zobacz Jak używać zasad alokacji.

    Jeśli wybrano tylko jedno połączone centrum IoT, zalecamy użycie zasad dystrybucji równomiernie ważonej.

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

  7. Wybierz pozycję Dalej: Ustawienia urządzenia

  8. Na karcie Ustawienia urządzenia na stronie Dodawanie grupy rejestracji podaj następujące informacje, aby zdefiniować sposób konfigurowania nowo aprowizowania urządzeń:

    Pole opis
    IoT Edge Sprawdź włączanie usługi IoT Edge na aprowidowanych urządzeniach, jeśli wszystkie urządzenia aprowidowane za pośrednictwem tej grupy będą uruchamiać usługę Azure IoT Edge. Usuń zaznaczenie tego pola, jeśli ta grupa dotyczy tylko urządzeń z obsługą usługi IoT Edge. Wszystkie urządzenia w grupie będą włączone w usłudze IoT Edge lub żadna z nich nie może być.
    Tagi urządzeń Użyj tego pola tekstowego, aby podać wszystkie tagi, które mają być stosowane do bliźniaczych reprezentacji urządzeń aprowizowania.
    Żądane właściwości Użyj tego pola tekstowego, aby podać żądane właściwości, które mają zostać zastosowane do bliźniaczych reprezentacji urządzeń aprowizowania.

    Aby uzyskać więcej informacji, zobacz Opis bliźniaczej reprezentacji urządzenia w usłudze IoT Hub oraz sposoby jej używania.

  9. Wybierz pozycję Dalej: Przeglądanie i tworzenie.

  10. Na karcie Przeglądanie i tworzenie sprawdź wszystkie wartości, a następnie wybierz pozycję Utwórz.

Przygotowywanie i uruchamianie kodu aprowizacji urządzenia

W tej sekcji zaktualizujesz przykładowy kod przy użyciu informacji o wystąpieniu usługi Device Provisioning Service. Jeśli urządzenie jest uwierzytelnione, jest przypisane do centrum IoT Hub połączonego z wystąpieniem usługi Device Provisioning Service skonfigurowanym w tej sekcji.

W tej sekcji użyjesz monitu powłoki Git Bash i środowiska IDE programu Visual Studio.

Konfigurowanie kodu urządzenia aprowizacji

W tej sekcji zaktualizujesz przykładowy kod przy użyciu informacji o wystąpieniu usługi Device Provisioning Service.

  1. W witrynie Azure Portal wybierz kartę Przegląd dla wystąpienia usługi Device Provisioning Service i zanotuj wartość Zakres identyfikatora.

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

  2. Uruchom program Visual Studio i otwórz nowy plik rozwiązania utworzony w cmake katalogu głównym repozytorium git azure-iot-sdk-c. Plik rozwiązania ma nazwę azure_iot_sdks.sln.

  3. W programie Eksplorator rozwiązań dla programu Visual Studio przejdź do Provision_Samples > pliki źródłowe prov_dev_client_sample > i otwórz plik prov_dev_client_sample.c.

  4. Znajdź stałą id_scope i zastąp jej wartość wcześniej skopiowaną wartością Zakres identyfikatorów. Na przykład:

    static const char* id_scope = "0ne00000A0A";
    
  5. Znajdź definicję funkcji main() w tym samym pliku. Upewnij się, że zmienna jest ustawiona hsm_type na SECURE_DEVICE_TYPE_X509 i że wszystkie inne hsm_type wiersze są oznaczane jako komentarz. Na przykład:

    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. Zapisz zmiany.

  7. Kliknij prawym przyciskiem myszy projekt prov_dev_client_sample i wybierz polecenie Ustaw jako projekt startowy.

Konfigurowanie niestandardowego kodu wycinkowego modułu HSM

Specyfika interakcji z rzeczywistym bezpiecznym magazynem opartym na sprzęcie różni się w zależności od sprzętu urządzenia. Łańcuchy certyfikatów używane przez symulowane urządzenia w tym samouczku będą zakodowane na stałe w niestandardowym kodzie wycinkowym modułu HSM. W rzeczywistym scenariuszu łańcuch certyfikatów będzie przechowywany w rzeczywistym sprzęcie HSM w celu zapewnienia lepszego bezpieczeństwa poufnych informacji. Metody podobne do metod wycinków używanych w tym przykładzie zostaną zaimplementowane w celu odczytania wpisów tajnych z tego magazynu opartego na sprzęcie.

Chociaż sprzęt HSM nie jest wymagany, zaleca się ochronę poufnych informacji, takich jak klucz prywatny certyfikatu. Jeśli rzeczywisty moduł HSM był wywoływany przez przykład, klucz prywatny nie będzie obecny w kodzie źródłowym. Posiadanie klucza w kodzie źródłowym uwidacznia klucz każdemu, kto może wyświetlić kod. Jest to wykonywane tylko w tym samouczku, aby ułatwić naukę.

Aby zaktualizować niestandardowy kod wycinkowy modułu HSM w celu symulowania tożsamości urządzenia o identyfikatorze device-01:

  1. W Eksplorator rozwiązań dla programu Visual Studio przejdź do Provision_Samples pliki > źródłowe custom_hsm_example > i otwórz plik custom_hsm_example.c.

  2. Zaktualizuj wartość ciągu stałej COMMON_NAME ciągu przy użyciu nazwy pospolitej użytej podczas generowania certyfikatu urządzenia.

    static const char* const COMMON_NAME = "device-01";
    
  3. W terminalu powłoki Git Bash uruchom następujące polecenie, aby wygenerować stałą ciągu dla certyfikatu urządzenia:

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

    Skopiuj dane wyjściowe tego polecenia.

  4. Zaktualizuj wartość ciągu stałego CERTIFICATE przy użyciu łańcucha certyfikatów zapisanego w pliku ./certs/device-01-full-chain.cert.pem po wygenerowaniu certyfikatów. Użyj tekstu certyfikatu wyjściowego z poprzedniego kroku dla wartości stałej.

    Składnia tekstu certyfikatu musi być zgodna z poniższym wzorcem bez dodatkowych spacji ani analizowania wykonanych przez program Visual Studio.

    // <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. W powłoce Git Bash uruchom następujące polecenie, aby wygenerować stałą ciągu dla klucza prywatnego urządzenia:

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

    Skopiuj dane wyjściowe tego polecenia.

  6. Zaktualizuj wartość ciągu stałej PRIVATE_KEY przy użyciu klucza prywatnego certyfikatu urządzenia. Użyj wyjściowego tekstu klucza prywatnego z poprzedniego kroku dla wartości stałej.

    Składnia tekstu klucza prywatnego musi być zgodna z poniższym wzorcem bez dodatkowych spacji ani analizowania wykonywanego przez program Visual Studio.

    static const char* const PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----\n"
    "MIIJJwIBAAKCAgEAtjvKQjIhp0EE1PoADL1rfF/W6v4vlAzOSifKSQsaPeebqg8U\n"
        ...
    "X7fi9OZ26QpnkS5QjjPTYI/wwn0J9YAwNfKSlNeXTJDfJ+KpjXBcvaLxeBQbQhij\n"
    "-----END RSA PRIVATE KEY-----";
    
  7. Zapisz zmiany.

  8. Kliknij prawym przyciskiem myszy projekt custom_hsm_example i wybierz polecenie Kompiluj.

    Ważne

    Przed utworzeniem pozostałej części rozwiązania w następnej sekcji należy skompilować projekt custom_hsm_example .

Uruchamianie aplikacji przykładowej

  1. Z menu programu Visual Studio wybierz pozycję Debuguj>Uruchom bez debugowania, aby uruchomić rozwiązanie. Po wyświetleniu monitu o ponowne skompilowanie projektu wybierz pozycję Tak , aby ponownie skompilować projekt przed uruchomieniem.

    Poniższe dane wyjściowe to przykład pomyślnego uruchomienia symulowanego urządzenia device-01 i nawiązania połączenia z usługą aprowizacji. Urządzenie zostało przypisane do centrum IoT Hub i zarejestrowane:

    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. Powtórz kroki opisane w temacie Konfigurowanie niestandardowego kodu wycinkowego modułu HSM dla drugiego urządzenia (device-02) i ponownie uruchom przykład. Użyj następujących wartości dla tego urządzenia:

    Opis Wartość
    Nazwa pospolita "device-02"
    Pełny łańcuch certyfikatów Generowanie tekstu przy użyciu pliku ./certs/device-02-full-chain.cert.pem
    Klucz prywatny Generowanie tekstu przy użyciu pliku ./private/device-02.key.pem

    Poniższe dane wyjściowe to przykład pomyślnego uruchomienia symulowanego urządzenia device-02 i nawiązania połączenia z usługą aprowizacji. Urządzenie zostało przypisane do centrum IoT Hub i zarejestrowane:

    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:
    

Przykładowy kod języka C# został skonfigurowany do używania certyfikatów X.509 przechowywanych w pliku sformatowanym za pomocą hasła PKCS#12 (pfx). Utworzone wcześniej certyfikaty pełnego łańcucha są w formacie PEM. Aby przekonwertować certyfikaty pełnego łańcucha na format PKCS#12, wprowadź następujące polecenia w wierszu polecenia powłoki Git Bash z katalogu, w którym wcześniej uruchomiono polecenia OpenSSL.

  • 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
    

W pozostałej części tej sekcji użyj wiersza polecenia systemu Windows.

  1. W witrynie Azure Portal wybierz kartę Przegląd dla usługi Device Provisioning Service.

  2. Skopiuj wartość Zakres identyfikatora.

    Screenshot of the ID scope on Azure portal.

  3. W wierszu polecenia systemu Windows przejdź do katalogu X509Sample . Ten katalog znajduje się w repozytorium zestawu SDK sklonowanym we wcześniejszym kroku: .\azure-iot-sdk-csharp\provisioning\device\samples\getting started\X509Sample.

  4. Wprowadź następujące polecenie, aby skompilować i uruchomić przykład aprowizacji urządzeń X.509. Zastąp <id-scope> wartość zakresem identyfikatora skopiowaną z witryny Azure Portal. Zastąp <your-certificate-folder> ciąg ścieżką do folderu, w którym uruchomiono polecenia OpenSSL.

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

    Urządzenie łączy się z usługą DPS i jest przypisane do centrum IoT. Następnie urządzenie wysyła komunikat telemetryczny do centrum IoT. Powinny zostać wyświetlone dane wyjściowe podobne do następującego przykładu:

    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.
    

    Uwaga

    Jeśli nie określisz certyfikatu i hasła w wierszu polecenia, plik certyfikatu będzie domyślnie ustawiony na ./certificate.pfx i zostanie wyświetlony monit o podanie hasła.

    Można przekazać dodatkowe parametry, aby zmienić typ transportu (-t) i parametr GlobalDeviceEndpoint (-g). Aby uzyskać pełną listę parametrów typu dotnet run -- --help.

  5. Aby zarejestrować drugie urządzenie, uruchom ponownie przykład przy użyciu certyfikatu pełnego łańcucha.

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

W poniższych krokach użyj wiersza polecenia systemu Windows.

  1. W witrynie Azure Portal wybierz kartę Przegląd dla usługi Device Provisioning Service.

  2. Skopiuj wartość Zakres identyfikatora.

    Screenshot of the ID scope in the Azure portal.

  3. W wierszu polecenia systemu Windows przejdź do przykładowego katalogu i zainstaluj pakiety wymagane przez przykład. Wyświetlona ścieżka jest względna do lokalizacji, w której sklonowany zestaw SDK.

    cd .\azure-iot-sdk-node\provisioning\device\samples
    npm install
    
  4. W folderze provisioning\device\samples otwórz register_x509.js i przejrzyj kod.

    Przykładowa wartość domyślna to MQTT jako protokół transportowy. Jeśli chcesz użyć innego protokołu, oznacz następujący wiersz jako komentarz i usuń komentarz z wiersza dla odpowiedniego protokołu.

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

    W przykładzie użyto pięciu zmiennych środowiskowych do uwierzytelniania i aprowizacji urządzenia IoT przy użyciu usługi DPS. Te zmienne środowiskowe to:

    Nazwa zmiennej opis
    PROVISIONING_HOST Punkt końcowy używany do nawiązywania połączenia z wystąpieniem usługi DPS. Na potrzeby tego samouczka użyj globalnego punktu końcowego, global.azure-devices-provisioning.net.
    PROVISIONING_IDSCOPE Zakres identyfikatora wystąpienia usługi DPS.
    PROVISIONING_REGISTRATION_ID Identyfikator rejestracji urządzenia. Musi być zgodna z nazwą pospolitą podmiotu w certyfikacie urządzenia.
    CERTIFICATE_FILE Ścieżka do pliku certyfikatu pełnego łańcucha urządzenia.
    KEY_FILE Ścieżka do pliku klucza prywatnego certyfikatu urządzenia.

    Metoda ProvisioningDeviceClient.register() próbuje zarejestrować urządzenie.

  5. Dodaj zmienne środowiskowe dla globalnego punktu końcowego urządzenia i zakresu identyfikatorów. Zastąp <id-scope> wartość skopiowaną z witryny Azure Portal.

    set PROVISIONING_HOST=global.azure-devices-provisioning.net
    set PROVISIONING_IDSCOPE=<id-scope>
    
  6. Ustaw zmienną środowiskową dla identyfikatora rejestracji urządzenia. Identyfikator rejestracji urządzenia IoT musi być zgodny z nazwą pospolitą podmiotu w certyfikacie urządzenia. W tym samouczku parametr device-01 jest zarówno nazwą podmiotu, jak i identyfikatorem rejestracji urządzenia.

    set PROVISIONING_REGISTRATION_ID=device-01
    
  7. Ustaw zmienne środowiskowe dla wygenerowanego wcześniej certyfikatu pełnego łańcucha urządzeń i plików klucza prywatnego urządzenia. Zastąp <your-certificate-folder> ciąg ścieżką do folderu, w którym uruchomiono polecenia OpenSSL.

    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. Uruchom przykład i sprawdź, czy urządzenie zostało pomyślnie zainicjowane.

    node register_x509.js
    

    Powinny zostać wyświetlone dane wyjściowe podobne do następującego przykładu:

    registration succeeded
    assigned hub=contoso-hub-2.azure-devices.net
    deviceId=device-01
    Client connected
    send status: MessageEnqueued
    
  9. Zaktualizuj zmienne środowiskowe dla drugiego urządzenia (device-02) zgodnie z poniższą tabelą i ponownie uruchom przykład.

    Zmienna środowiskowa Wartość
    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

W poniższych krokach użyj wiersza polecenia systemu Windows.

  1. W witrynie Azure Portal wybierz kartę Przegląd dla usługi Device Provisioning Service.

  2. Skopiuj zakres identyfikatora.

    Screenshot of the ID scope in the Azure portal.

  3. W wierszu polecenia systemu Windows przejdź do katalogu przykładu provision_x509.py . Wyświetlona ścieżka jest względna do lokalizacji, w której sklonowany zestaw SDK.

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

    W tym przykładzie użyto sześciu zmiennych środowiskowych do uwierzytelniania i aprowizacji urządzenia IoT przy użyciu usługi DPS. Te zmienne środowiskowe to:

    Nazwa zmiennej opis
    PROVISIONING_HOST Punkt końcowy używany do nawiązywania połączenia z wystąpieniem usługi DPS. Na potrzeby tego samouczka użyj globalnego punktu końcowego, global.azure-devices-provisioning.net.
    PROVISIONING_IDSCOPE Zakres identyfikatora wystąpienia usługi DPS.
    DPS_X509_REGISTRATION_ID Identyfikator rejestracji urządzenia. Musi być zgodna z nazwą pospolitą podmiotu w certyfikacie urządzenia.
    X509_CERT_FILE Ścieżka do pliku certyfikatu pełnego łańcucha urządzenia.
    X509_KEY_FILE Ścieżka do pliku klucza prywatnego certyfikatu urządzenia.
    PASS_PHRASE Fraza dostępu używana do szyfrowania pliku klucza prywatnego (jeśli jest używana). Nie jest to wymagane w tym samouczku.
  4. Dodaj zmienne środowiskowe dla globalnego punktu końcowego urządzenia i zakresu identyfikatorów. W przypadku zmiennej zakresu identyfikatorów użyj wartości skopiowanej z witryny Azure Portal.

    set PROVISIONING_HOST=global.azure-devices-provisioning.net
    set PROVISIONING_IDSCOPE=<ID scope for your DPS resource>
    
  5. Ustaw zmienną środowiskową dla identyfikatora rejestracji urządzenia. Identyfikator rejestracji urządzenia IoT musi być zgodny z nazwą pospolitą podmiotu w certyfikacie urządzenia. W tym samouczku parametr device-01 jest zarówno nazwą podmiotu, jak i identyfikatorem rejestracji urządzenia.

    set DPS_X509_REGISTRATION_ID=device-01
    
  6. Ustaw zmienne środowiskowe dla wygenerowanego wcześniej certyfikatu pełnego łańcucha urządzeń i plików klucza prywatnego urządzenia. Zastąp <your-certificate-folder> ciąg ścieżką do folderu, w którym uruchomiono polecenia OpenSSL.

    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. Przejrzyj kod provision_x509.py. Jeśli nie używasz języka Python w wersji 3.7 lub nowszej, wprowadź zmianę kodu wymienioną tutaj , aby zastąpić element asyncio.run(main()).

  8. Uruchom przykład. Przykład łączy się z usługą DPS, która będzie aprowizować urządzenie w centrum IoT. Po aprowizacji urządzenia przykład wysyła kilka komunikatów testowych do centrum IoT.

    python provision_x509.py
    

    Powinny zostać wyświetlone dane wyjściowe podobne do następującego przykładu:

    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. Zaktualizuj zmienne środowiskowe dla drugiego urządzenia (device-02) zgodnie z poniższą tabelą i ponownie uruchom przykład.

    Zmienna środowiskowa Wartość
    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

W poniższych krokach użyjesz zarówno wiersza polecenia systemu Windows, jak i wiersza polecenia powłoki Git Bash.

  1. W witrynie Azure Portal wybierz kartę Przegląd dla usługi Device Provisioning Service.

  2. Skopiuj zakres identyfikatora.

    Screenshot of the ID scope in the Azure portal.

  3. W wierszu polecenia systemu Windows przejdź do folderu przykładowego projektu. Wyświetlona ścieżka jest względna do lokalizacji, w której sklonowany zestaw SDK

    cd .\azure-iot-sdk-java\provisioning\provisioning-device-client-samples\provisioning-X509-sample
    
  4. Wprowadź informacje o tożsamości usługi aprowizacji i X.509 w przykładowym kodzie. Jest to używane podczas aprowizacji na potrzeby zaświadczania symulowanego urządzenia przed rejestracją urządzenia.

    1. Otwórz plik .\src\main\java\samples\com\microsoft\azure\sdk\iot\ProvisioningX509Sample.java w ulubionym edytorze.

    2. Zaktualizuj następujące wartości. W przypadku idScopeprogramu użyj skopiowanego wcześniej zakresu identyfikatora. W przypadku globalnego punktu końcowego użyj globalnego punktu końcowego urządzenia. Ten punkt końcowy jest taki sam dla każdego wystąpienia usługi DPS. 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. Przykład domyślnie używa protokołu HTTPS jako protokołu transportowego. Jeśli chcesz zmienić protokół, oznacz następujący wiersz jako komentarz i usuń komentarz z wiersza dla protokołu, którego chcesz użyć.

      private static final ProvisioningDeviceClientTransportProtocol PROVISIONING_DEVICE_CLIENT_TRANSPORT_PROTOCOL = ProvisioningDeviceClientTransportProtocol.HTTPS;
      
    4. Zaktualizuj wartość leafPublicPem ciągu stałego przy użyciu wartości certyfikatu urządzenia device-01.cert.pem.

      Składnia tekstu certyfikatu musi być zgodna z poniższym wzorcem bez dodatkowych spacji ani znaków.

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

      Ręczne aktualizowanie tej wartości ciągu może być podatne na błąd. Aby wygenerować właściwą składnię, możesz skopiować i wkleić następujące polecenie w wierszu polecenia powłoki Git Bash i nacisnąć klawisz ENTER. To polecenie generuje składnię stałej leafPublicPem wartości ciągu i zapisuje ją w danych wyjściowych.

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

      Skopiuj i wklej tekst wyjściowego certyfikatu dla stałej wartości.

    5. Zaktualizuj wartość ciągu stałej leafPrivateKey za pomocą niezaszyfrowanego klucza prywatnego certyfikatu urządzenia, unencrypted-device-key.pem.

      Składnia tekstu klucza prywatnego musi być zgodna z poniższym wzorcem bez dodatkowych spacji ani znaków.

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

      Aby wygenerować właściwą składnię, możesz skopiować i wkleić następujące polecenie w wierszu polecenia powłoki Git Bash i nacisnąć klawisz ENTER. To polecenie generuje składnię stałej leafPrivateKey wartości ciągu i zapisuje ją w danych wyjściowych.

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

      Skopiuj i wklej wyjściowy tekst klucza prywatnego dla wartości stałej.

    6. Dodaj ciąg stały z wartością rootPublicPem certyfikatu głównego urzędu certyfikacji azure-iot-test-only.root.ca.cert.pem. Możesz dodać ją tuż po stałej leafPrivateKey .

      Składnia tekstu certyfikatu musi być zgodna z poniższym wzorcem bez dodatkowych spacji ani znaków.

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

      Aby wygenerować właściwą składnię, możesz skopiować i wkleić następujące polecenie w wierszu polecenia powłoki Git Bash i nacisnąć klawisz ENTER. To polecenie generuje składnię stałej rootPublicPem wartości ciągu i zapisuje ją w danych wyjściowych.

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

      Skopiuj i wklej tekst wyjściowego certyfikatu dla stałej wartości.

    7. Dodaj ciąg stały z wartością intermediatePublicPem certyfikatu pośredniego urzędu certyfikacji azure-iot-test-only.intermediate.cert.pem. Możesz dodać ją tuż po poprzedniej stałej.

      Składnia tekstu certyfikatu musi być zgodna z poniższym wzorcem bez dodatkowych spacji ani znaków.

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

      Aby wygenerować właściwą składnię, możesz skopiować i wkleić następujące polecenie w wierszu polecenia powłoki Git Bash i nacisnąć klawisz ENTER. To polecenie generuje składnię stałej intermediatePublicPem wartości ciągu i zapisuje ją w danych wyjściowych.

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

      Skopiuj i wklej tekst wyjściowego certyfikatu dla stałej wartości.

    8. Znajdź następujące wiersze w metodzie main .

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

      Dodaj te dwa wiersze bezpośrednio pod nimi, aby dodać certyfikaty pośredniego i głównego urzędu certyfikacji do łańcucha podpisywania. Łańcuch podpisywania powinien zawierać cały łańcuch certyfikatów do i uwzględnić certyfikat zweryfikowany za pomocą usługi DPS.

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

      Uwaga

      Kolejność dodawania certyfikatów podpisywania jest ważna. Przykład zakończy się niepowodzeniem, jeśli zostanie zmieniony.

    9. Zapisz zmiany.

  5. Skompiluj przykład, a następnie przejdź do target folderu .

    mvn clean install
    cd target
    
  6. Dane wyjściowe kompilacji .jar pliku w target folderze o następującym formacie pliku: provisioning-x509-sample-{version}-with-deps.jarna przykład : provisioning-x509-sample-1.8.1-with-deps.jar. Wykonaj plik .jar. Może być konieczne zastąpienie wersji w poniższym poleceniu.

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

    Przykład łączy się z usługą DPS, która aprowizuje urządzenie do centrum IoT. Po aprowizacji urządzenia przykład wyśle kilka komunikatów testowych do centrum 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. Zaktualizuj stałe dla drugiego urządzenia () zgodniedevice-02 z poniższą tabelą, ponownie skompiluj i uruchom ponownie przykład.

    Stała Plik do użycia
    leafPublicPem ./certs/device-02.cert.pem
    leafPrivateKey ./private/device-02.key.pem

Potwierdzanie rejestracji aprowizacji urządzeń

Sprawdź rekordy rejestracji grupy rejestracji, aby wyświetlić szczegóły rejestracji dla urządzeń:

  1. W witrynie Azure Portal przejdź do wystąpienia usługi Device Provisioning Service.

  2. W menu Ustawienia wybierz pozycję Zarządzaj rejestracjami.

  3. Wybierz pozycję Grupy rejestracji. Na liście powinien zostać wyświetlony wpis grupy rejestracji X.509, który został utworzony wcześniej.

  4. Wybierz wpis rejestracji. Następnie wybierz pozycję Szczegóły obok pozycji Stan rejestracji, aby wyświetlić urządzenia zarejestrowane za pośrednictwem grupy rejestracji. Centrum IoT, do którego przypisano każde z Twoich urządzeń, ich identyfikatory urządzeń oraz daty i godziny ich zarejestrowania, są wyświetlane na liście.

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

  5. Możesz wybrać jedno z urządzeń, aby wyświetlić dodatkowe szczegóły dotyczące tego urządzenia.

Aby sprawdzić urządzenia w centrum IoT:

  1. W witrynie Azure Portal przejdź do centrum IoT Hub, do którego przypisano Urządzenie.

  2. W menu Zarządzanie urządzeniami wybierz pozycję Urządzenia.

  3. Jeśli urządzenia zostały pomyślnie aprowizowane, ich identyfikatory urządzeń, device-01 i device-02 powinny być wyświetlane na liście z ustawionym stanem ustawionym jako włączone. Jeśli urządzenia nie są widoczne, wybierz pozycję Odśwież.

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

Czyszczenie zasobów

Po zakończeniu testowania i eksplorowania tego przykładu klienta urządzenia wykonaj następujące kroki, aby usunąć wszystkie zasoby utworzone w tym samouczku.

  1. Zamknij okno danych wyjściowych przykładu klienta urządzenia na swojej maszynie.

Usuwanie grupy rejestracji

  1. W menu po lewej stronie w witrynie Azure Portal wybierz pozycję Wszystkie zasoby.

  2. Wybierz wystąpienie usługi DPS.

  3. W menu Ustawienia wybierz pozycję Zarządzaj rejestracjami.

  4. Wybierz kartę Grupy rejestracji.

  5. Wybierz grupę rejestracji używaną na potrzeby tego samouczka.

  6. Na stronie Szczegóły rejestracji wybierz pozycję Szczegóły obok pozycji Stan rejestracji. Następnie zaznacz pole wyboru obok nagłówka kolumny Identyfikator urządzenia, aby wybrać wszystkie rekordy rejestracji dla grupy rejestracji. Wybierz pozycję Usuń w górnej części strony, aby usunąć rekordy rejestracji.

    Ważne

    Usunięcie grupy rejestracji nie powoduje usunięcia skojarzonych z nią rekordów rejestracji. Te oddzielone rekordy będą liczone względem limitu przydziału rejestracji dla wystąpienia usługi DPS. Z tego powodu najlepszym rozwiązaniem jest usunięcie wszystkich rekordów rejestracji skojarzonych z grupą rejestracji przed usunięciem samej grupy rejestracji.

  7. Wróć do strony Zarządzanie rejestracjami i upewnij się, że wybrano kartę Grupy rejestracji.

  8. Zaznacz pole wyboru obok nazwy grupy rejestracji użytej na potrzeby tego samouczka.

  9. W górnej części strony wybierz pozycję Usuń.

Usuwanie zarejestrowanych certyfikatów urzędu certyfikacji z usługi DPS

  1. Wybierz pozycję Certyfikaty z menu po lewej stronie wystąpienia usługi DPS. Dla każdego przekazanego i zweryfikowanego certyfikatu w tym samouczku wybierz certyfikat, a następnie wybierz pozycję Usuń i potwierdź wybór, aby go usunąć.

Usuwanie rejestracji urządzeń z usługi IoT Hub

  1. W menu po lewej stronie w witrynie Azure Portal wybierz pozycję Wszystkie zasoby.

  2. Wybierz centrum IoT Hub.

  3. W menu Eksploratory wybierz pozycję Urządzenia IoT.

  4. Zaznacz pole wyboru obok identyfikatora urządzenia urządzeń zarejestrowanych w tym samouczku. Na przykład device-01 i device-02.

  5. W górnej części strony wybierz pozycję Usuń.

Następne kroki

W tym samouczku zainicjowano obsługę wielu urządzeń X.509 w centrum IoT Przy użyciu grupy rejestracji. Następnie dowiedz się, jak aprowizować urządzenia IoT w wielu centrach.