Condividi tramite


Proteggere la comunicazione del broker MQTT tramite BrokerListener

Importante

Questa pagina include istruzioni per la gestione dei componenti di Operazioni IoT di Azure usando i manifesti di distribuzione kubernetes, disponibile in anteprima. Questa funzionalità viene fornita con diverse limitazioni e non deve essere usata per i carichi di lavoro di produzione.

Vedere le condizioni per l'utilizzo supplementari per le anteprime di Microsoft Azure per termini legali aggiuntivi che si applicano a funzionalità di Azure in versione beta, in anteprima o in altro modo non ancora disponibili a livello generale.

Una risorsa BrokerListener corrisponde a un endpoint di rete che espone il broker ai client in rete. È possibile disporre di una o più risorse BrokerListener per ogni broker, con più porte e controllo di accesso diverso per ogni broker.

Ogni porta BrokerListener può avere regole di autenticazione e autorizzazione proprie che definiscono chi può connettersi a tale porta del listener e quali azioni possono eseguire sul broker. È possibile usare le risorse BrokerAuthentication e BrokerAuthorization per specificare i criteri di controllo di accesso per ogni porta del listener. Questa flessibilità consente di ottimizzare le autorizzazioni e i ruoli per i client MQTT in base alle esigenze e ai casi d'uso.

Suggerimento

La distribuzione predefinita del broker MQTT è un servizio IP del cluster che richiede ai client di connettersi con il protocollo TLS (Transport Layer Security) ed eseguire l'autenticazione con i token dell'account del servizio. I client che si connettono dall'esterno del cluster necessitano di una configurazione aggiuntiva prima di potersi connettere.

I listener broker presentano le caratteristiche seguenti:

Per un elenco di tutte le impostazioni disponibili, vedere le informazioni di riferimento sull'API del listener broker.

BrokerListener predefinito

Quando si distribuisce Azure IoT Operations, la distribuzione crea una risorsa BrokerListener denominata default. Questo listener viene usato per la comunicazione interna crittografata tra i componenti operazioni IoT. Il listener predefinito fa parte del broker predefinito.

  • Espone un servizio ClusterIp sulla porta 18883.
  • Richiede ai client di usare l'autenticazione dell'account del servizio Kubernetes.
  • Ha un certificato TLS gestito automaticamente.
  • Non configura alcun criterio di autorizzazione client.

Attenzione

Per evitare di interrompere la comunicazione interna delle operazioni IoT, mantenere invariato il listener predefinito e dedicato per l'uso interno. Per la comunicazione esterna, creare un nuovo listener. Se è necessario usare il ClusterIp servizio, aggiungere altre porte al listener predefinito senza modificare alcuna delle impostazioni esistenti.

Per visualizzare o modificare il listener predefinito, seguire questa procedura.

  1. Nella portale di Azure passare all'istanza di Operazioni IoT.

  2. In Componenti selezionare MqTT Broker.

    Screenshot che mostra l'uso del portale di Azure per visualizzare la configurazione MQTT delle operazioni di Azure IoT.

  3. Nell'elenco listener broker selezionare il listener predefinito .

    Screenshot che mostra l'uso del portale di Azure per visualizzare o modificare il listener broker predefinito.

  4. Esaminare le impostazioni del listener, ma evitare di modificare le impostazioni esistenti. Creare invece una nuova porta e configurarla in base alle esigenze.

Evitare di modificare il listener broker predefinito

Per evitare l'interruzione della comunicazione interna delle operazioni IoT, mantenere invariato il listener predefinito e dedicato per l'uso interno. Per la comunicazione esterna, creare un nuovo listener.

Poiché il listener broker predefinito usa il tipo di ClusterIpservizio e è possibile avere un solo listener per tipo di servizio, aggiungere altre porte al listener predefinito senza modificare alcuna delle impostazioni esistenti se è necessario usare il ClusterIp servizio.

Creare nuovi listener broker

Per creare un nuovo listener, specificare le impostazioni seguenti:

  • Nome: nome del listener. Questo nome è anche il nome del servizio Kubernetes a meno che non venga sottoposto a override.
  • Tipo di servizio: tipo del servizio Kubernetes. Vedere Tipo di servizio.
  • Porte: elenco di porte su cui rimanere in ascolto. Vedere Porte.
  • Nome servizio (facoltativo): eseguire l'override del nome del servizio Kubernetes. Vedere Nome del servizio.

Esempio: Creare un nuovo listener con due porte

Questo esempio illustra come creare un nuovo listener con il LoadBalancer tipo di servizio. La risorsa BrokerListener definisce due porte che accettano connessioni MQTT dai client.

  • La prima porta è in ascolto sulla porta 1883 senza TLS e autenticazione. Questa configurazione è adatta solo per i test. Non usare questa configurazione nell'ambiente di produzione.
  • La seconda porta è in ascolto sulla porta 8883 con TLS e l'autenticazione abilitata. Solo i client autenticati con un token dell'account del servizio Kubernetes possono connettersi. TLS è impostato sulla modalità automatica, usando cert-manager per gestire il certificato server dall'autorità emittente predefinita. Questa configurazione è più vicina a una configurazione di produzione.
  1. Nella portale di Azure passare all'istanza di Operazioni IoT.

  2. In Componenti selezionare MqTT Broker.

  3. Selezionare il listener broker MQTT per LoadBalancer Create (Crea loadBalancer).>

    Immetti le impostazioni seguenti:

    Impostazione Description
    Nome Nome della risorsa BrokerListener.
    Nome servizio Nome del servizio Kubernetes. Lasciare vuoto per usare il nome del listener come nome del servizio.
    Tipo di servizio LoadBalancer già selezionato.
  4. In Porte immettere le impostazioni seguenti per la prima porta:

    Impostazione Descrizione
    Porta Immettere 1883.
    Autenticazione Scegliere Nessuna
    Autorizzazione Scegliere Nessuna
    Protocollo Scegliere MQTT.
    TLS Non aggiungere.
  5. Selezionare Aggiungi voce di porta per aggiungere una seconda porta e immettere le impostazioni seguenti:

    Impostazione Descrizione
    Porta Immettere 8883.
    Autenticazione Scegliere il valore predefinito.
    Autorizzazione Scegliere Nessuna
    Protocollo Scegliere MQTT.
    TLS Selezionare Aggiungi.
  6. Nel riquadro configurazione TLS immettere le impostazioni seguenti:

    Impostazione Descrizione
    Modalità TLS Scegliere Automatico.
    Nome dell'autorità emittente Immetti azure-iot-operations-aio-certificate-issuer.
    Tipo autorità di certificazione Scegliere ClusterIssuer.

    Lasciare le altre impostazioni predefinite e selezionare Applica.

  7. Selezionare Crea listener.

    Screenshot che mostra l'uso del portale di Azure per creare un broker MQTT per il listener del servizio di bilanciamento del carico.

Tipo di servizio

Ogni risorsa BrokerListener viene mappata a un servizio Kubernetes. Il tipo di servizio determina la modalità di esposizione del broker alla rete. I tipi di servizio supportati sono:

  • ClusterIp: espone il broker in un indirizzo IP interno del cluster. I client possono connettersi al broker dall'interno del cluster. Questo tipo di servizio predefinito è per il listener predefinito.
  • NodePort: espone il broker sull'INDIRIZZO IP di ogni nodo a una porta statica. I client possono connettersi al broker dall'esterno del cluster. Questo tipo di servizio è utile per lo sviluppo e il test.
  • LoadBalancer: espone esternamente il broker. Al servizio viene assegnato un indirizzo IP esterno che i client possono usare per connettersi al broker. Questo tipo di servizio è il più comune per le distribuzioni di produzione.

Solo un listener per tipo di servizio

È consentito un solo listener per tipo di servizio. Se è necessaria una maggiore connettività dello stesso tipo di servizio, aggiungere altre porte al listener esistente di tale tipo di servizio.

Nome servizio

Il nome del servizio è il nome del servizio Kubernetes associato al broker. Se non specificato, il nome del listener broker viene usato come nome del servizio. Il nome del servizio deve essere univoco all'interno dello spazio dei nomi .

Suggerimento

Per evitare il sovraccarico di gestione, è consigliabile lasciare vuoto il nome del servizio. Il nome del listener è univoco ed è possibile usarlo per identificare il servizio. Usare il nome del servizio come override solo quando non è possibile denominare il servizio dopo il listener.

Porti

Ogni listener può avere più porte e ogni porta può avere le proprie impostazioni per l'autenticazione, l'autorizzazione, il protocollo e TLS.

Per usare la propria impostazione di autenticazione o autorizzazione per una porta, è necessario creare le risorse corrispondenti prima di usarla con un listener. Per altre informazioni, vedere Configurare l'autenticazione del broker MQTT e Configurare l'autorizzazione del broker MQTT.

Per usare TLS, vedere le sezioni Configurare TLS con la gestione automatica dei certificati o Configurare TLS con la gestione manuale dei certificati.

Usare la stessa porta tra listener

L'uso dello stesso numero di porta tra listener diversi non è supportato. Ogni numero di porta deve essere univoco all'interno del broker MQTT operazioni IoT.

Ad esempio, se si dispone di un listener usando la porta 1883, non è possibile creare un altro listener con la porta 1883. Analogamente, il listener predefinito usa la porta 18883, quindi non è possibile creare un altro listener con la porta 18883.

Supporto di WebSocket

Il broker MQTT operazioni IoT supporta MQTT su WebSocket. Per abilitare WebSocket, impostare il protocollo su WebSockets per la porta.

Configurare TLS con la gestione automatica dei certificati

Per abilitare TLS con la gestione automatica dei certificati, specificare le impostazioni TLS in una porta del listener.

Verificare l'installazione di cert-manager

Con la gestione automatica dei certificati, si usa cert-manager per gestire il certificato del server TLS. Per impostazione predefinita, cert-manager viene installato insieme alle operazioni IoT nello spazio dei cert-manager nomi già. Verificare l'installazione prima di procedere.

  1. Usare kubectl per verificare la presenza di pod corrispondenti alle etichette dell'app cert-manager.

    kubectl get pods --namespace cert-manager -l 'app in (cert-manager,cainjector,webhook)'
    
    NAME                                           READY   STATUS    RESTARTS       AGE
    aio-cert-manager-64f9548744-5fwdd              1/1     Running   4 (145m ago)   4d20h
    aio-cert-manager-cainjector-6c7c546578-p6vgv   1/1     Running   4 (145m ago)   4d20h
    aio-cert-manager-webhook-7f676965dd-8xs28      1/1     Running   4 (145m ago)   4d20h
    
  2. Se vengono visualizzati i pod come pronti e in esecuzione, cert-manager viene installato e pronto per l'uso.

Suggerimento

Per verificare ulteriormente l'installazione, controllare la documentazione di cert-manager per verificare l'installazione. Ricordarsi di usare lo spazio dei nomi cert-manager.

Creare un'autorità di certificazione per il certificato del server TLS

La risorsa autorità di certificazione cert-manager definisce il modo in cui i certificati vengono rilasciati automaticamente. Cert-manager supporta diversi tipi di autorità emittenti in modo nativo. Supporta anche un tipo esterno issuer per estendere le funzionalità oltre le autorità emittenti supportate in modo nativo. È possibile usare un broker MQTT con qualsiasi tipo di emittente di cert-manager.

Importante

Durante la distribuzione iniziale, le operazioni IoT vengono installate con un'autorità di certificazione predefinita per i certificati server TLS. È possibile usare questa autorità emittente per lo sviluppo e il test. Per altre informazioni, vedere Autorità di certificazione radice predefinita e autorità di certificazione con operazioni IoT di Azure. I passaggi seguenti sono necessari solo se si vuole usare un'autorità emittente diversa.

L'approccio per creare l'autorità emittente è diverso a seconda dello scenario in uso. Le sezioni seguenti elencano esempi utili per iniziare.

L'autorità emittente certificazione è utile per lo sviluppo e il test. Deve essere configurato con un certificato e una chiave privata archiviata in un segreto Kubernetes.

Configurare il certificato radice come segreto Kubernetes

Se si dispone di un certificato CA esistente, creare un segreto Kubernetes con il certificato CA e i file PEM della chiave privata della CA. Eseguire il comando seguente per importare il certificato della CA come segreto Kubernetes e ignorare la sezione successiva.

kubectl create secret tls test-ca --cert tls.crt --key tls.key -n azure-iot-operations

Se non si dispone di un certificato CA, cert-manager può generare automaticamente un certificato DELLA CA. L'uso di cert-manager per generare un certificato DELLA CA è noto come bootstrap di un'autorità di certificazione con un certificato autofirmato.

  1. Iniziare creando ca.yaml:

    apiVersion: cert-manager.io/v1
    kind: Issuer
    metadata:
      name: selfsigned-ca-issuer
      namespace: azure-iot-operations
    spec:
      selfSigned: {}
    ---
    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
      name: selfsigned-ca-cert
      namespace: azure-iot-operations
    spec:
      isCA: true
      commonName: test-ca
      secretName: test-ca
      issuerRef:
        # Must match Issuer name above
        name: selfsigned-ca-issuer
        # Must match Issuer kind above
        kind: Issuer
        group: cert-manager.io
      # Override default private key config to use an EC key
      privateKey:
        rotationPolicy: Always
        algorithm: ECDSA
        size: 256
    
  2. Creare il certificato della CA autofirmato con il comando seguente:

    kubectl apply -f ca.yaml
    

Cert-manager crea un certificato DELLA CA usando le impostazioni predefinite. È possibile modificare le proprietà di questo certificato modificando la specifica del certificato. Per un elenco delle opzioni valide, vedere la documentazione di cert-manager.

Distribuire il certificato radice

L'esempio precedente archivia il certificato della CA in un segreto Kubernetes denominato test-ca. È possibile recuperare il certificato in formato PEM dal segreto e archiviarlo nel file ca.crt con il comando seguente:

kubectl get secret test-ca -n azure-iot-operations -o json | jq -r '.data["tls.crt"]' | base64 -d > ca.crt

Questo certificato deve essere distribuito e considerato attendibile da tutti i client. Ad esempio, usare il --cafile flag per un client Mosquitto.

Creare un'autorità emittente basata sul certificato della CA

Cert-manager richiede un'autorità emittente basata sul certificato della CA generato o importato nel passaggio precedente. Creare il file seguente come issuer-ca.yaml:

apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: my-issuer
  namespace: azure-iot-operations
spec:
  ca:
    # Must match secretName of generated or imported CA cert
    secretName: test-ca

Creare l'autorità emittente con il comando seguente:

kubectl apply -f issuer-ca.yaml

Il comando precedente crea un'autorità emittente per l'emissione di certificati server TLS. Prendere nota del nome e del tipo dell'autorità emittente. Nell'esempio il nome è my-issuer e il tipo è Issuer. Questi valori vengono impostati nella risorsa BrokerListener in un secondo momento.

Abilitare la gestione automatica dei certificati TLS per una porta

L'esempio seguente è una risorsa BrokerListener che abilita TLS sulla porta 8884 con gestione automatica dei certificati.

  1. Nella portale di Azure passare all'istanza di Operazioni IoT.

  2. In Componenti selezionare MqTT Broker.

  3. Selezionare o creare un listener. È possibile creare un solo listener per tipo di servizio. Se si dispone già di un listener dello stesso tipo di servizio, è possibile aggiungere altre porte al listener esistente.

  4. È possibile aggiungere impostazioni TLS al listener selezionando TLS su una porta esistente o aggiungendo una nuova porta.

    Screenshot che mostra l'uso del portale di Azure per creare un broker MQTT per un listener del servizio di bilanciamento del carico con certificati TLS automatici.

    Immetti le impostazioni seguenti:

    Impostazione Description
    Nome Nome della risorsa BrokerListener. Immetti aio-broker-loadbalancer-tls.
    Porta Numero di porta in cui BrokerListener è in ascolto delle connessioni MQTT. Immettere 8884.
    Autenticazione Informazioni di riferimento sulle risorse di autenticazione.
    Autorizzazione Riferimento alla risorsa di autorizzazione.
    TLS Seleziona il pulsante Aggiungi.
    Nome dell'autorità emittente Nome dell'emittente cert-manager. Obbligatorio.
    Tipo autorità di certificazione Tipo di autorità emittente del gestore di certificati. Obbligatorio.
    Gruppo autorità di certificazione Gruppo dell'autorità emittente di cert-manager. Obbligatorio.
    Algoritmo di chiave privata Algoritmo per la chiave privata.
    Criteri di rotazione delle chiavi private Criteri per la rotazione della chiave privata.
    Nomi DNS Nomi alternativi del soggetto DNS per il certificato.
    Indirizzi IP Indirizzi IP dei nomi alternativi del soggetto per il certificato.
    Nome segreto Segreto Kubernetes contenente un certificato client X.509.
    Durata La durata totale del certificato server TLS per impostazione predefinita è 90 giorni.
    Rinnovare prima Quando iniziare a rinnovare il certificato.
  5. Selezionare Applica per salvare le impostazioni TLS.

Dopo aver configurato la risorsa BrokerListener, il broker MQTT crea automaticamente un nuovo servizio con la porta specificata e TLS abilitata.

Facoltativo: configurare i parametri del certificato del server

Gli unici parametri obbligatori sono Issuer name e Issuer kind. Vengono scelte automaticamente tutte le altre proprietà dei certificati server TLS generati. Tuttavia, il broker MQTT consente di personalizzare determinate proprietà seguendo la stessa sintassi dei certificati cert-manager. Ad esempio, è possibile specificare l'algoritmo di chiave privata e i criteri di rotazione. Queste impostazioni si trovano in tls.certManagerCertificateSpec o nel riquadro di configurazione TLS nel portale di Azure.

Per un elenco completo di queste impostazioni, vedere Informazioni di riferimento sulle API Broker Listener CertManagerCertificateSpec.

Verificare la distribuzione

Usare kubectl per verificare che il servizio associato alla risorsa BrokerListener sia in esecuzione. Nell'esempio precedente il nome del servizio è aio-broker-loadbalancer-tls e lo spazio dei nomi è azure-iot-operations. Il comando seguente controlla lo stato del servizio:

$ kubectl get service my-new-tls-listener -n azure-iot-operations
NAME                           TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
aio-broker-loadbalancer-tls    LoadBalancer   10.X.X.X        172.X.X.X     8884:32457/TCP   33s

Connettersi al broker con TLS

Dopo aver configurato il certificato del server, TLS è abilitato. Per testare con Mosquitto:

mosquitto_pub -h $HOST -p 8884 -V mqttv5 -i "test" -t "test" -m "test" --cafile ca.crt

L'argomento --cafile abilita TLS nel client Mosquitto e specifica che il client deve considerare attendibili tutti i certificati server rilasciati dal file specifico. È necessario specificare un file contenente l'autorità emittente del certificato del server TLS configurato.

Sostituire $HOST con l'host appropriato:

  • Se ci si connette dall'interno dello stesso cluster, sostituire con il nome del servizio specificato (my-new-tls-listener ad esempio) o il servizio CLUSTER-IP.
  • Se ci si connette dall'esterno del cluster, usare il servizio EXTERNAL-IP.

Ricordarsi di specificare i metodi di autenticazione, se necessario.

CA radice e autorità di certificazione predefinite

Per iniziare, le operazioni IoT vengono distribuite con un certificato ca e un'autorità di certificazione predefinita "guida introduttiva" per i certificati server TLS. È possibile usare questa autorità emittente per lo sviluppo e il test. Per altre informazioni, vedere Autorità di certificazione radice e autorità di certificazione predefinite per i certificati server TLS.

Per la produzione, è necessario configurare un'autorità emittente di certificazione con un certificato da un'autorità di certificazione attendibile, come descritto nelle sezioni precedenti.

Configurare TLS con la gestione manuale dei certificati

Per configurare manualmente un broker MQTT per l'uso di un certificato TLS specifico, specificarlo in una risorsa BrokerListener con un riferimento a un segreto Kubernetes e distribuirlo usando kubectl. Questo articolo illustra un esempio che configura TLS con certificati autofirmato per il test.

Creare un'autorità di certificazione con l'interfaccia della riga di comando passaggio

Il passaggio è un gestore certificati che consente di iniziare rapidamente a funzionare quando si crea e si gestisce la propria CA privata.

  1. Installare l'interfaccia della riga di comando del passaggio e creare un certificato e una chiave ca radice.

    step certificate create --profile root-ca "Example Root CA" root_ca.crt root_ca.key
    
  2. Creare un certificato ca intermedio e una chiave firmati dalla CA radice.

    step certificate create --profile intermediate-ca "Example Intermediate CA" intermediate_ca.crt intermediate_ca.key \
    --ca root_ca.crt --ca-key root_ca.key
    

Creare un certificato del server

Usare l'interfaccia della riga di comando del passaggio per creare un certificato server dal certificato e dalla chiave ca intermedia.

step certificate create mqtts-endpoint mqtts-endpoint.crt mqtts-endpoint.key \
--profile leaf \
--not-after 8760h \
--san mqtts-endpoint \
--san localhost \
--ca intermediate_ca.crt --ca-key intermediate_ca.key \
--no-password --insecure

mqtts-endpoint In questo caso, e localhost sono i nomi alternativi del soggetto (SAN) per il front-end del broker MQTT rispettivamente in Kubernetes e nei client locali. Per connettersi tramite Internet, aggiungere un --san con un indirizzo IP esterno. I flag --no-password --insecure vengono usati per il test per ignorare le richieste di password e disabilitare la protezione della password per la chiave privata perché è archiviata in un segreto Kubernetes. Per l'ambiente di produzione, usare una password e archiviare la chiave privata in una posizione sicura, ad esempio Azure Key Vault.

Requisiti dell'algoritmo di chiave del certificato

Sono supportate sia le chiavi EC che RSA, ma tutti i certificati nella catena devono usare lo stesso algoritmo di chiave. Se si importano certificati CA personalizzati, assicurarsi che il certificato del server usi lo stesso algoritmo di chiave delle CA.

Importare la catena di certificati server come segreto Kubernetes

  1. Creare una catena di certificati server completa, in cui l'ordine dei certificati è importante. Il certificato del server è il primo nel file e l'intermedio è il secondo.

    cat  mqtts-endpoint.crt intermediate_ca.crt  > server_chain.crt
    
  2. Creare un segreto Kubernetes con la catena di certificati del server e la chiave del server usando kubectl.

    kubectl create secret tls server-cert-secret -n azure-iot-operations \
    --cert server_chain.crt \
    --key mqtts-endpoint.key
    

Abilitare la gestione manuale dei certificati TLS per una porta

L'esempio seguente mostra una risorsa BrokerListener che abilita TLS sulla porta 8884 con gestione manuale dei certificati.

  1. Nella portale di Azure passare all'istanza di Operazioni IoT.

  2. In Componenti selezionare MqTT Broker.

  3. Selezionare o creare un listener. È possibile creare un solo listener per tipo di servizio. Se si dispone già di un listener dello stesso tipo di servizio, è possibile aggiungere altre porte al listener esistente. Per seguire l'esempio, specificare il nome del servizio listener come mqtts-endpoint.

  4. È possibile aggiungere impostazioni TLS al listener selezionando TLS su una porta esistente o aggiungendo una nuova porta.

    Screenshot che mostra l'uso del portale di Azure per creare un broker MQTT per il listener del servizio di bilanciamento del carico con certificati TLS manuali.

    Immetti le impostazioni seguenti:

    Impostazione Descrizione
    Porta Numero di porta in cui BrokerListener è in ascolto delle connessioni MQTT. Obbligatorio.
    Autenticazione Informazioni di riferimento sulle risorse di autenticazione.
    Autorizzazione Riferimento alla risorsa di autorizzazione.
    TLS Seleziona il pulsante Aggiungi.
    Nome segreto Segreto Kubernetes contenente un certificato client X.509.
  5. Selezionare Applica per salvare le impostazioni TLS.

Connettersi al broker con TLS

Per testare la connessione TLS con il client Mosquitto, pubblicare un messaggio e passare il certificato CA radice nel parametro --cafile.

mosquitto_pub -d -h localhost -p 8885 -i "my-client" -t "test-topic" -m "Hello" --cafile root_ca.crt

Ricordarsi di specificare elementi come nome utente e password se l'autenticazione del broker MQTT è abilitata.

Client my-client sending CONNECT
Client my-client received CONNACK (0)
Client my-client sending PUBLISH (d0, q0, r0, m1, 'test-topic', ... (5 bytes))
Client my-client sending DISCONNECT

Suggerimento

Per usare localhost, la porta deve essere disponibile nel computer host. Un esempio è kubectl port-forward svc/mqtts-endpoint 8885:8885 -n azure-iot-operations. Con alcune distribuzioni Kubernetes come K3d, è possibile aggiungere una porta inoltrata con k3d cluster edit $CLUSTER_NAME --port-add 8885:8885@loadbalancer.

Per connettersi al broker, è necessario distribuire la radice di attendibilità, nota anche come bundle di attendibilità, a tutti i client. In questo caso, la radice dell'attendibilità è la CA radice autofirmato creata dall'interfaccia della riga di comando del passaggio. Per verificare la catena di certificati server, è necessaria la distribuzione della radice di attendibilità. Se i client MQTT sono carichi di lavoro nel cluster Kubernetes, è anche necessario creare un Oggetto ConfigMap con la CA radice e montarlo nel pod.

Usare l'indirizzo IP esterno per il certificato del server

Per connettersi con TLS tramite Internet, il certificato del server del broker MQTT deve avere il nome host esterno o l'indirizzo IP come SAN. Nell'ambiente di produzione, queste informazioni sono in genere un nome DNS o un indirizzo IP noto. Durante lo sviluppo/test, è possibile che non si conosca il nome host o l'indirizzo IP esterno assegnato prima della distribuzione. Per risolvere questo problema, distribuire prima il listener senza il certificato del server, creare prima il certificato del server e il segreto con l'indirizzo IP esterno e importare il segreto nel listener.

Se si tenta di distribuire il listener TLS di esempio manual-tls-listener ma il segreto Kubernetes di riferimento server-cert-secret non esiste, il servizio associato viene creato, ma i pod non vengono avviati. Il servizio viene creato perché l'operatore deve riservare l'indirizzo IP esterno per il listener.

kubectl get svc mqtts-endpoint -n azure-iot-operations
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
mqtts-endpoint         LoadBalancer   10.X.X.X        172.X.X.X     8885:30674/TCP      1m15s

Questo comportamento è previsto durante l'importazione del certificato del server. I log di Health Manager indicano che il broker MQTT è in attesa del certificato del server.

kubectl logs -l app=health-manager -n azure-iot-operations
...
<6>2023-11-06T21:36:13.634Z [INFO] [1] - Server certificate server-cert-secret not found. Awaiting creation of secret.

Nota

In genere, in un sistema distribuito, i log dei pod non sono deterministici e devono essere usati con cautela. Il modo giusto per visualizzare informazioni come questa è tramite gli eventi Kubernetes e lo stato delle risorse personalizzate, che si trova nel backlog. Considerare il passaggio precedente come soluzione alternativa temporanea.

Anche se i pod front-end non sono aggiornati, l'indirizzo IP esterno è già disponibile.

kubectl get svc mqtts-endpoint -n azure-iot-operations
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
mqtts-endpoint         LoadBalancer   10.X.X.X        172.X.X.X     8885:30674/TCP      1m15s

Da qui seguire gli stessi passaggi illustrati in precedenza per creare un certificato server con questo indirizzo IP esterno in --san e creare il segreto Kubernetes nello stesso modo. Dopo aver creato il segreto, viene importato automaticamente nel listener.