Självstudie: Etablera flera X.509-enheter med hjälp av registreringsgrupper
I den här självstudien lär du dig hur du etablerar grupper av IoT-enheter som använder X.509-certifikat för autentisering. Exempel på enhetskod från Azure IoT SDK körs på utvecklingsdatorn för att simulera etablering av X.509-enheter. På verkliga enheter distribueras och körs enhetskoden från IoT-enheten.
Azure IoT Hub Device Provisioning Service stöder två typer av registreringar för etableringsenheter:
- Registreringsgrupper: används för att registrera flera relaterade enheter. Den här självstudien visar etablering med registreringsgrupper.
- Enskilda registreringar: Används för att registrera en enskild enhet.
Azure IoT Hub Device Provisioning Service stöder tre former av autentisering för etablering av enheter:
- X.509-certifikat – Den här självstudien visar X.509-certifikatattestering
- Betrodd plattformsmodul (TPM)
- Symmetriska nycklar
I produktionsscenarier används en maskinvarusäkerhetsmodul (HSM) för säker, maskinvarubaserad lagring av enhetshemligheter. En HSM kan användas med symmetrisk nyckel, X.509-certifikat eller TPM-attestering för att tillhandahålla säker lagring för hemligheter. Maskinvarubaserad lagring av enhetshemligheter rekommenderas för att skydda känslig information som enhetscertifikatets privata nyckel.
I den här självstudien slutför du följande mål:
- Skapa en förtroendekedja för certifikat för att organisera en uppsättning enheter med X.509-certifikat.
- Skapa en ny gruppregistrering som använder certifikatkedjan.
- Konfigurera utvecklingsmiljön.
- Etablera enheter med hjälp av certifikatkedjan med hjälp av exempelkod i Azure IoT-enhetens SDK.
Förutsättningar
Om du inte har någon Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar.
Slutför stegen i Konfigurera IoT Hub Device Provisioning Service med Azure Portal.
Följande förutsättningar gäller för en Windows-utvecklingsmiljö som används för att simulera enheterna. För Linux eller macOS, se lämpligt avsnitt i Förbereda utvecklingsmiljön i SDK-dokumentationen.
Installera Visual Studio 2022 med arbetsbelastningen "Skrivbordsutveckling med C++" aktiverad. Visual Studio 2015, Visual Studio 2017 och Visual Studio 19 stöds också.
Installera det senaste CMake-byggsystemet. Kontrollera att du kontrollerar alternativet som lägger till den körbara CMake-filen i sökvägen.
Viktigt!
Kontrollera att kraven för Visual Studio (Visual Studio och arbetsbelastningen Skrivbordsutveckling med C++) är installerade på datorn innan du
CMake
startar installationen. När förutsättningarna är uppfyllda och nedladdningen har verifierats installerar du CMake-byggesystemet. Tänk också på att äldre versioner av CMake-byggsystemet inte genererar den lösningsfil som används i den här självstudien. Se till att använda den senaste versionen av CMake.
Följande krav gäller för en Windows-utvecklingsmiljö. För Linux eller macOS, se lämpligt avsnitt i Förbereda utvecklingsmiljön i SDK-dokumentationen.
Installera .NET SDK 6.0 eller senare på din Windows-baserade dator. Du kan använda följande kommando för att kontrollera din version.
dotnet --info
Följande krav gäller för en Windows-utvecklingsmiljö. För Linux eller macOS, se lämpligt avsnitt i Förbereda utvecklingsmiljön i SDK-dokumentationen.
- Installera Node.js v4.0 eller senare på datorn.
Följande krav gäller för en Windows-utvecklingsmiljö.
- Python 3.6 eller senare på datorn.
Följande krav gäller för en Windows-utvecklingsmiljö. För Linux eller macOS, se lämpligt avsnitt i Förbereda utvecklingsmiljön i SDK-dokumentationen.
Installera Java SE Development Kit 8 eller senare på datorn.
Ladda ned och installera Maven.
Installera den senaste versionen av Git. Kontrollera att Git har lagts till i de miljövariabler som är tillgängliga för kommandofönstret.
Kontrollera att OpenSSL är installerat på datorn. I Windows innehåller installationen av Git en installation av OpenSSL. Du kan komma åt OpenSSL från Git Bash-prompten. Om du vill kontrollera att OpenSSL är installerat öppnar du en Git Bash-prompt och anger
openssl version
.Kommentar
Om du inte är bekant med OpenSSL och redan har installerat det på din Windows-dator rekommenderar vi att du använder OpenSSL från Git Bash-prompten. Du kan också välja att ladda ned källkoden och skapa OpenSSL. Om du väljer att skapa eller ladda ned OpenSSL kontrollerar du att OpenSSL-binärfilen är tillgänglig i sökvägen och att
OPENSSL_CNF
miljövariabeln är inställd på sökvägen till filen openssl.cnf .
Förbereda utvecklingsmiljön
I det här avsnittet förbereder du en utvecklingsmiljö som används för att skapa Azure IoT C SDK. SDK innehåller exempelkod och verktyg som används av enheter som etablerar med DPS.
I en webbläsare går du till versionssidan för Azure IoT C SDK.
Kopiera taggnamnet för den senaste versionen av Azure IoT C SDK, till exempel:
lts_03_2024
.Öppna en Windows-kommandotolk och kör följande kommandon för att klona den senaste versionen av Azure IoT Device SDK för C GitHub-lagringsplatsen. Ersätt
<release-tag>
med taggen som du kopierade i föregående steg.git clone -b <release-tag> https://github.com/Azure/azure-iot-sdk-c.git cd azure-iot-sdk-c git submodule update --init
Den här åtgärden kan ta flera minuter att slutföra.
När åtgärden är klar kör du följande kommandon från
azure-iot-sdk-c
katalogen:mkdir cmake cd cmake
I kodexemplet används ett X.509-certifikat för att tillhandahålla attestering via X.509-autentisering. Kör följande kommando för att skapa en version av SDK:n som är specifik för din utvecklingsplattform som innehåller enhetsetableringsklienten. En Visual Studio-lösning för den simulerade enheten genereras i
cmake
katalogen.Ersätt
<path
med den absoluta sökvägen till den C SDK som du klonade.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 ..
Dricks
Om
cmake
du inte hittar C++-kompilatorn kan du få byggfel när du kör kommandot ovan. Om det händer kan du prova att köra kommandot i Visual Studio-kommandotolken.När bygget lyckas ser de sista utdataraderna ut ungefär som följande utdata:
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
Öppna en Windows-kommandotolk och klona Azure IoT SDK för C# GitHub-lagringsplatsen med följande kommando:
git clone https://github.com/Azure/azure-iot-sdk-csharp.git
Öppna en Windows-kommandotolk och klona Azure IoT SDK för Node.js GitHub-lagringsplats med följande kommando:
git clone https://github.com/Azure/azure-iot-sdk-node.git
Öppna en Windows-kommandotolk och klona Azure IoT Device SDK för Python GitHub-lagringsplatsen med följande kommando:
git clone -b v2 https://github.com/Azure/azure-iot-sdk-python.git --recursive
Kommentar
Exemplen som används i den här självstudien finns i v2-grenen på azure-iot-sdk-python-lagringsplatsen. V3 av Python SDK är tillgängligt för användning i betaversion.
Öppna en Windows-kommandotolk och klona Azure IoT-exempel för Java GitHub-lagringsplatsen med följande kommando:
git clone https://github.com/Azure/azure-iot-sdk-java.git --recursive
Gå till rotkatalogen
azure-iot-sdk-java
och skapa projektet för att ladda ned alla paket som behövs.cd azure-iot-sdk-java mvn install -DskipTests=true
Skapa en X.509-certifikatkedja
I det här avsnittet genererar du en X.509-certifikatkedja med tre certifikat för testning av varje enhet med den här självstudien. Certifikaten har följande hierarki.
Rotcertifikat Du laddar upp och verifierar rotcertifikatet med DPS. Den här verifieringen gör det möjligt för DPS att lita på certifikatet och verifiera certifikat som har signerats av det.
Mellanliggande certifikat: Det är vanligt att använda mellanliggande certifikat för att gruppera enheter logiskt efter produktrader, företagsdivisioner eller andra kriterier. I den här självstudien används en certifikatkedja med ett mellanliggande certifikat, men i ett produktionsscenario kan du ha flera. Mellanliggande certifikat i den här kedjan signeras av rotcertifikatet. Det här certifikatet tillhandahålls till registreringsgruppen som skapats i DPS. Med den här konfigurationen kan du hantera en hel grupp enheter som har enhetscertifikat signerade av samma mellanliggande certifikat.
Enhetscertifikat: Ett enhetscertifikat (kallas ibland ett lövcertifikat) signeras av det mellanliggande certifikatet och lagras på enheten tillsammans med dess privata nyckel. Helst skulle dessa känsliga objekt lagras säkert med en HSM. Flera enhetscertifikat kan signeras av samma mellanliggande certifikat. Varje enhet visar sitt certifikat och sin privata nyckel, tillsammans med certifikatkedjan, vid försök att etablera.
Mer information om certifikatkedjor finns i X.509-certifikatattestering.
Konfigurera X.509 OpenSSL-miljön
I det här avsnittet skapar du Opensl-konfigurationsfiler, katalogstruktur och andra filer som används av Openssl-kommandona.
Öppna en Git Bash-kommandotolk och gå till en mapp där du vill generera X.509-certifikaten och nycklarna för den här självstudien.
Skapa en OpenSSL-konfigurationsfil med namnet openssl_root_ca.cnf för rotcertifikatutfärdarcertifikatet. OpenSSL-konfigurationsfiler innehåller principer och definitioner som används av OpenSSL-kommandon. Kopiera och klistra in följande text i filen 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
Skapa en OpenSSL-konfigurationsfil med namnet openssl_device_intermediate_ca.cnf som ska användas för mellanliggande certifikat och enhetscertifikat. Kopiera och klistra in följande text i filen 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
Skapa katalogstrukturen, databasfilen index.txt och serienummerfilens seriell som används av OpenSSL-kommandon i den här självstudien:
mkdir certs csr newcerts private touch index.txt openssl rand -hex 16 > serial
Skapa ett rotcertifikatutfärdarcertifikat
Kör följande kommandon för att skapa en privat rotcertifikatutfärdare och ett rotcertifikatutfärdarcertifikat. Du använder det här certifikatet och nyckeln för att signera ditt mellanliggande certifikat.
Skapa en privat nyckel för rotcertifikatutfärdare i Git Bash-terminalen:
openssl genrsa -aes256 -passout pass:1234 -out ./private/azure-iot-test-only.root.ca.key.pem 4096
Skapa ett rotcertifikatutfärdarcertifikat:
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
Viktigt!
Det extra snedstrecket som anges för ämnesnamnet (
//CN=Azure IoT Hub CA Cert Test Only
) krävs bara för att undkomma strängen med Git på Windows-plattformar. På Linux-plattformar anger du ämnesnamnet med endast ett snedstreck (/CN=Azure IoT Hub CA Cert Test Only
).Granska rotcertifikatutfärdarcertifikatet:
openssl x509 -noout -text -in ./certs/azure-iot-test-only.root.ca.cert.pem
Observera att utfärdaren och ämnet båda är rotcertifikatutfärdaren.
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)
Skapa ett mellanliggande CA-certifikat
Kör följande kommandon för att skapa en mellanliggande ca privat nyckel och ett mellanliggande CA-certifikat. Du använder det här certifikatet och nyckeln för att signera dina enhetscertifikat.
Skapa en mellanliggande privat ca-nyckel i Git Bash-terminalen:
openssl genrsa -aes256 -passout pass:1234 -out ./private/azure-iot-test-only.intermediate.key.pem 4096
Skapa en mellanliggande certifikatsigneringsbegäran (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
Viktigt!
Det extra snedstrecket som anges för ämnesnamnet (
//CN=Azure IoT Hub Intermediate Cert Test Only
) krävs bara för att undkomma strängen med Git på Windows-plattformar. På Linux-plattformar anger du ämnesnamnet med ett enda snedstreck (/CN=Azure IoT Hub Intermediate Cert Test Only
).Signera det mellanliggande certifikatet med rotcertifikatutfärdarcertifikatet
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
Granska det mellanliggande CA-certifikatet:
openssl x509 -noout -text -in ./certs/azure-iot-test-only.intermediate.cert.pem
Observera att utfärdaren är rotcertifikatutfärdaren och att ämnet är den mellanliggande certifikatutfärdaren.
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)
Skapa enhetscertifikat
I det här avsnittet skapar du två enhetscertifikat och deras fullständiga kedjecertifikat. Det fullständiga kedjecertifikatet innehåller enhetscertifikatet, det mellanliggande CA-certifikatet och rotcertifikatutfärdarcertifikatet. Enheten måste visa upp sitt fullständiga kedjecertifikat när den registreras med DPS.
Skapa den första privata enhetens nyckel.
openssl genrsa -out ./private/device-01.key.pem 4096
Skapa CSR för enhetscertifikatet.
Enhetscertifikatets ämnesnamn (CN) måste anges till det registrerings-ID som enheten använder för att registrera med DPS. Registrerings-ID:t är en skiftlägeskänslig sträng med alfanumeriska tecken plus specialtecken:
'-'
,'.'
,'_'
,':'
. Det sista tecknet måste vara alfanumeriskt eller streck ('-'
). Det gemensamma namnet måste följa det här formatet. DPS stöder registrerings-ID:t på upp till 128 tecken. Den maximala längden på det gemensamma ämnesnamnet i ett X.509-certifikat är dock 64 tecken. Registrerings-ID:t är därför begränsat till 64 tecken när du använder X.509-certifikat. För gruppregistreringar används registrerings-ID:t också som enhets-ID i IoT Hub.Det vanliga ämnesnamnet anges med hjälp av parametern
-subj
. I följande kommando anges det gemensamma namnet till 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
Viktigt!
Det extra snedstrecket som anges för ämnesnamnet (
//CN=device-01
) krävs bara för att undkomma strängen med Git på Windows-plattformar. På Linux-plattformar anger du ämnesnamnet med ett enda snedstreck (/CN=device-01
).Signera enhetscertifikatet.
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
Granska enhetscertifikatet:
openssl x509 -noout -text -in ./certs/device-01.cert.pem
Observera att utfärdaren är den mellanliggande CERTIFIKAT:n och att Ämne är enhetsregistrerings-ID:
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)
Enheten måste visa hela certifikatkedjan när den autentiseras med DPS. Använd följande kommando för att skapa certifikatkedjan:
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
Öppna certifikatkedjefilen ./certs/device-01-full-chain.cert.pem i en textredigerare för att undersöka den. Texten i certifikatkedjan innehåller hela kedjan med alla tre certifikaten. Du använder den här certifikatkedjan senare i den här självstudien för att etablera
device-01
.Den fullständiga kedjetexten har följande 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-----
Om du vill skapa den privata nyckeln, X.509-certifikatet och det fullständiga kedjecertifikatet för den andra enheten kopierar du och klistrar in det här skriptet i git Bash-kommandotolken. Om du vill skapa certifikat för fler enheter kan du ändra variabeln
registration_id
som deklareras i början av skriptet.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
Viktigt!
Det extra snedstrecket som anges för ämnesnamnet (
//CN=$registration_id
) krävs bara för att undkomma strängen med Git på Windows-plattformar. På Linux-plattformar anger du ämnesnamnet med ett enda snedstreck (/CN=$registration_id
).Kommentar
Det här skriptet använder registrerings-ID:t som basfilnamn för den privata nyckeln och certifikatfilerna. Om ditt registrerings-ID innehåller tecken som inte är giltiga filnamnstecken måste du ändra skriptet i enlighet med detta.
Varning
Texten för certifikaten innehåller endast information om offentlig nyckel.
Enheten måste dock också ha åtkomst till den privata nyckeln för enhetscertifikatet. Detta är nödvändigt eftersom enheten måste utföra verifiering med hjälp av den nyckeln vid körning när den försöker etablera. Känsligheten för den här nyckeln är en av de främsta anledningarna till att du rekommenderar att du använder maskinvarubaserad lagring i en riktig HSM för att skydda privata nycklar.
Du använder följande filer i resten av den här självstudien:
Certifikat | Fil | beskrivning |
---|---|---|
rotcertifikatutfärdarcertifikat. | certs/azure-iot-test-only.root.ca.cert.pem | Har laddats upp till DPS och verifierats. |
mellanliggande CA-certifikat | certs/azure-iot-test-only.intermediate.cert.pem | Används för att skapa en registreringsgrupp i DPS. |
privat nyckel för device-01 | private/device-01.key.pem | Används av enheten för att verifiera ägarskapet för enhetscertifikatet under autentisering med DPS. |
device-01 fullständigt kedjecertifikat | certs/device-01-full-chain.cert.pem | Presenteras av enheten för att autentisera och registrera med DPS. |
privat nyckel för device-02 | private/device-02.key.pem | Används av enheten för att verifiera ägarskapet för enhetscertifikatet under autentisering med DPS. |
fullständigt kedjecertifikat för device-02 | certs/device-02-full-chain.cert.pem | Presenteras av enheten för att autentisera och registrera med DPS. |
Verifiera ägarskapet för rotcertifikatet
För att DPS ska kunna verifiera enhetens certifikatkedja under autentiseringen måste du ladda upp och verifiera ägarskapet för rotcertifikatutfärdarcertifikatet. Följ dessa steg för att lägga till rotcertifikatutfärdarcertifikatutfärdarcertifikatet i DPS-instansen:
I Azure Portal navigerar du till instansen av enhetsetableringstjänsten.
Öppna Certifikat på den vänstra menyn och välj sedan Lägg till för att lägga till ett nytt certifikat.
Ange ett eget visningsnamn för certifikatet. Bläddra till platsen för rotcertifikatutfärdarcertifikatfilen
certs/azure-iot-test-only.root.ca.cert.pem
. Välj överför.Markera rutan för att Ange certifikatstatus som verifierad vid uppladdning.
Välj Spara.
Kontrollera att certifikatet visas på certifikatfliken med statusen Verifierad.
Uppdatera certifikatarkivet på Windows-baserade enheter
På icke-Windows-enheter kan du skicka certifikatkedjan från koden som certifikatarkiv.
På Windows-baserade enheter måste du lägga till signeringscertifikaten (rot och mellanliggande) i ett Windows-certifikatarkiv. Annars transporteras inte signeringscertifikaten till DPS av en säker kanal med Transport Layer Security (TLS).
Dricks
Det går också att använda OpenSSL i stället för säker kanal (Schannel) med C SDK. Mer information om hur du använder OpenSSL finns i Använda OpenSSL i SDK.
Så här lägger du till signeringscertifikaten i certifikatarkivet på Windows-baserade enheter:
Konvertera dina signeringscertifikat till
.pfx
följande i Git Bash-terminalen.Rotcertifikatutfärdarcertifikat:
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
Mellanliggande CA-certifikat:
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
Högerklicka på windows-startknappen och välj sedan Kör. Ange certmgr.msc och välj Ok för att starta certifikathanteraren.
Under Certifikat – aktuell användare i certifikathanteraren väljer du Betrodda rotcertifikatutfärdare. På menyn väljer du Sedan Åtgärd>alla aktiviteter>Importera.
Följ stegen i guiden Importera certifikat för att importera
root.pfx
.- Se till att söka efter Personlig information Exchange (.pfx)
- Använd
1234
som lösenord. - Placera certifikatet i certifikatarkivet Betrodda rotcertifikatutfärdare .
Upprepa de här certifikathanterarstegen för att importera
intermediate.pfx
.- Placera certifikatet i certifikatarkivet mellanliggande certifikatutfärdare .
Dina signeringscertifikat är nu betrodda på den Windows-baserade enheten och den fullständiga kedjan kan transporteras till DPS.
Skapa en registreringsgrupp
Logga in på Azure Portal och navigera till instansen av enhetsetableringstjänsten.
Välj Hantera registreringar i avsnittet Inställningar i navigeringsmenyn.
Längst upp på sidan väljer du Lägg till registreringsgrupp.
På fliken Registrering + etablering på sidan Lägg till registreringsgrupp anger du följande information för att konfigurera information om registreringsgruppen:
Fält beskrivning Attest Välj X.509 mellanliggande certifikat som attesteringsmekanism om du vill ladda upp mellanliggande certifikat som ska användas för bara den här registreringsgruppen, eller välj X.509-certifikat som laddats upp till den här enhetsetableringstjänsten om du redan har laddat upp mellanliggande certifikat. X.509-certifikatinställningar Beroende på vilken attesteringsmetod du valde laddar du antingen upp eller väljer de primära och sekundära mellanliggande certifikaten för den här registreringsgruppen. Gruppnamn Ange ett namn för gruppen med enheter. Namnet på registreringsgruppen är en skiftlägeskänslig sträng (upp till 128 tecken lång) med alfanumeriska tecken plus specialtecken: '-'
,'.'
,'_'
,':'
. Det sista tecknet måste vara alfanumeriskt eller streck ('-'
).Etableringsstatus Markera kryssrutan Aktivera den här registreringen om du vill att den här registreringsgruppen ska vara tillgänglig för att etablera enheter. Avmarkera den här rutan om du vill att gruppen ska inaktiveras. Du kan ändra den här inställningen senare. Ometableringsprincip Välj en återetableringsprincip som visar hur du vill att DPS ska hantera enheter som begär ometablering. Mer information finns i Ometableringsprinciper Välj Nästa: IoT-hubbar.
På fliken IoT-hubbar på sidan Lägg till registreringsgrupp anger du följande information för att avgöra vilka IoT-hubbar som registreringsgruppen kan etablera enheter till:
Fält beskrivning IoT-målhubbar Välj en eller flera av dina länkade IoT-hubbar eller lägg till en ny länk till en IoT-hubb. Mer information om hur du länkar IoT-hubbar till din DPS-instans finns i Länka och hantera IoT-hubbar. Allokeringsprincip Om du har valt fler än en länkad IoT-hubb väljer du hur du vill tilldela enheter till de olika hubbarna. Mer information om allokeringsprinciper finns i Använda allokeringsprinciper.
Om du bara valde en länkad IoT-hubb rekommenderar vi att du använder principen för jämnt viktad distribution .Välj Nästa: Enhetsinställningar
På fliken Enhetsinställningar på sidan Lägg till registreringsgrupp anger du följande information för att definiera hur nyligen etablerade enheter ska konfigureras:
Fält beskrivning IoT Edge Kontrollera Aktivera IoT Edge på etablerade enheter om alla enheter som etablerats via den här gruppen kör Azure IoT Edge. Avmarkera den här rutan om den här gruppen endast gäller för enheter som inte är IoT Edge-aktiverade. Antingen är alla enheter i en grupp IoT Edge-aktiverade eller så kan ingen vara det. Enhetstaggar Använd den här textrutan om du vill ange eventuella taggar som du vill använda för enhetstvillingar för etablerade enheter. Önskade egenskaper Använd den här textrutan om du vill ange önskade egenskaper som du vill använda för enhetstvillingar för etablerade enheter. Mer information finns i Understand and use device twins in IoT Hub (Förstå och använda enhetstvillingar i IoT Hub).
Välj Nästa: Granska + skapa.
På fliken Granska + skapa kontrollerar du alla dina värden och väljer sedan Skapa.
Förbereda och köra enhetsetableringskoden
I det här avsnittet uppdaterar du exempelkoden med instansinformationen för enhetsetableringstjänsten. Om en enhet autentiseras tilldelas den till en IoT-hubb som är länkad till enhetsetableringstjänstens instans som konfigurerats i det här avsnittet.
I det här avsnittet använder du git bash-prompten och Visual Studio IDE.
Konfigurera enhetskoden för etablering
I det här avsnittet uppdaterar du exempelkoden med instansinformationen för enhetsetableringstjänsten.
I Azure Portal väljer du fliken Översikt för enhetsetableringstjänstens instans och noterar värdet för ID-omfång.
Starta Visual Studio och öppna den nya lösningsfilen som skapades i katalogen
cmake
som du skapade i roten på git-lagringsplatsen azure-iot-sdk-c. Lösningsfilen heterazure_iot_sdks.sln
.I Solution Explorer för Visual Studio navigerar du till Provision_Samples > prov_dev_client_sample > Källfiler och öppnar prov_dev_client_sample.c.
Hitta konstanten
id_scope
och ersätt värdet med ditt värde för ID-omfång som du kopierade tidigare. Till exempel:static const char* id_scope = "0ne00000A0A";
Hitta definitionen för funktionen
main()
i samma fil. Kontrollera att variabelnhsm_type
är inställd påSECURE_DEVICE_TYPE_X509
och att alla andrahsm_type
rader har kommenterats ut. Till exempel:SECURE_DEVICE_TYPE hsm_type; //hsm_type = SECURE_DEVICE_TYPE_TPM; hsm_type = SECURE_DEVICE_TYPE_X509; //hsm_type = SECURE_DEVICE_TYPE_SYMMETRIC_KEY;
Spara dina ändringar.
Högerklicka på projektet prov_dev_client_sample och välj Ange som startprojekt.
Konfigurera den anpassade HSM-stub-koden
Detaljerna för att interagera med faktisk säker maskinvarubaserad lagring varierar beroende på enhetens maskinvara. Certifikatkedjorna som används av de simulerade enheterna i den här självstudien hårdkodas i den anpassade HSM-stub-koden. I ett verkligt scenario skulle certifikatkedjan lagras i den faktiska HSM-maskinvaran för att ge bättre säkerhet för känslig information. Metoder som liknar de stub-metoder som används i det här exemplet implementeras sedan för att läsa hemligheterna från den maskinvarubaserade lagringen.
Även om HSM-maskinvara inte krävs rekommenderar vi att du skyddar känslig information som certifikatets privata nyckel. Om en faktisk HSM anropades av exemplet skulle den privata nyckeln inte finnas i källkoden. Om du har nyckeln i källkoden exponeras nyckeln för alla som kan visa koden. Detta görs endast i den här självstudien för att hjälpa till med inlärningen.
Så här uppdaterar du den anpassade HSM-stub-koden för att simulera enhetens identitet med ID device-01
:
I Solution Explorer för Visual Studio navigerar du till Provision_Samples > custom_hsm_example > Källfiler och öppnar custom_hsm_example.c.
Uppdatera strängvärdet för strängkonstanten
COMMON_NAME
med det vanliga namnet du använde när du genererade enhetscertifikatet.static const char* const COMMON_NAME = "device-01";
I Git Bash-terminalen kör du följande kommando för att generera strängkonstanten för enhetscertifikatet:
sed -e 's/^/"/;$ !s/$/""\\n"/;$ s/$/"/' ./certs/device-01-full-chain.cert.pem
Kopiera utdata från det här kommandot.
Uppdatera strängvärdet för konstantsträngen
CERTIFICATE
med hjälp av certifikatkedjan som du sparade i ./certs/device-01-full-chain.cert.pem när du har genererat dina certifikat. Använd utdatacertifikattexten från föregående steg för konstantvärdet.Syntaxen för certifikattext måste matcha följande mönster utan extra blanksteg eller parsning som görs av 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-----";
I Git Bash kör du följande kommando för att generera strängkonstanten för enhetens privata nyckel:
sed -e 's/^/"/;$ !s/$/""\\n"/;$ s/$/"/' ./private/device-01.key.pem
Kopiera utdata från det här kommandot.
Uppdatera strängvärdet för konstanten
PRIVATE_KEY
med den privata nyckeln för enhetscertifikatet. Använd utdatatexten för privat nyckel från föregående steg för konstantvärdet.Syntaxen för den privata nyckeltexten måste matcha följande mönster utan extra blanksteg eller parsning som görs av Visual Studio.
static const char* const PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----\n" "MIIJJwIBAAKCAgEAtjvKQjIhp0EE1PoADL1rfF/W6v4vlAzOSifKSQsaPeebqg8U\n" ... "X7fi9OZ26QpnkS5QjjPTYI/wwn0J9YAwNfKSlNeXTJDfJ+KpjXBcvaLxeBQbQhij\n" "-----END RSA PRIVATE KEY-----";
Spara dina ändringar.
Högerklicka på projektet custom_hsm_example och välj Skapa.
Viktigt!
Du måste skapa custom_hsm_example projektet innan du skapar resten av lösningen i nästa avsnitt.
Kör exemplet
I Visual Studio-menyn väljer du Felsökning>Starta utan felsökning för att köra lösningen. När du uppmanas att återskapa projektet väljer du Ja för att återskapa projektet innan du kör det.
Följande utdata är ett exempel på en simulerad enhet
device-01
som startar och ansluter till etableringstjänsten. Enheten tilldelades en IoT-hubb och registrerades: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:
Upprepa stegen i Konfigurera den anpassade HSM-stub-koden för den andra enheten (
device-02
) och kör exemplet igen. Använd följande värden för enheten:beskrivning Värde Allmänt namn "device-02"
Fullständig certifikatkedja Generera texten med . /certs/device-02-full-chain.cert.pem Privat nyckel Generera texten med hjälp av ./private/device-02.key.pem Följande utdata är ett exempel på att den simulerade enheten
device-02
startar och ansluter till etableringstjänsten. Enheten tilldelades en IoT-hubb och registrerades: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:
C#-exempelkoden har konfigurerats för att använda X.509-certifikat som lagras i en lösenordsskyddad PKCS#12-formaterad fil (.pfx). De fullständiga kedjecertifikat som du skapade tidigare är i PEM-format. Om du vill konvertera fullständiga kedjecertifikat till PKCS#12-format anger du följande kommandon i Git Bash-prompten från katalogen där du tidigare körde OpenSSL-kommandona.
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
I resten av det här avsnittet använder du din Windows-kommandotolk.
I Azure Portal väljer du fliken Översikt för enhetsetableringstjänsten.
Kopiera ID-omfångsvärdet.
I windows-kommandotolken ändrar du till katalogen X509Sample . Den här katalogen finns på den SDK-lagringsplats som du klonade i ett tidigare steg: .\azure-iot-sdk-csharp\provisioning\device\samples\getting started\X509Sample.
Ange följande kommando för att skapa och köra X.509-enhetsetableringsexemplet. Ersätt
<id-scope>
med det ID-omfång som du kopierade från Azure Portal. Ersätt<your-certificate-folder>
med sökvägen till mappen där du körde Dina OpenSSL-kommandon.dotnet run -- -s <id-scope> -c <your-certificate-folder>\certs\device-01-full-chain.cert.pfx -p 1234
Enheten ansluter till DPS och tilldelas till en IoT-hubb. Sedan skickar enheten ett telemetrimeddelande till IoT-hubben. Du bör se utdata som liknar följande exempel:
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.
Kommentar
Om du inte anger certifikat och lösenord på kommandoraden kommer certifikatfilen som standard att vara ./certificate.pfx och du uppmanas att ange ditt lösenord.
Ytterligare parametrar kan skickas för att ändra TransportType (-t) och GlobalDeviceEndpoint (-g). För en fullständig lista över parametrar typ
dotnet run -- --help
.Om du vill registrera den andra enheten kör du exemplet igen med hjälp av det fullständiga kedjecertifikatet.
dotnet run -- -s <id-scope> -c <your-certificate-folder>\certs\device-02-full-chain.cert.pfx -p 1234
Använd windows-kommandotolken i följande steg.
I Azure Portal väljer du fliken Översikt för enhetsetableringstjänsten.
Kopiera ID-omfångsvärdet.
I windows-kommandotolken går du till exempelkatalogen och installerar de paket som behövs i exemplet. Sökvägen som visas är relativ till den plats där du klonade SDK:et.
cd .\azure-iot-sdk-node\provisioning\device\samples npm install
I mappen provisioning\device\samples öppnar du register_x509.js och granskar koden.
Exemplet är som standard MQTT som transportprotokoll. Om du vill använda ett annat protokoll kommenterar du ut följande rad och avkommentarer raden för lämpligt protokoll.
var ProvisioningTransport = require('azure-iot-provisioning-device-mqtt').Mqtt;
Exemplet använder fem miljövariabler för att autentisera och etablera en IoT-enhet med DPS. Dessa miljövariabler är:
Variabelnamn beskrivning PROVISIONING_HOST
Slutpunkten som ska användas för att ansluta till din DPS-instans. I den här självstudien använder du den globala slutpunkten, global.azure-devices-provisioning.net
.PROVISIONING_IDSCOPE
ID-omfånget för din DPS-instans. PROVISIONING_REGISTRATION_ID
Registrerings-ID för din enhet. Det måste matcha det vanliga ämnesnamnet i enhetscertifikatet. CERTIFICATE_FILE
Sökvägen till enhetens fullständiga kedjecertifikatfil. KEY_FILE
Sökvägen till den privata nyckelfilen för enhetscertifikatet. Metoden
ProvisioningDeviceClient.register()
försöker registrera enheten.Lägg till miljövariabler för den globala enhetsslutpunkten och ID-omfånget. Ersätt
<id-scope>
med det värde som du kopierade från Azure Portal.set PROVISIONING_HOST=global.azure-devices-provisioning.net set PROVISIONING_IDSCOPE=<id-scope>
Ange miljövariabeln för enhetsregistrerings-ID:t. Registrerings-ID:t för IoT-enheten måste matcha ämnesnamnet på enhetscertifikatet. I den här självstudien är device-01 både ämnesnamnet och registrerings-ID:t för enheten.
set PROVISIONING_REGISTRATION_ID=device-01
Ange miljövariablerna för det fullständiga kedjecertifikatet och de privata nyckelfiler för enheten som du genererade tidigare. Ersätt
<your-certificate-folder>
med sökvägen till mappen där du körde Dina OpenSSL-kommandon.set CERTIFICATE_FILE=<your-certificate-folder>\certs\device-01-full-chain.cert.pem set KEY_FILE=<your-certificate-folder>\private\device-01.key.pem
Kör exemplet och kontrollera att enheten har etablerats.
node register_x509.js
Du bör se utdata som liknar följande exempel:
registration succeeded assigned hub=contoso-hub-2.azure-devices.net deviceId=device-01 Client connected send status: MessageEnqueued
Uppdatera miljövariablerna för den andra enheten (
device-02
) enligt följande tabell och kör exemplet igen.Miljövariabel Värde 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
Använd windows-kommandotolken i följande steg.
I Azure Portal väljer du fliken Översikt för enhetsetableringstjänsten.
Kopiera ID-omfånget.
I windows-kommandotolken går du till katalogen för det provision_x509.py exemplet. Sökvägen som visas är relativ till den plats där du klonade SDK:et.
cd .\azure-iot-sdk-python\samples\async-hub-scenarios
Det här exemplet använder sex miljövariabler för att autentisera och etablera en IoT-enhet med DPS. Dessa miljövariabler är:
Variabelnamn beskrivning PROVISIONING_HOST
Slutpunkten som ska användas för att ansluta till din DPS-instans. I den här självstudien använder du den globala slutpunkten, global.azure-devices-provisioning.net
.PROVISIONING_IDSCOPE
ID-omfånget för din DPS-instans. DPS_X509_REGISTRATION_ID
Registrerings-ID för din enhet. Det måste matcha det vanliga ämnesnamnet i enhetscertifikatet. X509_CERT_FILE
Sökvägen till enhetens fullständiga kedjecertifikatfil. X509_KEY_FILE
Sökvägen till den privata nyckelfilen för enhetscertifikatet. PASS_PHRASE
Lösenfrasen som används för att kryptera den privata nyckelfilen (om den används). Behövs inte för den här självstudien. Lägg till miljövariablerna för den globala enhetsslutpunkten och ID-omfånget. För ID-omfångsvariabeln använder du det värde som du kopierade från Azure Portal.
set PROVISIONING_HOST=global.azure-devices-provisioning.net set PROVISIONING_IDSCOPE=<ID scope for your DPS resource>
Ange miljövariabeln för enhetsregistrerings-ID:t. Registrerings-ID:t för IoT-enheten måste matcha ämnesnamnet på enhetscertifikatet. I den här självstudien är device-01 både ämnesnamnet och registrerings-ID:t för enheten.
set DPS_X509_REGISTRATION_ID=device-01
Ange miljövariablerna för det fullständiga kedjecertifikatet och de privata nyckelfiler för enheten som du genererade tidigare. Ersätt
<your-certificate-folder>
med sökvägen till mappen där du körde Dina OpenSSL-kommandon.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
Granska koden för provision_x509.py. Om du inte använder Python version 3.7 eller senare gör du den kodändring som nämns här för att ersätta
asyncio.run(main())
.Kör exemplet. Exemplet ansluter till DPS, som etablerar enheten till en IoT-hubb. När enheten har etablerats skickar exemplet några testmeddelanden till IoT-hubben.
python provision_x509.py
Du bör se utdata som liknar följande exempel:
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
Uppdatera miljövariablerna för den andra enheten (
device-02
) enligt följande tabell och kör exemplet igen.Miljövariabel Värde 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
I följande steg använder du både windows-kommandotolken och Git Bash-prompten.
I Azure Portal väljer du fliken Översikt för enhetsetableringstjänsten.
Kopiera ID-omfånget.
I windows-kommandotolken navigerar du till exempelprojektmappen. Sökvägen som visas är relativ till den plats där du klonade SDK:et
cd .\azure-iot-sdk-java\provisioning\provisioning-device-client-samples\provisioning-X509-sample
Ange etableringstjänsten och X.509-identitetsinformationen i exempelkoden. Detta används under etableringen för attestering av den simulerade enheten före enhetsregistrering.
Öppna filen
.\src\main\java\samples\com\microsoft\azure\sdk\iot\ProvisioningX509Sample.java
i din favoritredigerare.Uppdatera följande värden. För
idScope
använder du det ID-omfång som du kopierade tidigare. Använd slutpunkten Global enhet för global slutpunkt för global slutpunkt. Den här slutpunkten är densamma för varje DPS-instans,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]";
Exemplet använder som standard HTTPS som transportprotokoll. Om du vill ändra protokollet kommenterar du ut följande rad och avkommentarer raden för det protokoll som du vill använda.
private static final ProvisioningDeviceClientTransportProtocol PROVISIONING_DEVICE_CLIENT_TRANSPORT_PROTOCOL = ProvisioningDeviceClientTransportProtocol.HTTPS;
Uppdatera värdet för konstantsträngen
leafPublicPem
med värdet för enhetscertifikatet device-01.cert.pem.Syntaxen för certifikattext måste matcha följande mönster utan extra blanksteg eller tecken.
private static final String leafPublicPem = "-----BEGIN CERTIFICATE-----\n" "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n" ... "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n" "-----END CERTIFICATE-----";
Att uppdatera det här strängvärdet manuellt kan vara felbenäget. Om du vill generera rätt syntax kan du kopiera och klistra in följande kommando i Git Bash-prompten och trycka på RETUR. Det här kommandot genererar syntaxen för strängkonstantvärdet
leafPublicPem
och skriver det till utdata.sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' ./certs/device-01.cert.pem
Kopiera och klistra in utdatacertifikattexten för konstantvärdet.
Uppdatera strängvärdet för konstanten
leafPrivateKey
med den okrypterade privata nyckeln för enhetscertifikatet, unencrypted-device-key.pem.Syntaxen för den privata nyckeltexten måste matcha följande mönster utan extra blanksteg eller tecken.
private static final String leafPrivateKey = "-----BEGIN PRIVATE KEY-----\n" + "MIIJJwIBAAKCAgEAtjvKQjIhp0EE1PoADL1rfF/W6v4vlAzOSifKSQsaPeebqg8U\n" + ... "X7fi9OZ26QpnkS5QjjPTYI/wwn0J9YAwNfKSlNeXTJDfJ+KpjXBcvaLxeBQbQhij\n" + "-----END PRIVATE KEY-----";
Om du vill generera rätt syntax kan du kopiera och klistra in följande kommando i Git Bash-prompten och trycka på RETUR. Det här kommandot genererar syntaxen för strängkonstantvärdet
leafPrivateKey
och skriver det till utdata.sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' ./private/device-01.key.pem
Kopiera och klistra in utdatatexten för den privata nyckeln för konstantvärdet.
Lägg till en
rootPublicPem
konstant sträng med värdet för rotcertifikatutfärdarcertifikatet azure-iot-test-only.root.ca.cert.pem. Du kan lägga till den strax efter konstantenleafPrivateKey
.Syntaxen för certifikattext måste matcha följande mönster utan extra blanksteg eller tecken.
private static final String rootPublicPem = "-----BEGIN CERTIFICATE-----\n" "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n" ... "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n" "-----END CERTIFICATE-----";
Om du vill generera rätt syntax kan du kopiera och klistra in följande kommando i Git Bash-prompten och trycka på RETUR. Det här kommandot genererar syntaxen för strängkonstantvärdet
rootPublicPem
och skriver det till utdata.sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' ./certs/azure-iot-test-only.root.ca.cert.pem
Kopiera och klistra in utdatacertifikattexten för konstantvärdet.
Lägg till en
intermediatePublicPem
konstant sträng med värdet för ditt mellanliggande CA-certifikat, azure-iot-test-only.intermediate.cert.pem. Du kan lägga till den strax efter den föregående konstanten.Syntaxen för certifikattext måste matcha följande mönster utan extra blanksteg eller tecken.
private static final String intermediatePublicPem = "-----BEGIN CERTIFICATE-----\n" "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n" ... "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n" "-----END CERTIFICATE-----";
Om du vill generera rätt syntax kan du kopiera och klistra in följande kommando i Git Bash-prompten och trycka på RETUR. Det här kommandot genererar syntaxen för strängkonstantvärdet
intermediatePublicPem
och skriver det till utdata.sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' ./certs/azure-iot-test-only.intermediate.cert.pem
Kopiera och klistra in utdatacertifikattexten för konstantvärdet.
Hitta följande rader i
main
metoden.// For group enrollment uncomment this line //signerCertificatePemList.add("<Your Signer/intermediate Certificate Here>");
Lägg till dessa två rader direkt under dem för att lägga till dina mellanliggande certifikat och rotcertifikatutfärdarcertifikat i signeringskedjan. Din signeringskedja bör innehålla hela certifikatkedjan fram till och med ett certifikat som du har verifierat med DPS.
signerCertificatePemList.add(intermediatePublicPem); signerCertificatePemList.add(rootPublicPem);
Kommentar
Ordningen som signeringscertifikaten läggs till är viktig. Exemplet misslyckas om det ändras.
Spara dina ändringar.
Skapa exemplet och gå sedan till
target
mappen.mvn clean install cd target
Versionen matar ut .jar fil i
target
mappen med följande filformat:provisioning-x509-sample-{version}-with-deps.jar
; till exempel:provisioning-x509-sample-1.8.1-with-deps.jar
. Kör .jar-filen. Du kan behöva ersätta versionen i följande kommando.java -jar ./provisioning-x509-sample-1.8.1-with-deps.jar
Exemplet ansluter till DPS, som etablerar enheten till en IoT-hubb. När enheten har etablerats skickar exemplet några testmeddelanden till IoT-hubben.
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 [aaaa0000-bb11-2222-33cc-444444dddddd] Message Id [aaaa0000-bb11-2222-33cc-444444dddddd] ) 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 [aaaa0000-bb11-2222-33cc-444444dddddd] Message Id [aaaa0000-bb11-2222-33cc-444444dddddd] ) 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 [aaaa0000-bb11-2222-33cc-444444dddddd] Message Id [aaaa0000-bb11-2222-33cc-444444dddddd] ) 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 [aaaa0000-bb11-2222-33cc-444444dddddd] Message Id [aaaa0000-bb11-2222-33cc-444444dddddd] ) with status OK Message sent!
Uppdatera konstanterna för den andra enheten (
device-02
) enligt följande tabell, återskapa och kör exemplet igen.Konstant Fil som ska användas leafPublicPem
./certs/device-02.cert.pem leafPrivateKey
./private/device-02.key.pem
Bekräfta registreringen av enhetsetablering
Granska registreringsposterna för registreringsgruppen för att se registreringsinformationen för dina enheter:
I Azure Portal går du till instansen av enhetsetableringstjänsten.
I menyn Inställningar väljer du Hantera registreringar.
Välj Registreringsgrupper. Posten för X.509-registreringsgruppen som du skapade tidigare bör visas i listan.
Välj registreringsposten. Välj sedan Information bredvid registreringsstatusen för att se de enheter som har registrerats via registreringsgruppen. Den IoT-hubb som var och en av dina enheter tilldelades till, deras enhets-ID:n och de datum och tider som de registrerades visas i listan.
Du kan välja en av enheterna för att se mer information om den enheten.
Så här verifierar du enheterna på din IoT-hubb:
I Azure Portal går du till den IoT-hubb som enheten tilldelades till.
I menyn Enhetshantering väljer du Enheter.
Om enheterna har etablerats bör deras enhets-ID:n, device-01 och device-02, visas i listan, med Status inställt som aktiverat. Om du inte ser dina enheter väljer du Uppdatera.
Rensa resurser
När du är klar med att testa och utforska det här enhetsklientexemplet använder du följande steg för att ta bort alla resurser som skapats av den här självstudien.
- Stäng utdatafönstret för enhetsklientexemplet på datorn.
Ta bort din registreringsgrupp
På den vänstra menyn i Azure Portal väljer du Alla resurser.
Välj din DPS-instans.
I menyn Inställningar väljer du Hantera registreringar.
Välj fliken Registreringsgrupper .
Välj den registreringsgrupp som du använde för den här självstudien.
På sidan Registreringsinformation väljer du Information bredvid Registreringsstatus. Markera sedan kryssrutan bredvid kolumnrubriken Enhets-ID för att markera alla registreringsposter för registreringsgruppen. Välj Ta bort överst på sidan för att ta bort registreringsposterna.
Viktigt!
Om du tar bort en registreringsgrupp tas inte de registreringsposter som är associerade med den bort. Dessa överblivna poster räknas mot registreringskvoten för DPS-instansen. Därför är det bästa praxis att ta bort alla registreringsposter som är associerade med en registreringsgrupp innan du tar bort själva registreringsgruppen.
Gå tillbaka till Sidan Hantera registreringar och kontrollera att fliken Registreringsgrupper är markerad.
Markera kryssrutan bredvid gruppnamnet för den registreringsgrupp som du använde för den här självstudien.
Välj Ta bort längst upp på sidan.
Ta bort registrerade CA-certifikat från DPS
- Välj Certifikat på den vänstra menyn i DPS-instansen. För varje certifikat som du laddade upp och verifierade i den här självstudien väljer du certifikatet och väljer Ta bort och bekräftar ditt val att ta bort det.
Ta bort enhetsregistreringar från IoT Hub
På den vänstra menyn i Azure Portal väljer du Alla resurser.
Välj din IoT-hubb.
I menyn Enhetshantering väljer du Enheter.
Markera kryssrutan bredvid enhets-ID för de enheter som du registrerade i den här självstudien. Till exempel device-01 och device-02.
Välj Ta bort längst upp på sidan.
Nästa steg
I den här självstudien etablerade du flera X.509-enheter till din IoT-hubb med hjälp av en registreringsgrupp. Lär dig sedan hur du etablerar IoT-enheter över flera hubbar.