Connettere un dispositivo downstream a un gateway Azure IoT Edge

Si applica a: Icona Sì IoT Edge 1.1

Importante

La data di fine del supporto di IoT Edge 1.1 è stata il 13 dicembre 2022. Controlla il ciclo di vita dei prodotti Microsoft per ottenere informazioni sul modo in cui viene supportato questo prodotto, servizio, tecnologia o API. Per altre informazioni sull'aggiornamento alla versione più recente di IoT Edge, vedere Aggiornare IoT Edge.

Questo articolo fornisce istruzioni per stabilire una connessione attendibile tra i dispositivi downstream e i gateway trasparenti di IoT Edge. In uno scenario basato su gateway trasparente uno o più dispositivi possono passare i propri messaggi attraverso un unico dispositivo gateway che gestisce la connessione all'hub IoT.

Ci sono tre passaggi generali per configurare correttamente una connessione gateway trasparente. Questo articolo illustra il terzo passaggio:

  1. Configurare il dispositivo gateway come server in modo che i dispositivi downstream possano connettersi in modo sicuro. Configurare il gateway per ricevere messaggi dai dispositivi downstream e instradarli alla destinazione corretta. Per questi passaggi, vedere Configurare un dispositivo IoT Edge in modo che funga da gateway trasparente.

  2. Creare un'identità del dispositivo per il dispositivo downstream in modo che possa eseguire l'autenticazione con l'hub IoT. Configurare il dispositivo downstream per inviare messaggi tramite il dispositivo gateway. Per questi passaggi, vedere Autenticare un dispositivo downstream nell'hub IoT di Azure.

  3. Connettere il dispositivo downstream al dispositivo gateway e iniziare a inviare messaggi.

Questo articolo illustra i concetti di base per le connessioni dei dispositivi downstream e illustra come configurare i dispositivi downstream tramite:

  • Presentazione dei concetti di base relativi al protocollo Transport Layer Security (TLS) e ai certificati.
  • Descrizione del funzionamento delle librerie TLS su sistemi operativi diversi e di come ogni sistema operativo gestisce i certificati.
  • Alcuni esempi di Azure IoT in diversi linguaggi per semplificare le attività iniziali.

In questo articolo i termini gateway e gateway IoT Edge si riferiscono a un dispositivo IoT Edge configurato come gateway trasparente.

Nota

Un dispositivo downstream genera dati direttamente in Internet o nei dispositivi gateway, abilitati o meno per IoT Edge. Un dispositivo figlio può essere un dispositivo downstream o un dispositivo gateway in una topologia annidata.

Prerequisiti

  • Fare in modo che il file di certificato CA radice usato per generare il certificato ca del dispositivo in Configurare un dispositivo IoT Edge funga da gateway trasparente disponibile nel dispositivo downstream. Il dispositivo downstream usa questo certificato per convalidare l'identità del dispositivo gateway. Se sono stati usati i certificati demo, il certificato DELLA CA radice è denominato azure-iot-test-only.root.ca.cert.pem.
  • I stringa di connessione modificati che puntano al dispositivo gateway, come illustrato in Autenticare un dispositivo downstream per hub IoT di Azure.

Preparare un dispositivo downstream

Un dispositivo downstream può essere qualsiasi applicazione o piattaforma la cui identità sia stata creata con il servizio cloud hub IoT di Azure. In molti casi, queste applicazioni usano Azure IoT SDK per dispositivi. Un dispositivo downstream può anche essere un'applicazione in esecuzione nel dispositivo gateway IoT Edge stesso. Un altro dispositivo IoT Edge non può tuttavia essere un dispositivo downstream di un gateway IoT Edge.

Nota

I dispositivi IoT registrati con l'hub IoT possono usare moduli gemelli per isolare processi, hardware o funzioni diversi in un singolo dispositivo. I gateway IoT Edge supportano connessioni di moduli downstream tramite l'autenticazione con chiave simmetrica, ma non con l'autenticazione del certificato X.509.

Per connettere un dispositivo downstream a un gateway Azure IoT Edge, sono necessari due elementi:

  • Un'applicazione o un dispositivo configurato con una stringa di connessione del dispositivo hub IoT cui siano aggiunte le informazioni necessarie per la connessione dell'applicazione o del dispositivo al gateway.

    Questo passaggio è stato completato nell'articolo precedente, Autenticare un dispositivo downstream per hub IoT di Azure.

  • Il dispositivo o l'applicazione deve considerare attendibile il certificato CA radice del gateway per convalidare le connessioni TLS (Transport Layer Security) al dispositivo gateway.

    Questo passaggio viene descritto in dettaglio nella parte restante di questo articolo. Questo passaggio può essere eseguito in due modi: installando il certificato della CA nell'archivio certificati del sistema operativo o (per alcuni linguaggi) facendo riferimento al certificato all'interno delle applicazioni tramite gli SDK di Azure IoT.

Nozioni fondamentali su TLS e sui certificati

La sfida di connettere in modo sicuro dispositivi downstream a IoT Edge viene gestita esattamente come per le altre comunicazioni client/server sicure che hanno luogo tramite internet. Un client e un server comunicano in modo sicuro tramite Internet usando il protocollo Transport Layer Security (TLS). TLS viene integrato tramite costrutti di infrastruttura a chiave pubblica (PKI) denominati certificati. TLS è una specifica piuttosto complessa relativa a un'ampia gamma di argomenti correlati alla protezione di due endpoint. Nella sezione seguente vengono riepilogati i requisiti per connettere in modo sicuro i dispositivi a un gateway IoT Edge.

Quando un client si connette a un server, il server presenta una catena di certificati, denominata catena di certificati server. Una catena di certificati è in genere costituita da un certificato dell'autorità di certificazione (CA) radice, uno o più certificati della CA intermedia e infine il certificato del server stesso. Un client stabilisce relazioni di trust con un server verificando crittograficamente l'intera catena di certificati server. La convalida client della catena di certificati del server è denominata convalida della catena del server. Il client sfida il server nel tentativo di dimostrare il possesso della chiave privata associata al certificato del server tramite un processo denominato dimostrazione del possesso. La combinazione di convalida della catena di server e dimostrazione del possesso viene denominata autenticazione del server. Per convalidare una catena di certificati server, un client richiede una copia del certificato della CA radice che è stato usato per creare (o rilasciare) il certificato del server. Nel caso di connessione a siti Web, in genere un browser viene preconfigurato con certificati della CA di uso comune in modo da fornire al client un processo semplificato.

Quando un dispositivo si connette all'hub IoT di Azure, il dispositivo è il client e il servizio cloud hub IoT è il server. Il servizio cloud hub IoT è supportato da un certificato della CA radice denominato Baltimore CyberTrust Root, disponibile a livello pubblico e ampiamente utilizzato. Poiché il certificato della CA dell'hub IoT è già installato nella maggior parte dei dispositivi, molte implementazioni di TLS (OpenSSL, Schannel, LibreSSL) lo usano automaticamente durante la convalida del certificato server. Tuttavia, un dispositivo che si connette correttamente all'hub IoT può avere problemi quando tenta di connettersi a un gateway IoT Edge.

Quando un dispositivo si connette al gateway IoT Edge, il dispositivo downstream è il client, mentre il dispositivo gateway è il server. Azure IoT Edge consente di creare catene di certificati del gateway in base alle esigenze. È possibile scegliere di usare un certificato della CA pubblico, come Baltimore, o un certificato della CA radice autofirmato (o interno). I certificati della CA pubblici prevedono costi associati e di conseguenza vengono usati in genere in scenari di produzione. I certificati della CA autofirmati vengono scelti per scenari di sviluppo e test. Se si usano i certificati demo, si tratta di certificati CA radice autofirmati.

Quando si usa un certificato della CA radice autofirmato per un gateweay IoT Edge, questo deve essere installato su o fornito a tutti i dispositivi downstream che tentano di connettersi al gateway.

Installazione del certificato del gateway

Per altre informazioni sui certificati di IoT Edge e su alcune implicazioni correlate alla produzione, vedere Dettagli sull'utilizzo di certificati di IoT Edge.

Fornire il certificato della CA radice

Per verificare i certificati del dispositivo gateway, il dispositivo downstream necessita della propria copia del certificato della CA radice. Se sono stati usati gli script forniti nel repository Git di IoT Edge per creare certificati di test, il certificato della CA radice è denominato azure-iot-test-only.root.ca.cert.pem. Spostare questo file di certificato in qualsiasi directory del dispositivo downstream qualora non si sia già provveduto in tal senso come parte degli altri passaggi di preparazione del dispositivo downstream. È possibile usare un servizio come Azure Key Vault o una funzione come il protocollo Secure Copy per spostare i file di certificato.

Installare i certificati nel sistema operativo

Quando il certificato CA radice si trova nel dispositivo downstream, è necessario assicurarsi che le applicazioni che si connettono al gateway possano accedere al certificato.

L'installazione del certificato della CA radice nell'archivio certificati del sistema operativo consente in genere alla maggior parte delle applicazioni di usare il certificato della CA radice. Esistono alcune eccezioni, ad esempio le applicazioni NodeJS che non usano l'archivio certificati del sistema operativo, bensì l'archivio certificati interno del runtime Node. Se non è possibile installare il certificato a livello di sistema operativo, passare a Usare i certificati con gli SDK di Azure IoT.

Ubuntu

I comandi seguenti offrono un esempio di come installare un certificato della CA in un host Ubuntu. In questo esempio si presuppone che venga usato il certificato azure-iot-test-only.root.ca.cert.pem indicato negli articoli relativi ai prerequisiti e che il certificato sia stato copiato in una posizione nel dispositivo downstream.

sudo cp <path>/azure-iot-test-only.root.ca.cert.pem /usr/local/share/ca-certificates/azure-iot-test-only.root.ca.cert.pem.crt
sudo update-ca-certificates

Verrà visualizzato un messaggio simile al seguente: "Aggiornamento dei certificati in /etc/ssl/certs... 1 aggiunto, 0 rimossi; operazione completata".

Finestre

I passaggi seguenti offrono un esempio di come installare un certificato della CA in un host Windows. In questo esempio si presuppone che venga usato il certificato azure-iot-test-only.root.ca.cert.pem indicato negli articoli relativi ai prerequisiti e che il certificato sia stato copiato in una posizione nel dispositivo downstream.

È possibile installare i certificati usando Import-Certificate di PowerShell come amministratore:

import-certificate  <file path>\azure-iot-test-only.root.ca.cert.pem -certstorelocation cert:\LocalMachine\root

È anche possibile installare i certificati usando l'utilità certlm:

  1. Dal menu Start cercare e selezionare Gestisci i certificati computer. Verrà avviata un'utilità denominata certlm.
  2. Passare a Certificati - Computer locale>Autorità di certificazione radice attendibili.
  3. Fare clic con il pulsante destro del mouse su Certificati e scegliere Tutte le attività>Importa. Viene avviata l'Importazione guidata certificati.
  4. Seguire i passaggi indicati e importare il file del certificato <path>/azure-iot-test-only.root.ca.cert.pem. Al termine, verrà visualizzato il messaggio "Importazione completata".

È anche possibile installare certificati a livello di codice tramite API .NET, come mostrato nell'esempio .NET più avanti in questo articolo.

In genere le applicazioni usano lo stack TLS fornito da Windows denominato Schannel per la connessione sicura tramite TLS. Schannel richiede che tutti i certificati siano installati nell'archivio certificati di Windows prima di tentare di stabilire una connessione TLS.

Usare i certificati con gli SDK di Azure IoT

Questa sezione descrive la connessione degli SDK di Azure IoT a un dispositivo IoT Edge tramite semplici applicazioni di esempio. L'obiettivo di tutti gli esempi consiste nel connettere il dispositivo client e inviare messaggi di telemetria al gateway, quindi chiudere la connessione e uscire.

Prima di usare gli esempi a livello di applicazione, preparare due elementi:

  • Il dispositivo downstream hub IoT stringa di connessione modificato per puntare al dispositivo gateway ed eventuali certificati necessari per autenticare il dispositivo downstream per hub IoT. Per altre informazioni, vedere Autenticare un dispositivo downstream nell'hub IoT di Azure.

  • Percorso completo del certificato della CA radice copiato e salvato in una posizione nel dispositivo downstream.

    Ad esempio: <path>/azure-iot-test-only.root.ca.cert.pem.

NodeJS

Questa sezione fornisce un'applicazione di esempio per la connessione di un client dispositivo NodeJS Azure IoT a un gateway IoT Edge. Per le applicazioni NodeJS, è necessario installare il certificato della CA radice a livello di applicazione, come illustrato di seguito. Le applicazioni NodeJS non usano l'archivio certificati del sistema.

  1. Ottenere l'esempio per edge_downstream_device.js nel repository degli esempi di Azure IoT SDK per dispositivi per Node.js.
  2. Assicurarsi di avere predisposto tutti i prerequisiti per eseguire l'esempio esaminando il file readme.md.
  3. Nel file edge_downstream_device.js aggiornare le variabili connectionString e edge_ca_cert_path.
  4. Vedere la documentazione dell'SDK per istruzioni su come eseguire l'esempio nel dispositivo.

Per informazioni sull'esempio in esecuzione, il frammento di codice seguente mostra in che modo il client SDK legge il file del certificato e lo usa per stabilire una connessione TLS sicura:

// Provide the Azure IoT device client via setOptions with the X509
// Edge root CA certificate that was used to setup the Edge runtime
var options = {
    ca : fs.readFileSync(edge_ca_cert_path, 'utf-8'),
};

.NET

Questa sezione presenta un'applicazione di esempio per la connessione a un client dispositivo .NET Azure IoT a un gateway IoT Edge. Tuttavia, le applicazioni .NET sono automaticamente in grado di usare i certificati installati nell'archivio certificati del sistema in host sia Linux sia Windows.

  1. Ottenere l'esempio per EdgeDownstreamDevice nella cartella degli esempi di IoT Edge per .NET.
  2. Assicurarsi di avere predisposto tutti i prerequisiti per eseguire l'esempio esaminando il file readme.md.
  3. Nel file Properties/launchSettings.jsonaggiornare le variabili DEVICE_CONNECTION_STRING e CA_CERTIFICATE_PATH. Se si vuole usare il certificato installato nell'archivio certificati attendibili nel sistema host, lasciare vuota questa variabile.
  4. Vedere la documentazione dell'SDK per istruzioni su come eseguire l'esempio nel dispositivo.

Per installare a livello di codice un certificato attendibile nell'archivio certificati tramite un'applicazione .NET, fare riferimento alla funzione InstallCACert() nel file EdgeDownstreamDevice/Program.cs. Poiché questa operazione è idempotente, può essere eseguita più volte con gli stessi valori senza produrre altri effetti.

A

Questa sezione presenta un'applicazione di esempio per la connessione a un client dispositivo C Azure IoT a un gateway IoT Edge. L'SDK per C supporta molte librerie TLS, tra cui OpenSSL WolfSSL e Schannel. Per altre informazioni, vedere Azure IoT SDK per C.

  1. Ottenere l'applicazione iotedge_downstream_device_sample nel repository degli esempi di Azure IoT SDK per dispositivi per C.
  2. Assicurarsi di avere predisposto tutti i prerequisiti per eseguire l'esempio esaminando il file readme.md.
  3. Nel file iotedge_downstream_device_sample.c aggiornare le variabili connectionString e edge_ca_cert_path.
  4. Vedere la documentazione dell'SDK per istruzioni su come eseguire l'esempio nel dispositivo.

Azure IoT SDK per dispositivi per C fornisce un'opzione per registrare un certificato della CA durante la configurazione del client. Questa operazione non installa il certificato ovunque, ma usa invece un formato di stringa del certificato in memoria. Il certificato salvato viene fornito allo stack TLS sottostante quando si stabilisce una connessione.

(void)IoTHubDeviceClient_SetOption(device_handle, OPTION_TRUSTED_CERT, cert_string);

Nota

Il metodo per registrare un certificato della CA durante la configurazione del client può cambiare se si usa un pacchetto o una libreria gestita. Ad esempio, la libreria basata sull'IDE Arduino richiede l'aggiunta del certificato della CA a una matrice di certificati definita in un file globale certs.c, anziché usare l'operazione IoTHubDeviceClient_LL_SetOption.

Se negli host Windows non si usa OpenSSL o un'altra libreria TLS, per impostazione predefinita l'SDK usa Schannel. Per il corretto funzionamento di Schannel, il certificato della CA radice di IoT Edge deve essere installato nell'archivio certificati di Windows e non deve essere impostato tramite l'operazione IoTHubDeviceClient_SetOption.

Java

Questa sezione presenta un'applicazione di esempio per la connessione a un client dispositivo Java Azure IoT a un gateway IoT Edge.

  1. Ottenere l'esempio per Send-event nel repository degli esempi di Azure IoT SDK per dispositivi per Java.
  2. Assicurarsi di avere predisposto tutti i prerequisiti per eseguire l'esempio esaminando il file readme.md.
  3. Vedere la documentazione dell'SDK per istruzioni su come eseguire l'esempio nel dispositivo.

Python

Questa sezione presenta un'applicazione di esempio per la connessione di un cliente dispositivo Python Azure IoT a un gateway IoT Edge.

  1. Ottenere l'esempio per send_message_downstream dai campioni di Azure IoT SDK per dispositivi per Python.
  2. Impostare il IOTHUB_DEVICE_CONNECTION_STRING e le variabili di ambienteIOTEDGE_ROOT_CA_CERT_PATH come specificato nei commenti dello script Python.
  3. Per altre istruzioni su come eseguire l'esempio nel dispositivo, vedere la documentazione dell'SDK.

Testare la connessione al gateway

Usare questo comando di esempio nel dispositivo downstream per verificare che possa connettersi al dispositivo gateway:

openssl s_client -connect mygateway.contoso.com:8883 -CAfile <CERTDIR>/certs/azure-iot-test-only.root.ca.cert.pem -showcerts

Questo comando verifica le connessioni tramite MQTTS (porta 8883). Se si usa un protocollo diverso, modificare il comando in base alle esigenze per AMQPS (5671) o HTTPS (443)

L'output di questo comando può essere lungo, includendo informazioni su tutti i certificati nella catena. Se la connessione ha esito positivo, verrà visualizzata una riga come Verification: OK o Verify return code: 0 (ok).

Verificare la connessione al gateway

Risolvere i problemi di connessione del gateway

Se il dispositivo downstream ha una connessione intermittente al dispositivo gateway, provare i passaggi seguenti per la risoluzione.

  1. Il nome host del gateway nella stringa di connessione corrisponde al valore del nome host nel file config di IoT Edge nel dispositivo gateway?
  2. Il nome host del gateway può essere risolto con un indirizzo IP? È possibile risolvere le connessioni intermittenti tramite DNS o aggiungendo una voce di file host nel dispositivo downstream.
  3. Le porte di comunicazione sono aperte nel firewall? Tra il dispositivo downstream e l'IoT Edge trasparente deve essere possibile la comunicazione basata sul protocollo usato MQTTS:8883/AMQPS:5671/HTTPS:433.

Passaggi successivi

Informazioni sull'estensione delle funzionalità offline ai dispositivi downstream in IoT Edge.