Esercitazione: Effettuare il provisioning di più dispositivi X.509 usando i gruppi di registrazione
Questa esercitazione illustra come effettuare il provisioning di gruppi di dispositivi IoT che usano certificati X.509 per l'autenticazione. Il codice del dispositivo di esempio di Azure IoT SDK verrà eseguito nel computer di sviluppo per simulare il provisioning di dispositivi X.509. Nei dispositivi reali il codice del dispositivo viene distribuito ed eseguito dal dispositivo IoT.
Il servizio Device Provisioning hub IoT di Azure supporta due tipi di registrazioni per i dispositivi di provisioning:
- Gruppi di registrazioni: usato per registrare più dispositivi correlati. Questa esercitazione illustra il provisioning con i gruppi di registrazione.
- Registrazioni singole: Usato per registrare un singolo dispositivo.
Il servizio Device Provisioning hub IoT di Azure supporta tre forme di autenticazione per i dispositivi di provisioning:
- Certificati X.509: questa esercitazione illustra l'attestazione del certificato X.509
- Modulo TPM (Trusted Platform Module)
- Chiavi simmetriche
Negli scenari di produzione viene usato un modulo di protezione hardware (HSM) per l'archiviazione sicura basata su hardware dei segreti del dispositivo. Può essere usato con una chiave simmetrica, un certificato X.509 o un'attestazione TPM per fornire uno spazio di archiviazione sicuro per i segreti. È consigliabile usare l'archiviazione basata su hardware dei segreti del dispositivo per proteggere informazioni riservate come la chiave privata del certificato del dispositivo.
In questa esercitazione vengono completati gli obiettivi seguenti:
- Creare una catena di certificati di trust per organizzare un gruppo di dispositivi che usano certificati X.509.
- Creare una nuova registrazione di gruppo che usa la catena di certificati.
- Configurare l'ambiente di sviluppo.
- Effettuare il provisioning dei dispositivi usando la catena di certificati usando il codice di esempio in Azure IoT SDK per dispositivi.
Prerequisiti
Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.
Completare la procedura descritta in Configurare il servizio Device Provisioning in hub IoT con il portale di Azure.
I prerequisiti seguenti sono relativi a un ambiente di sviluppo Windows usato per simulare i dispositivi. Per Linux o macOS, vedere la sezione appropriata in Preparare l'ambiente di sviluppo nella documentazione dell'SDK.
Installare Visual Studio 2022 con il carico di lavoro "Sviluppo di applicazioni desktop con C++". Sono supportati anche Visual Studio 2015, Visual Studio 2017 e Visual Studio 19.
Installare il sistema di compilazione CMake più recente. Assicurarsi di selezionare l'opzione che aggiunge il file eseguibile CMake al percorso.
Importante
Verificare che i prerequisiti di Visual Studio (Visual Studio e il carico di lavoro "Sviluppo di applicazioni desktop con C++") siano installati nel computer prima di avviare l'installazione
CMake
. Quando i prerequisiti sono pronti e il download è stato verificato, installare il sistema di compilazione CMake. Tenere inoltre presente che le versioni precedenti del sistema di compilazione CMake non riescono a generare il file di soluzione usato in questa esercitazione. Assicurarsi di usare la versione più recente di CMake.
I prerequisiti seguenti si riferiscono a un ambiente di sviluppo Windows. Per Linux o macOS, vedere la sezione appropriata in Preparare l'ambiente di sviluppo nella documentazione dell'SDK.
Installare .NET SDK 6.0 o versione successiva nel computer basato su Windows. Per controllare la versione, è possibile usare il comando seguente.
dotnet --info
I prerequisiti seguenti si riferiscono a un ambiente di sviluppo Windows. Per Linux o macOS, vedere la sezione appropriata in Preparare l'ambiente di sviluppo nella documentazione dell'SDK.
- Installare Node.js v4.0 o versione successiva nel computer.
I prerequisiti seguenti si riferiscono a un ambiente di sviluppo Windows.
- Python 3.6 o versione successiva nel computer.
I prerequisiti seguenti si riferiscono a un ambiente di sviluppo Windows. Per Linux o macOS, vedere la sezione appropriata in Preparare l'ambiente di sviluppo nella documentazione dell'SDK.
Installare Java SE Development Kit 8 o versione successiva nel computer.
Scaricare e installare Maven.
Installare la versione più recente di Git. Verificare che Git venga aggiunto alle variabili di ambiente accessibili alla finestra di comando.
Assicurarsi che OpenSSL sia installato nel computer. In Windows l'installazione di Git include un'installazione di OpenSSL. È possibile accedere a OpenSSL dal prompt di Git Bash. Per verificare che OpenSSL sia installato, aprire un prompt di Git Bash e immettere
openssl version
.Nota
A meno che non si abbia familiarità con OpenSSL e che sia già installato nel computer Windows, è consigliabile usare OpenSSL dal prompt di Git Bash. In alternativa, è possibile scegliere di scaricare il codice sorgente e compilare OpenSSL. Se si sceglie di compilare o scaricare OpenSSL, assicurarsi che il file binario OpenSSL sia accessibile nel percorso e che la variabile di ambiente
OPENSSL_CNF
sia impostata sul percorso del file openssl.cnf.
Preparare l'ambiente di sviluppo
In questa sezione viene preparato un ambiente di sviluppo usato per compilare Azure IoT C SDK. L'SDK include codice di esempio e strumenti usati dal provisioning dei dispositivi con DPS.
In un Web browser passare alla pagina Versione di Azure IoT C SDK.
Copiare il nome del tag per la versione più recente di Azure IoT C SDK, ad esempio:
lts_03_2024
.Aprire un prompt dei comandi di Windows ed eseguire i comandi seguenti per clonare la versione più recente del repository GitHub azure IoT Device SDK per C . Sostituire
<release-tag>
con il tag copiato nel passaggio precedente.git clone -b <release-tag> https://github.com/Azure/azure-iot-sdk-c.git cd azure-iot-sdk-c git submodule update --init
Il completamento di questa operazione potrebbe richiedere alcuni minuti.
Al termine dell'operazione, eseguire i comandi seguenti dalla
azure-iot-sdk-c
directory :mkdir cmake cd cmake
L'esempio di codice usa un certificato X.509 per fornire l'attestazione tramite l'autenticazione X.509. Eseguire il comando seguente per compilare una versione dell'SDK specifica per la piattaforma di sviluppo che include il client di provisioning di dispositivi. Viene generata una soluzione di Visual Studio per il dispositivo simulato nella directory
cmake
.Sostituire
<path
con il percorso assoluto dell'SDK C clonato.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 ..
Suggerimento
Se
cmake
non trova il compilatore C++, è possibile che si verifichino errori di compilazione durante l'esecuzione del comando precedente. In tal caso, provare a eseguire il comando nel prompt dei comandi di Visual Studio.Quando la compilazione ha esito positivo, le ultime righe di output sono simili all'output seguente:
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
Aprire un prompt dei comandi di Windows e clonare il repository GitHub azure IoT SDK per C# usando il comando seguente:
git clone https://github.com/Azure/azure-iot-sdk-csharp.git
Aprire un prompt dei comandi di Windows e clonare Azure IoT SDK per Node.js repository GitHub usando il comando seguente:
git clone https://github.com/Azure/azure-iot-sdk-node.git
Aprire un prompt dei comandi di Windows e clonare il repository GitHub azure IoT Device SDK per Python usando il comando seguente:
git clone -b v2 https://github.com/Azure/azure-iot-sdk-python.git --recursive
Nota
Gli esempi usati in questa esercitazione si trovano nel ramo v2 del repository azure-iot-sdk-python. La versione 3 di Python SDK è disponibile per l'uso nella versione beta.
Aprire un prompt dei comandi di Windows e clonare il repository Azure IoT Samples for Java GitHub usando il comando seguente:
git clone https://github.com/Azure/azure-iot-sdk-java.git --recursive
Passare alla directory radice
azure-iot-sdk-java
e compilare il progetto per scaricare tutti i pacchetti necessari.cd azure-iot-sdk-java mvn install -DskipTests=true
Creare una catena di certificati X.509
In questa sezione viene generata una catena di certificati X.509 di tre certificati per testare ogni dispositivo con questa esercitazione. I certificati hanno la gerarchia seguente.
Certificato radice Caricare e verificare il certificato radice con DPS. Questa verifica consente al servizio Device Provisioning di considerare attendibile il certificato e verificare i certificati firmati da tale certificato.
Certificato intermedio: è comune usare certificati intermedi per raggruppare i dispositivi logicamente in base alle linee di prodotto, alle divisioni aziendali o ad altri criteri. In questa esercitazione viene usata una catena di certificati con un certificato intermedio, ma in uno scenario di produzione potrebbero essere presenti diversi certificati. Il certificato intermedio in questa catena è firmato dal certificato radice. Questo certificato viene fornito al gruppo di registrazione creato nel servizio Device Provisioning. Questa configurazione consente di gestire un intero gruppo di dispositivi i cui certificati del dispositivo sono firmati con lo stesso certificato intermedio.
Certificati del dispositivo: i certificati del dispositivo (talvolta denominati certificato foglia) vengono firmati dal certificato intermedio e archiviati nel dispositivo insieme alla relativa chiave privata. Idealmente, questi elementi sensibili vengono archiviati in modo sicuro con un modulo di protezione hardware. È possibile firmare più certificati dispositivo con lo stesso certificato intermedio. Ogni dispositivo presenta il certificato e la chiave privata, insieme alla catena di certificati, durante il tentativo di provisioning.
Per altre informazioni sulle catene di certificati, vedere Attestazione del certificato X.509.
Configurare l'ambiente OpenSSL X.509
In questa sezione vengono creati i file di configurazione di Openssl, la struttura di directory e altri file usati dai comandi Openssl.
Aprire un prompt dei comandi Git Bash e passare a una cartella in cui si vogliono generare i certificati e le chiavi X.509 per questa esercitazione.
Creare un file di configurazione OpenSSL denominato openssl_root_ca.cnf per il certificato CA radice. I file di configurazione OpenSSL contengono criteri e definizioni utilizzati dai comandi OpenSSL. Copiare e incollare il testo seguente nel file 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
Creare un file di configurazione OpenSSL denominato openssl_device_intermediate_ca.cnf da usare per i certificati intermedi e del dispositivo. Copiare e incollare il testo seguente nel file 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
Creare la struttura di directory, il file di database index.txt e il file seriale del numero di serie usato dai comandi OpenSSL in questa esercitazione:
mkdir certs csr newcerts private touch index.txt openssl rand -hex 16 > serial
Creare un certificato CA radice
Eseguire i comandi seguenti per creare una chiave privata della CA radice e un certificato CA radice. Usare questo certificato e la chiave per firmare il certificato intermedio.
Nel terminale Git Bash creare una chiave privata della CA radice:
openssl genrsa -aes256 -passout pass:1234 -out ./private/azure-iot-test-only.root.ca.key.pem 4096
Creare un certificato CA radice:
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
Importante
La barra aggiuntiva specificata per il nome soggetto (
//CN=Azure IoT Hub CA Cert Test Only
) è necessaria solo per eseguire l'escape della stringa con Git nelle piattaforme Windows. Nelle piattaforme Linux specificare il nome del soggetto con una sola barra (/CN=Azure IoT Hub CA Cert Test Only
).Esaminare il certificato CA radice:
openssl x509 -noout -text -in ./certs/azure-iot-test-only.root.ca.cert.pem
Osservare che l'autorità emittente e l'oggetto sono entrambe la CA radice.
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)
Creare un certificato CA intermedio
Eseguire i comandi seguenti per creare una chiave privata ca intermedia e un certificato CA intermedio. Usare questo certificato e la chiave per firmare i certificati del dispositivo.
Nel terminale Git Bash creare una chiave privata ca intermedia:
openssl genrsa -aes256 -passout pass:1234 -out ./private/azure-iot-test-only.intermediate.key.pem 4096
Creare una richiesta di firma del certificato CA intermedia :Create an intermediate CA certificate signing request (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
Importante
La barra aggiuntiva specificata per il nome soggetto (
//CN=Azure IoT Hub Intermediate Cert Test Only
) è necessaria solo per eseguire l'escape della stringa con Git nelle piattaforme Windows. Nelle piattaforme Linux specificare il nome del soggetto con una singola barra (/CN=Azure IoT Hub Intermediate Cert Test Only
).Firmare il certificato intermedio con il certificato CA radice
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
Esaminare il certificato CA intermedio:
openssl x509 -noout -text -in ./certs/azure-iot-test-only.intermediate.cert.pem
Si noti che l'autorità emittente è la CA radice e l'oggetto è l'autorità di certificazione intermedia.
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)
Creare certificati del dispositivo
In questa sezione vengono creati due certificati del dispositivo e i relativi certificati a catena completa. Il certificato della catena completa contiene il certificato del dispositivo, il certificato CA intermedio e il certificato CA radice. Il dispositivo deve presentare il certificato completo della catena quando esegue la registrazione con DPS.
Creare la prima chiave privata del dispositivo.
openssl genrsa -out ./private/device-01.key.pem 4096
Creare il certificato del dispositivo CSR.
Il nome comune soggetto (CN) del certificato del dispositivo deve essere impostato sull'ID registrazione usato dal dispositivo per la registrazione con DPS. L'ID registrazione è una stringa senza distinzione tra maiuscole e minuscole di caratteri alfanumerici più i caratteri speciali:
'-'
,'.'
'_'
, ,':'
. L'ultimo carattere deve essere alfanumerico o un trattino ('-'
). Il nome comune deve essere conforme a questo formato. DPS supporta ID di registrazione fino a 128 caratteri; Tuttavia, la lunghezza massima del nome comune del soggetto in un certificato X.509 è di 64 caratteri. L'ID registrazione, pertanto, è limitato a 64 caratteri quando si usano certificati X.509. Per le registrazioni di gruppo, l'ID registrazione viene usato anche come ID dispositivo in hub IoT.Il nome comune del soggetto viene impostato usando il
-subj
parametro . Nel comando seguente il nome comune è impostato su 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
Importante
La barra aggiuntiva specificata per il nome soggetto (
//CN=device-01
) è necessaria solo per eseguire l'escape della stringa con Git nelle piattaforme Windows. Nelle piattaforme Linux specificare il nome del soggetto con una singola barra (/CN=device-01
).Firmare il certificato del dispositivo.
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
Esaminare il certificato del dispositivo:
openssl x509 -noout -text -in ./certs/device-01.cert.pem
Si noti che l'autorità di certificazione è l'autorità di certificazione intermedia e l'oggetto è l'ID di registrazione del dispositivo,
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)
Il dispositivo deve presentare la catena di certificati completa quando esegue l'autenticazione con DPS. Usare il comando seguente per creare la catena di certificati:
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
Aprire il file della catena di certificati, ./certs/device-01-full-chain.cert.pem, in un editor di testo per esaminarlo. Il testo della catena di certificati contiene la catena completa di tutti e tre i certificati. Questa catena di certificati verrà usata più avanti in questa esercitazione per effettuare il provisioning
device-01
di .Il testo della catena completa ha il formato seguente:
-----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-----
Per creare la chiave privata, il certificato X.509 e il certificato a catena completa per il secondo dispositivo, copiare e incollare questo script nel prompt dei comandi di Git Bash. Per creare certificati per più dispositivi, è possibile modificare la
registration_id
variabile dichiarata all'inizio dello script.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
Importante
La barra aggiuntiva specificata per il nome soggetto (
//CN=$registration_id
) è necessaria solo per eseguire l'escape della stringa con Git nelle piattaforme Windows. Nelle piattaforme Linux specificare il nome del soggetto con una singola barra (/CN=$registration_id
).Nota
Questo script usa l'ID di registrazione come nome file di base per la chiave privata e i file di certificato. Se l'ID registrazione contiene caratteri che non sono caratteri di nome file validi, sarà necessario modificare di conseguenza lo script.
Avviso
Il testo per i certificati contiene solo le informazioni sulla chiave pubblica.
Il dispositivo deve però avere accesso anche alla chiave privata del certificato del dispositivo. Ciò è necessario perché il dispositivo deve eseguire la verifica usando tale chiave in fase di esecuzione quando tenta di effettuare il provisioning. La natura sensibile di questa chiave è uno dei motivi principali per cui è consigliabile usare l'archiviazione basata su hardware in un modulo di protezione hardware reale per proteggere le chiavi private.
Nella parte restante di questa esercitazione vengono usati i file seguenti:
Certificate | File | Descrizione |
---|---|---|
certificato CA radice. | certs/azure-iot-test-only.root.ca.cert.pem | Caricato nel servizio Device Provisioning e verificato. |
Certificato CA intermedio | certs/azure-iot-test-only.intermediate.cert.pem | Usato per creare un gruppo di registrazione in DPS. |
chiave privata device-01 | private/device-01.key.pem | Usato dal dispositivo per verificare la proprietà del certificato del dispositivo durante l'autenticazione con DPS. |
certificato della catena completa device-01 | certs/device-01-full-chain.cert.pem | Presentato dal dispositivo per l'autenticazione e la registrazione con DPS. |
chiave privata device-02 | private/device-02.key.pem | Usato dal dispositivo per verificare la proprietà del certificato del dispositivo durante l'autenticazione con DPS. |
Certificato della catena completa device-02 | certs/device-02-full-chain.cert.pem | Presentato dal dispositivo per l'autenticazione e la registrazione con DPS. |
Verificare la proprietà del certificato radice
Affinché dps sia in grado di convalidare la catena di certificati del dispositivo durante l'autenticazione, è necessario caricare e verificare la proprietà del certificato CA radice. Per aggiungere il certificato CA radice all'istanza del servizio Device Provisioning, seguire questa procedura:
Nella portale di Azure passare all'istanza del servizio Device Provisioning.
Aprire Certificati dal menu a sinistra e quindi selezionare Aggiungi per aggiungere un nuovo certificato.
Immettere un nome visualizzato descrittivo per il certificato. Passare al percorso del file
certs/azure-iot-test-only.root.ca.cert.pem
di certificato CA radice. Selezionare Carica.Selezionare la casella Imposta lo stato del certificato da verificare al caricamento.
Seleziona Salva.
Assicurarsi che il certificato sia visualizzato nella scheda certificato con lo stato Verificato.
Aggiornare l'archivio certificati nei dispositivi basati su Windows
Nei dispositivi non Windows è possibile passare la catena di certificati dal codice come archivio certificati.
Nei dispositivi basati su Windows è necessario aggiungere i certificati di firma (radice e intermedio) a un archivio certificati Windows. In caso contrario, i certificati di firma non verranno trasportati al servizio Device Provisioning tramite un canale protetto con TLS (Transport Layer Security).
Suggerimento
È anche possibile usare OpenSSL anziché il canale sicuro (Schannel) con C SDK. Per altre informazioni sull'uso di OpenSSL, vedere Uso di OpenSSL nell'SDK.
Per aggiungere i certificati di firma all'archivio certificati nei dispositivi basati su Windows:
Nel terminale Git Bash convertire i certificati di firma in
.pfx
come indicato di seguito.Certificato CA radice:
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
Certificato CA intermedio:
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
Fare clic con il pulsante destro del mouse sul pulsante Start di Windows, quindi scegliere Esegui. Immettere certmgr.msc e selezionare OK per avviare gestione certificati.
In Gestione certificati, in Certificati - Utente corrente selezionare Autorità di certificazione radice attendibili. Scegliere quindi Azione>tutte le attività>importate dal menu.
Seguire i passaggi dell'Importazione guidata certificati per importare
root.pfx
.- Assicurarsi di eseguire la ricerca per Scambio informazioni personali (.pfx)
- Usare
1234
come password. - Inserire il certificato nell'archivio certificati Autorità di certificazione radice attendibili.
Ripetere questi passaggi di Gestione certificati per importare
intermediate.pfx
.- Inserire il certificato nell'archivio certificati Autorità di certificazione intermedie.
I certificati di firma sono ora considerati attendibili nel dispositivo basato su Windows e la catena completa può essere trasportata nel servizio Device Provisioning.
Creare un gruppo di registrazioni
Accedere al portale di Azure e aprire l'istanza del servizio Device Provisioning.
Selezionare Gestisci registrazioni nella sezione Impostazioni del menu di spostamento.
Nella parte superiore della pagina selezionare Aggiungi gruppo di registrazione.
Nella scheda Registrazione e provisioning della pagina Aggiungi gruppo di registrazione, specificare le informazioni seguenti per configurare i dettagli del gruppo di registrazione:
Campo Descrizione Attestazione Selezionare certificati intermedi X.509 come meccanismo di attestazione se si vogliono caricare certificati intermedi da usare solo per questo gruppo di registrazioni o selezionare certificati X.509 caricati in questo servizio Device Provisioning se sono già stati caricati certificati intermedi. Impostazioni certificato X.509 A seconda del metodo di attestazione scelto, caricare o selezionare i certificati intermedi primario e secondario per questo gruppo di registrazioni. Nome gruppo Specificare un nome per il gruppo di dispositivi. Il nome del gruppo di registrazione è una stringa senza distinzione tra maiuscole e minuscole (fino a 128 caratteri) di caratteri alfanumerici più i caratteri speciali: '-'
,'.'
,'_'
,':'
. L'ultimo carattere deve essere alfanumerico o un trattino ('-'
).Stato del provisioning Selezionare la casella Abilita questa registrazione se si vuole che questo gruppo di registrazione sia disponibile per il provisioning dei dispositivi. Deselezionare questa casella se si desidera che il gruppo venga disabilitato. Non è possibile modificare questa impostazione in un secondo momento. Criteri di reprovisioning Scegliere un criterio di reprovisioning che rifletta il modo in cui si vuole che il servizio Device Provisioning gestisca i dispositivi che richiedono il provisioning. Per altre informazioni, vedere Criteri di reprovisioning Selezionare Avanti: Hub IoT.
Nella scheda Hub IoT della pagina Aggiungi gruppo di registrazione specificare le informazioni seguenti per determinare gli hub IoT a cui il gruppo di registrazione può effettuare il provisioning dei dispositivi:
Campo Descrizione Hub IoT di destinazione Selezionare uno o più hub IoT collegati oppure aggiungere un nuovo collegamento a un hub IoT. Per altre informazioni sul collegamento degli hub IoT all'istanza del servizio Device Provisioning, vedere Come collegare e gestire hub IoT. Criteri di allocazione Se sono stati selezionati più hub IoT collegati, selezionare la modalità di assegnazione dei dispositivi ai diversi hub. Per altre informazioni sui criteri di allocazione, vedere Come usare i criteri di allocazione.
Se è stato selezionato un solo hub IoT collegato, è consigliabile usare i criteri di distribuzione ponderati in modo uniforme.Selezionare Avanti: Impostazioni dispositivo
Nella scheda Impostazioni dispositivo della pagina Aggiungi gruppo di registrazione specificare le informazioni seguenti per definire la modalità di configurazione dei dispositivi di cui è stato appena effettuato il provisioning:
Campo Descrizione IoT Edge Selezionare Abilita IoT Edge nei dispositivi di cui è stato effettuato il provisioning se tutti i dispositivi di cui è stato effettuato il provisioning tramite questo gruppo eseguiranno Azure IoT Edge. Deselezionare questa casella se questo gruppo è solo per i dispositivi non abilitati per IoT Edge. Tutti i dispositivi in un gruppo saranno abilitati per IoT Edge o nessuno può essere. Tag del dispositivo Usare questa casella di testo per specificare i tag da applicare ai dispositivi gemelli dei dispositivi di cui è stato effettuato il provisioning. Proprietà desiderate Usare questa casella di testo per specificare le proprietà desiderate che si desidera applicare ai dispositivi gemelli dei dispositivi di cui è stato effettuato il provisioning. Per altre informazioni, vedere Comprendere e usare dispositivi gemelli nell'hub IoT.
Selezionare Avanti: Rivedi e crea.
Nella scheda Rivedi e crea, verificare tutti i valori e quindi selezionare Crea.
Preparare ed eseguire il codice di provisioning del dispositivo
In questa sezione si aggiorna il codice di esempio con le informazioni sull'istanza del servizio Device Provisioning. Se un dispositivo è autenticato, viene assegnato a un hub IoT collegato all'istanza del servizio Device Provisioning configurata in questa sezione.
In questa sezione si usa il prompt di Git Bash e l'IDE di Visual Studio.
Configurare il codice del dispositivo di provisioning
In questa sezione si aggiorna il codice di esempio con le informazioni sull'istanza del servizio Device Provisioning.
Nella portale di Azure selezionare la scheda Panoramica per l'istanza del servizio Device Provisioning e prendere nota del valore ambito ID.
Avviare Visual Studio e aprire il nuovo file di soluzione che è stato creato nella directory
cmake
creata nella radice del repository Git azure-iot-sdk-c. Il nome del file di soluzione èazure_iot_sdks.sln
.In Esplora soluzioni per Visual Studio passare a Provision_Samples prov_dev_client_sample > > File di origine e aprire prov_dev_client_sample.c.
Trovare la costante
id_scope
e sostituire il valore con il valore Ambito ID copiato in precedenza. Ad esempio:static const char* id_scope = "0ne00000A0A";
Trovare la definizione per la funzione
main()
nello stesso file. Assicurarsi che lahsm_type
variabile sia impostata suSECURE_DEVICE_TYPE_X509
e che tutte le altrehsm_type
righe siano impostate come commento. Per esempio:SECURE_DEVICE_TYPE hsm_type; //hsm_type = SECURE_DEVICE_TYPE_TPM; hsm_type = SECURE_DEVICE_TYPE_X509; //hsm_type = SECURE_DEVICE_TYPE_SYMMETRIC_KEY;
Salva le modifiche.
Fare clic con il pulsante destro del mouse sul progetto prov_dev_client_sample e scegliere Imposta come progetto di avvio.
Configurare il codice stub del modulo di protezione hardware personalizzato
Le specifiche dell'interazione con l'archiviazione sicura effettiva basata su hardware variano a seconda dell'hardware del dispositivo. Le catene di certificati usate dai dispositivi simulati in questa esercitazione verranno hardcoded nel codice stub del modulo di protezione hardware personalizzato. In uno scenario reale, la catena di certificati verrebbe archiviata nell'hardware del modulo di protezione hardware effettivo per offrire una maggiore sicurezza per le informazioni sensibili. I metodi simili ai metodi stub usati in questo esempio vengono quindi implementati per leggere i segreti dall'archiviazione basata su hardware.
Anche se l'hardware HSM non è necessario, è consigliabile proteggere informazioni riservate come la chiave privata del certificato. Se un modulo di protezione hardware effettivo viene chiamato dall'esempio, la chiave privata non sarà presente nel codice sorgente. La presenza della chiave nel codice sorgente espone la chiave a chiunque possa visualizzare il codice. Questa operazione viene eseguita solo in questa esercitazione per facilitare l'apprendimento.
Per aggiornare il codice stub del modulo di protezione hardware personalizzato per simulare l'identità del dispositivo con ID device-01
:
In Esplora soluzioni per Visual Studio passare a Provision_Samples file di origine custom_hsm_example > > e aprire custom_hsm_example.c.
Aggiornare il valore stringa della costante stringa
COMMON_NAME
usando il nome comune usato per generare il certificato del dispositivo.static const char* const COMMON_NAME = "device-01";
Nel terminale Git Bash eseguire il comando seguente per generare la costante stringa per il certificato del dispositivo:
sed -e 's/^/"/;$ !s/$/""\\n"/;$ s/$/"/' ./certs/device-01-full-chain.cert.pem
Copiare l'output di questo comando.
Aggiornare il valore stringa della
CERTIFICATE
stringa costante usando la catena di certificati salvata in ./certs/device-01-full-chain.cert.pem dopo aver generato i certificati. Usare il testo del certificato di output del passaggio precedente per il valore costante.La sintassi del testo del certificato deve corrispondere al modello seguente senza spazi aggiuntivi o analisi eseguite da 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-----";
In Git Bash eseguire il comando seguente per generare la costante stringa per la chiave privata del dispositivo:
sed -e 's/^/"/;$ !s/$/""\\n"/;$ s/$/"/' ./private/device-01.key.pem
Copiare l'output di questo comando.
Aggiornare il valore stringa della
PRIVATE_KEY
costante con la chiave privata per il certificato del dispositivo. Usare il testo della chiave privata di output del passaggio precedente per il valore costante.La sintassi del testo della chiave privata deve corrispondere al modello seguente senza spazi aggiuntivi o analisi eseguite da Visual Studio.
static const char* const PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----\n" "MIIJJwIBAAKCAgEAtjvKQjIhp0EE1PoADL1rfF/W6v4vlAzOSifKSQsaPeebqg8U\n" ... "X7fi9OZ26QpnkS5QjjPTYI/wwn0J9YAwNfKSlNeXTJDfJ+KpjXBcvaLxeBQbQhij\n" "-----END RSA PRIVATE KEY-----";
Salva le modifiche.
Fare clic con il pulsante destro del mouse sul progetto custom_hsm_example e scegliere Compila.
Importante
È necessario compilare il progetto custom_hsm_example prima di compilare il resto della soluzione nella sezione successiva.
Eseguire l'esempio
Nel menu di Visual Studio selezionare Debug>Avvia senza eseguire debug per eseguire la soluzione. Quando viene chiesto di ricompilare il progetto, selezionare Sì per ricompilare il progetto prima dell'esecuzione.
L'output seguente è un esempio di avvio e connessione del dispositivo
device-01
simulato al servizio di provisioning. Il dispositivo è stato assegnato a un hub IoT ed è stato registrato: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:
Ripetere i passaggi descritti in Configurare il codice stub del modulo di protezione hardware personalizzato per il secondo dispositivo (
device-02
) ed eseguire di nuovo l'esempio. Usare i valori seguenti per il dispositivo:Descrizione valore Nome comune "device-02"
Catena di certificati completa Generare il testo usando ./certs/device-02-full-chain.cert.pem Chiave privata Generare il testo usando ./private/device-02.key.pem L'output seguente è un esempio di avvio corretto del dispositivo
device-02
simulato e della connessione al servizio di provisioning. Il dispositivo è stato assegnato a un hub IoT ed è stato registrato: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:
Il codice di esempio C# è configurato per l'uso di certificati X.509 archiviati in un file con formattazione PKCS#12 protetto da password (pfx). I certificati della catena completa creati in precedenza sono nel formato PEM. Per convertire i certificati a catena completa in formato PKCS#12, immettere i comandi seguenti nel prompt di Git Bash dalla directory in cui sono stati eseguiti in precedenza i comandi 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
Nella parte restante di questa sezione usare il prompt dei comandi di Windows.
Nella portale di Azure selezionare la scheda Panoramica per il servizio Device Provisioning.
Copiare il valore ambito ID.
Nel prompt dei comandi di Windows passare alla directory X509Sample . Questa directory si trova nel repository SDK clonato in un passaggio precedente: .\azure-iot-sdk-csharp\provisioning\device\samples\getting started\X509Sample.
Immettere il comando seguente per compilare ed eseguire l'esempio di provisioning dei dispositivi X.509. Sostituire
<id-scope>
con l'ambito ID copiato dal portale di Azure. Sostituire<your-certificate-folder>
con il percorso della cartella in cui sono stati eseguiti i comandi OpenSSL.dotnet run -- -s <id-scope> -c <your-certificate-folder>\certs\device-01-full-chain.cert.pfx -p 1234
Il dispositivo si connette al servizio Device Provisioning e viene assegnato a un hub IoT. Il dispositivo invia quindi un messaggio di telemetria all'hub IoT. L'output dovrebbe essere simile all'esempio seguente:
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.
Nota
Se non si specifica il certificato e la password nella riga di comando, per impostazione predefinita il file di certificato sarà ./certificate.pfx e verrà richiesta la password.
È possibile passare parametri aggiuntivi per modificare TransportType (-t) e GlobalDeviceEndpoint (-g). Per un elenco completo di parametri di tipo
dotnet run -- --help
.Per registrare il secondo dispositivo, eseguire di nuovo l'esempio usando il certificato completo della catena.
dotnet run -- -s <id-scope> -c <your-certificate-folder>\certs\device-02-full-chain.cert.pfx -p 1234
Nei passaggi seguenti usare il prompt dei comandi di Windows.
Nella portale di Azure selezionare la scheda Panoramica per il servizio Device Provisioning.
Copiare il valore ambito ID.
Nel prompt dei comandi di Windows passare alla directory di esempio e installare i pacchetti necessari per l'esempio. Il percorso visualizzato è relativo alla posizione in cui è stato clonato l'SDK.
cd .\azure-iot-sdk-node\provisioning\device\samples npm install
Nella cartella provisioning\device\samples aprire register_x509.js ed esaminare il codice.
Per impostazione predefinita, l'esempio è MQTT come protocollo di trasporto. Se si desidera utilizzare un protocollo diverso, impostare come commento la riga seguente e rimuovere il commento dalla riga per il protocollo appropriato.
var ProvisioningTransport = require('azure-iot-provisioning-device-mqtt').Mqtt;
L'esempio usa cinque variabili di ambiente per autenticare ed effettuare il provisioning di un dispositivo IoT tramite DPS. Queste variabili di ambiente da modificare sono:
Nome variabile Descrizione PROVISIONING_HOST
Endpoint da usare per la connessione all'istanza del servizio Device Provisioning. Per questa esercitazione, usare l'endpoint globale , global.azure-devices-provisioning.net
.PROVISIONING_IDSCOPE
Ambito ID per l'istanza del servizio Device Provisioning. PROVISIONING_REGISTRATION_ID
ID di registrazione per il dispositivo. Deve corrispondere al nome comune del soggetto nel certificato del dispositivo. CERTIFICATE_FILE
Percorso del file di certificato della catena completa del dispositivo. KEY_FILE
Percorso del file di chiave privata del certificato del dispositivo. Il
ProvisioningDeviceClient.register()
metodo tenta di registrare il dispositivo.Aggiungere variabili di ambiente per l'endpoint del dispositivo globale e l'ambito ID. Sostituire
<id-scope>
con il valore copiato dal portale di Azure.set PROVISIONING_HOST=global.azure-devices-provisioning.net set PROVISIONING_IDSCOPE=<id-scope>
Impostare la variabile di ambiente per l'ID registrazione del dispositivo. L'ID di registrazione per il dispositivo IoT deve corrispondere al nome comune del soggetto nel certificato del dispositivo. Per questa esercitazione, device-01 è sia il nome del soggetto che l'ID di registrazione per il dispositivo.
set PROVISIONING_REGISTRATION_ID=device-01
Impostare le variabili di ambiente per il certificato a catena completa del dispositivo e i file di chiave privata del dispositivo generati in precedenza. Sostituire
<your-certificate-folder>
con il percorso della cartella in cui sono stati eseguiti i comandi 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
Eseguire l'esempio e verificare che il provisioning del dispositivo sia stato eseguito correttamente.
node register_x509.js
L'output dovrebbe essere simile all'esempio seguente:
registration succeeded assigned hub=contoso-hub-2.azure-devices.net deviceId=device-01 Client connected send status: MessageEnqueued
Aggiornare le variabili di ambiente per il secondo dispositivo (
device-02
) in base alla tabella seguente ed eseguire di nuovo l'esempio.Variabile di ambiente Valore 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
Nei passaggi seguenti usare il prompt dei comandi di Windows.
Nella portale di Azure selezionare la scheda Panoramica per il servizio Device Provisioning.
Copiare l'ambito ID.
Nel prompt dei comandi di Windows passare alla directory dell'esempio di provision_x509.py . Il percorso visualizzato è relativo alla posizione in cui è stato clonato l'SDK.
cd .\azure-iot-sdk-python\samples\async-hub-scenarios
Questo esempio usa sei variabili di ambiente per autenticare ed effettuare il provisioning di un dispositivo IoT tramite DPS. Queste variabili di ambiente da modificare sono:
Nome variabile Descrizione PROVISIONING_HOST
Endpoint da usare per la connessione all'istanza del servizio Device Provisioning. Per questa esercitazione, usare l'endpoint globale , global.azure-devices-provisioning.net
.PROVISIONING_IDSCOPE
Ambito ID per l'istanza del servizio Device Provisioning. DPS_X509_REGISTRATION_ID
ID di registrazione per il dispositivo. Deve corrispondere al nome comune del soggetto nel certificato del dispositivo. X509_CERT_FILE
Percorso del file di certificato della catena completa del dispositivo. X509_KEY_FILE
Percorso del file di chiave privata del certificato del dispositivo. PASS_PHRASE
La pass phrase usata per crittografare il file di chiave privata (se usato). Non necessario per questa esercitazione. Aggiungere le variabili di ambiente per l'endpoint del dispositivo globale e l'ambito ID. Per la variabile di ambito ID, usare il valore copiato dalla portale di Azure.
set PROVISIONING_HOST=global.azure-devices-provisioning.net set PROVISIONING_IDSCOPE=<ID scope for your DPS resource>
Impostare la variabile di ambiente per l'ID registrazione del dispositivo. L'ID di registrazione per il dispositivo IoT deve corrispondere al nome comune del soggetto nel certificato del dispositivo. Per questa esercitazione, device-01 è sia il nome del soggetto che l'ID di registrazione per il dispositivo.
set DPS_X509_REGISTRATION_ID=device-01
Impostare le variabili di ambiente per il certificato a catena completa del dispositivo e i file di chiave privata del dispositivo generati in precedenza. Sostituire
<your-certificate-folder>
con il percorso della cartella in cui sono stati eseguiti i comandi 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
Esaminare il codice per provision_x509.py. Se non si usa Python versione 3.7 o successiva, apportare la modifica del codice indicata qui per sostituire
asyncio.run(main())
.Eseguire l'esempio. L'esempio si connette al servizio Device Provisioning, che eseguirà il provisioning del dispositivo in un hub IoT. Dopo il provisioning del dispositivo, l'esempio invia alcuni messaggi di test all'hub IoT.
python provision_x509.py
L'output dovrebbe essere simile all'esempio seguente:
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
Aggiornare le variabili di ambiente per il secondo dispositivo (
device-02
) in base alla tabella seguente ed eseguire di nuovo l'esempio.Variabile di ambiente Valore 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
Nei passaggi seguenti si usano sia il prompt dei comandi di Windows che il prompt di Git Bash.
Nella portale di Azure selezionare la scheda Panoramica per il servizio Device Provisioning.
Copiare l'ambito ID.
Nel prompt dei comandi di Windows passare alla cartella del progetto di esempio. Il percorso visualizzato è relativo alla posizione in cui è stato clonato l'SDK
cd .\azure-iot-sdk-java\provisioning\provisioning-device-client-samples\provisioning-X509-sample
Immettere le informazioni sull'identità del servizio di provisioning e X.509 nel codice di esempio. Questa operazione viene usata durante il provisioning, per l'attestazione del dispositivo simulato, prima della registrazione del dispositivo.
Aprire il file
.\src\main\java\samples\com\microsoft\azure\sdk\iot\ProvisioningX509Sample.java
nell'editor preferito.Aggiornare i valori seguenti. Per
idScope
usare l'ambito ID copiato in precedenza. Per l'endpoint globale, usare l'endpoint del dispositivo globale. Questo endpoint è lo stesso per ogni istanza del servizio Device Provisioning,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]";
L'esempio usa per impostazione predefinita HTTPS come protocollo di trasporto. Se si desidera modificare il protocollo, impostare come commento la riga seguente e rimuovere il commento dalla riga per il protocollo che si vuole usare.
private static final ProvisioningDeviceClientTransportProtocol PROVISIONING_DEVICE_CLIENT_TRANSPORT_PROTOCOL = ProvisioningDeviceClientTransportProtocol.HTTPS;
Aggiornare il valore della
leafPublicPem
stringa costante con il valore del certificato del dispositivo, device-01.cert.pem.La sintassi del testo del certificato deve corrispondere al modello seguente senza spazi o caratteri aggiuntivi.
private static final String leafPublicPem = "-----BEGIN CERTIFICATE-----\n" "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n" ... "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n" "-----END CERTIFICATE-----";
L'aggiornamento manuale di questo valore stringa può essere soggetto a errori. Per generare la sintassi corretta, è possibile copiare e incollare il comando seguente nel prompt di Git Bash e premere INVIO. Questo comando genera la sintassi per il
leafPublicPem
valore costante stringa e la scrive nell'output.sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' ./certs/device-01.cert.pem
Copiare e incollare il testo del certificato di output per il valore costante.
Aggiornare il valore stringa della
leafPrivateKey
costante con la chiave privata non crittografata per il certificato del dispositivo, unencrypted-device-key.pem.La sintassi del testo della chiave privata deve corrispondere al modello seguente senza spazi o caratteri aggiuntivi.
private static final String leafPrivateKey = "-----BEGIN PRIVATE KEY-----\n" + "MIIJJwIBAAKCAgEAtjvKQjIhp0EE1PoADL1rfF/W6v4vlAzOSifKSQsaPeebqg8U\n" + ... "X7fi9OZ26QpnkS5QjjPTYI/wwn0J9YAwNfKSlNeXTJDfJ+KpjXBcvaLxeBQbQhij\n" + "-----END PRIVATE KEY-----";
Per generare la sintassi corretta, è possibile copiare e incollare il comando seguente nel prompt di Git Bash e premere INVIO. Questo comando genera la sintassi per il
leafPrivateKey
valore costante stringa e la scrive nell'output.sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' ./private/device-01.key.pem
Copiare e incollare il testo della chiave privata di output per il valore costante.
Aggiungere una
rootPublicPem
stringa costante con il valore del certificato CA radice, azure-iot-test-only.root.ca.cert.pem. È possibile aggiungerlo subito dopo laleafPrivateKey
costante .La sintassi del testo del certificato deve corrispondere al modello seguente senza spazi o caratteri aggiuntivi.
private static final String rootPublicPem = "-----BEGIN CERTIFICATE-----\n" "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n" ... "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n" "-----END CERTIFICATE-----";
Per generare la sintassi corretta, è possibile copiare e incollare il comando seguente nel prompt di Git Bash e premere INVIO. Questo comando genera la sintassi per il
rootPublicPem
valore costante stringa e la scrive nell'output.sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' ./certs/azure-iot-test-only.root.ca.cert.pem
Copiare e incollare il testo del certificato di output per il valore costante.
Aggiungere una
intermediatePublicPem
stringa costante con il valore del certificato CA intermedio, azure-iot-test-only.intermediate.cert.pem. È possibile aggiungerlo subito dopo la costante precedente.La sintassi del testo del certificato deve corrispondere al modello seguente senza spazi o caratteri aggiuntivi.
private static final String intermediatePublicPem = "-----BEGIN CERTIFICATE-----\n" "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n" ... "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n" "-----END CERTIFICATE-----";
Per generare la sintassi corretta, è possibile copiare e incollare il comando seguente nel prompt di Git Bash e premere INVIO. Questo comando genera la sintassi per il
intermediatePublicPem
valore costante stringa e la scrive nell'output.sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' ./certs/azure-iot-test-only.intermediate.cert.pem
Copiare e incollare il testo del certificato di output per il valore costante.
Trovare le righe seguenti nel
main
metodo .// For group enrollment uncomment this line //signerCertificatePemList.add("<Your Signer/intermediate Certificate Here>");
Aggiungere queste due righe direttamente sotto di esse per aggiungere i certificati ca intermedi e radice alla catena di firma. La catena di firma deve includere l'intera catena di certificati fino a e includere un certificato verificato con DPS.
signerCertificatePemList.add(intermediatePublicPem); signerCertificatePemList.add(rootPublicPem);
Nota
L'ordine in cui vengono aggiunti i certificati di firma è importante. L'esempio avrà esito negativo se viene modificato.
Salva le modifiche.
Compilare l'esempio e quindi passare alla
target
cartella .mvn clean install cd target
La compilazione restituisce .jar file nella
target
cartella con il formato di file seguente:provisioning-x509-sample-{version}-with-deps.jar
; ad esempio:provisioning-x509-sample-1.8.1-with-deps.jar
. Eseguire il file .jar. Potrebbe essere necessario sostituire la versione nel comando seguente.java -jar ./provisioning-x509-sample-1.8.1-with-deps.jar
L'esempio si connette al servizio Device Provisioning, che effettua il provisioning del dispositivo a un hub IoT. Dopo il provisioning del dispositivo, l'esempio invierà alcuni messaggi di test all'hub IoT.
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!
Aggiornare le costanti per il secondo dispositivo (
device-02
) in base alla tabella seguente, ricompilare ed eseguire di nuovo l'esempio.Costante File da usare leafPublicPem
./certs/device-02.cert.pem leafPrivateKey
./private/device-02.key.pem
Confermare la registrazione del provisioning dei dispositivi
Esaminare i record di registrazione del gruppo di registrazione per visualizzare i dettagli di registrazione per i dispositivi:
Passare all'istanza del servizio Device Provisioning nel portale di Azure.
Nel menu Impostazioni selezionare Gestisci registrazioni.
Selezionare Gruppi di registrazione. La voce del gruppo di registrazione X.509 creata in precedenza dovrebbe essere visualizzata nell'elenco.
Selezionare la voce di registrazione. Selezionare quindi Dettagli accanto allo stato registrazione per visualizzare i dispositivi registrati tramite il gruppo di registrazione. L'hub IoT a cui è stato assegnato ogni dispositivo, i relativi ID dispositivo e le date e le ore in cui sono stati registrati vengono visualizzati nell'elenco.
È possibile selezionare uno dei dispositivi per visualizzare altri dettagli per il dispositivo.
Per verificare i dispositivi nell'hub IoT:
In portale di Azure passare all'hub IoT a cui è stato assegnato il dispositivo.
Nel menu Gestione dei dispositivi selezionare Dispositivi.
Se il provisioning dei dispositivi è stato eseguito correttamente, gli ID dispositivo, device-01 e device-02 devono essere visualizzati nell'elenco, con Stato impostato come abilitato. Se i dispositivi non sono visualizzati, selezionare Aggiorna.
Pulire le risorse
Una volta terminati il test e l'esplorazione di questo client del dispositivo di esempio, usare la procedura seguente per eliminare tutte le risorse create da questa esercitazione.
- Chiudere la finestra di output di esempio di client del dispositivo sul computer.
Eliminare il gruppo di registrazione
Nel menu a sinistra nel portale di Azure, selezionare Tutte le risorse.
Selezionare l'istanza del servizio Device Provisioning.
Nel menu Impostazioni selezionare Gestisci registrazioni.
Selezionare la scheda Gruppi di registrazione.
Selezionare il gruppo di registrazione usato per questa esercitazione.
Nella pagina Dettagli registrazione selezionare Dettagli accanto allo stato registrazione. Selezionare quindi la casella di controllo accanto all'intestazione di colonna ID dispositivo per selezionare tutti i record di registrazione per il gruppo di registrazione. Selezionare Elimina nella parte superiore della pagina per eliminare i record di registrazione.
Importante
L'eliminazione di un gruppo di registrazione non comporta l'eliminazione dei record di registrazione associati. Questi record orfani verranno conteggiati rispetto alla quota di registrazioni per l'istanza del servizio Device Provisioning. Per questo motivo, è consigliabile eliminare tutti i record di registrazione associati a un gruppo di registrazione prima di eliminare il gruppo di registrazione stesso.
Tornare alla pagina Gestisci registrazioni e verificare che la scheda Gruppi di registrazione sia selezionata.
Selezionare la casella di controllo accanto al nome del gruppo di registrazione usato per questa esercitazione.
Nella parte superiore della pagina selezionare Elimina.
Eliminare i certificati CA registrati dal servizio Device Provisioning
- Selezionare Certificati dal menu a sinistra dell'istanza del servizio Device Provisioning. Per ogni certificato caricato e verificato in questa esercitazione, selezionare il certificato e selezionare Elimina e confermare la scelta di rimuoverlo.
Eliminare le registrazioni dei dispositivi da hub IoT
Nel menu a sinistra nel portale di Azure, selezionare Tutte le risorse.
Selezionare l'hub IoT.
Nel menu Explorer selezionare Dispositivi IoT.
Selezionare la casella di controllo accanto all'ID dispositivo dei dispositivi registrati in questa esercitazione. Ad esempio, device-01 e device-02.
Nella parte superiore della pagina selezionare Elimina.
Passaggi successivi
In questa esercitazione è stato eseguito il provisioning di più dispositivi X.509 nell'hub IoT usando un gruppo di registrazione. Informazioni su come eseguire il provisioning di dispositivi IoT in più hub.