Communicatie tussen MQTT-brokers beveiligen met BrokerListener
Belangrijk
Deze pagina bevat instructies voor het beheren van Azure IoT Operations-onderdelen met behulp van Kubernetes-implementatiemanifesten, die in preview zijn. Deze functie is voorzien van verschillende beperkingen en mag niet worden gebruikt voor productieworkloads.
Raadpleeg de Aanvullende voorwaarden voor Microsoft Azure-previews voor juridische voorwaarden die van toepassing zijn op Azure-functies die in bèta of preview zijn of die anders nog niet algemeen beschikbaar zijn.
Een BrokerListener-resource komt overeen met een netwerkeindpunt dat de broker beschikbaar maakt voor clients via het netwerk. U kunt een of meer BrokerListener-resources voor elke broker hebben, met meerdere poorten en ander toegangsbeheer op elke broker.
Elke BrokerListener-poort kan zijn eigen verificatie- en autorisatieregels hebben die bepalen wie verbinding kan maken op die listenerpoort en welke acties ze op de broker kunnen uitvoeren. U kunt BrokerAuthentication- en BrokerAuthorization-resources gebruiken om het toegangsbeheerbeleid voor elke listenerpoort op te geven. Dankzij deze flexibiliteit kunt u de machtigingen en rollen voor uw MQTT-clients verfijnen op basis van hun behoeften en use cases.
Tip
De standaardImplementatie van MQTT Broker is een cluster-IP-service waarvoor clients verbinding moeten maken met het TLS-protocol (Transport Layer Security) en die moeten worden geverifieerd met serviceaccounttokens. Clients die verbinding maken van buiten het cluster , hebben extra configuratie nodig voordat ze verbinding kunnen maken.
Broker-listeners hebben de volgende kenmerken:
- Naam: naam van de listener. Deze naam is ook de Kubernetes-servicenaam , tenzij deze wordt overschreven.
- Servicetype: U kunt maximaal drie listeners hebben, één per servicetype. De standaardlistener is servicetype
ClusterIp
. - Poorten: elke listener ondersteunt meerdere poorten. Poorten kunnen niet conflicteren over verschillende listeners.
- Verificatie- en autorisatieverwijzingen: BrokerAuthentication en BrokerAuthorization worden per poort geconfigureerd.
- TLS: Handmatige of automatische TLS-configuratie wordt per poort toegepast.
- Protocol: MQTT via WebSockets kan per poort worden ingeschakeld.
Zie de naslaginformatie over de Broker Listener-API voor een lijst met alle beschikbare instellingen.
Default BrokerListener
Wanneer u Azure IoT Operations implementeert, maakt de implementatie een BrokerListener-resource met de naam standaard. Deze listener wordt gebruikt voor versleutelde interne communicatie tussen IoT Operations-onderdelen. De standaardlistener maakt deel uit van de standaardbroker.
- Er wordt een ClusterIp-service beschikbaar gesteld op poort 18883.
- Clients moeten gebruikmaken van kubernetes-serviceaccountverificatie.
- Het heeft een automatisch beheerd TLS-certificaat.
- Er worden geen beleidsregels voor clientautorisatie geconfigureerd.
Let op
Om te voorkomen dat interne IoT Operations-communicatie wordt onderbroken, houdt u de standaardlistener ongewijzigd en toegewezen voor intern gebruik. Maak voor externe communicatie een nieuwe listener. Als u de ClusterIp
service wilt gebruiken, voegt u meer poorten toe aan de standaardlistener zonder de bestaande instellingen te wijzigen.
Volg deze stappen om de standaardlistener weer te geven of te bewerken.
Ga in Azure Portal naar uw IoT Operations-exemplaar.
Selecteer onder Onderdelen de optie MQTT Broker.
Selecteer in de lijst met brokerlisteners de standaardlistener .
Controleer de listenerinstellingen, maar vermijd het wijzigen van een van de bestaande instellingen. Maak in plaats daarvan een nieuwe poort en configureer deze indien nodig.
Voorkomen dat u de standaard broker-listener wijzigt
Om te voorkomen dat interne IoT Operations-communicatie wordt onderbroken, houdt u de standaardlistener ongewijzigd en toegewezen voor intern gebruik. Maak voor externe communicatie een nieuwe listener.
Aangezien de standaard brokerlistener gebruikmaakt van het servicetype ClusterIp
en u slechts één listener per servicetype kunt hebben, voegt u meer poorten toe aan de standaardlistener zonder dat u een van de bestaande instellingen hoeft te wijzigen als u de ClusterIp
service wilt gebruiken.
Nieuwe broker-listeners maken
Als u een nieuwe listener wilt maken, geeft u de volgende instellingen op:
- Naam: naam van de listener. Deze naam is ook de Kubernetes-servicenaam , tenzij deze wordt overschreven.
- Servicetype: Type van de Kubernetes-service. Zie Servicetype.
- Poorten: lijst met poorten waarop moet worden geluisterd. Zie poorten.
- Servicenaam (optioneel): Overschrijf de Kubernetes-servicenaam. Zie de servicenaam.
Voorbeeld: Een nieuwe listener maken met twee poorten
In dit voorbeeld ziet u hoe u een nieuwe listener maakt met het LoadBalancer
servicetype. De BrokerListener-resource definieert twee poorten die MQTT-verbindingen van clients accepteren.
- De eerste poort luistert op poort 1883 zonder TLS en verificatie. Deze installatie is alleen geschikt voor testen. Gebruik deze configuratie niet in productie.
- De tweede poort luistert op poort 8883 met TLS en verificatie ingeschakeld. Alleen geverifieerde clients met een Kubernetes-serviceaccounttoken kunnen verbinding maken. TLS is ingesteld op de automatische modus, met behulp van certificaatbeheer voor het beheren van het servercertificaat van de standaardverlener. Deze installatie is dichter bij een productieconfiguratie.
Ga in Azure Portal naar uw IoT Operations-exemplaar.
Selecteer onder Onderdelen de optie MQTT Broker.
Selecteer MQTT Broker-listener voor LoadBalancer>Create.
Geef de volgende instellingen op:
Instelling Omschrijving Naam Naam van de BrokerListener-resource. Servicenaam Naam van de Kubernetes-service. Laat leeg om de naam van de listener als servicenaam te gebruiken. Servicetype LoadBalancer is al geselecteerd. Voer onder Poorten de volgende instellingen in voor de eerste poort:
Instelling Beschrijving Poort Voer 1883 in. Verificatie Kies Geen. Autorisatie Kies Geen. Protocol Kies MQTT. TLS Voeg niet toe. Selecteer Poortvermelding toevoegen om een tweede poort toe te voegen en voer de volgende instellingen in:
Instelling Beschrijving Poort Voer 8883 in. Verificatie Kies de standaardwaarde. Autorisatie Kies Geen. Protocol Kies MQTT. TLS Selecteer Toevoegen. Voer in het deelvenster TLS-configuratie de volgende instellingen in:
Instelling Beschrijving TLS-modus Kies Automatisch. Naam van verlener Voer azure-iot-operations-aio-certificate-issuer
in.Soort verlener Kies ClusterIssuer. Laat andere instellingen standaard staan en selecteer Toepassen.
Selecteer Listener maken.
Servicetype
Elke BrokerListener-resource wordt toegewezen aan een Kubernetes-service. Het servicetype bepaalt hoe de broker beschikbaar wordt gesteld aan het netwerk. De ondersteunde servicetypen zijn:
- ClusterIp: geeft de broker weer op een intern IP-adres van een cluster. Clients kunnen vanuit het cluster verbinding maken met de broker. Dit standaardservicetype is voor de standaardlistener.
- NodePort: stelt de broker beschikbaar op het IP-adres van elk knooppunt op een statische poort. Clients kunnen verbinding maken met de broker van buiten het cluster. Dit servicetype is handig voor ontwikkeling en testen.
- LoadBalancer: maakt de broker extern beschikbaar. De service krijgt een extern IP-adres toegewezen dat clients kunnen gebruiken om verbinding te maken met de broker. Dit servicetype is het meest gebruikelijk voor productie-implementaties.
Slechts één listener per servicetype
Er is slechts één listener per servicetype toegestaan. Als u meer connectiviteit van hetzelfde servicetype nodig hebt, voegt u meer poorten toe aan de bestaande listener van dat servicetype.
Servicenaam
De servicenaam is de naam van de Kubernetes-service die is gekoppeld aan de broker. Als dit niet is opgegeven, wordt de naam van de brokerlist gebruikt als de servicenaam. De servicenaam moet uniek zijn binnen de naamruimte.
Tip
Om beheeroverhead te voorkomen, raden we u aan de servicenaam leeg te laten. De naam van de listener is uniek en u kunt deze gebruiken om de service te identificeren. Gebruik de servicenaam alleen als onderdrukking wanneer u de service niet na de listener kunt noemen.
Poorten
Elke listener kan meerdere poorten hebben en elke poort kan eigen instellingen hebben voor verificatie, autorisatie, protocol en TLS.
Als u uw eigen verificatie- of autorisatie-instelling voor een poort wilt gebruiken, moet u de bijbehorende resources maken voordat u deze met een listener gebruikt. Zie MQTT-brokerverificatie configureren en MQTT-brokerautorisatie configureren voor meer informatie.
Als u TLS wilt gebruiken, raadpleegt u TLS configureren met automatisch certificaatbeheer of TLS configureren met handmatig certificaatbeheersecties .
Dezelfde poort gebruiken voor listeners
Het gebruik van hetzelfde poortnummer voor verschillende listeners wordt niet ondersteund. Elk poortnummer moet uniek zijn binnen de IoT Operations MQTT-broker.
Als u bijvoorbeeld een listener hebt met poort 1883, kunt u geen andere listener maken met poort 1883. Op dezelfde manier gebruikt de standaardlistener poort 18883, zodat u geen andere listener kunt maken met poort 18883.
Ondersteuning voor WebSockets
IoT Operations MQTT Broker ondersteunt MQTT via WebSockets. Als u WebSockets wilt inschakelen, stelt u het protocol WebSockets
in op de poort.
TLS configureren met automatisch certificaatbeheer
Als u TLS wilt inschakelen met automatisch certificaatbeheer, geeft u de TLS-instellingen op een listenerpoort op.
De installatie van certificaatbeheer controleren
Met automatisch certificaatbeheer gebruikt u certificaatbeheer om het TLS-servercertificaat te beheren. Certificaatbeheer wordt standaard geïnstalleerd naast IoT Operations in de cert-manager
naamruimte. Controleer de installatie voordat u doorgaat.
Gebruik kubectl om te controleren op de pods die overeenkomen met de app-labels voor certificaatbeheer.
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
Als u ziet dat de pods gereed en actief zijn, is certificaatbeheer geïnstalleerd en klaar voor gebruik.
Tip
Als u de installatie verder wilt controleren, controleert u de documentatie van cert-manager om de installatie te controleren. Vergeet niet om de cert-manager
naamruimte te gebruiken.
Een verlener maken voor het TLS-servercertificaat
De cert-manager issuer-resource definieert hoe certificaten automatisch worden uitgegeven. Cert-manager ondersteunt verschillende typen verleners. Het biedt ook ondersteuning voor een extern issuer
type voor het uitbreiden van functionaliteit buiten de systeemeigen ondersteunde verleners. U kunt een MQTT-broker gebruiken met elk type certificaatbeheerderverlener.
Belangrijk
Tijdens de eerste implementatie wordt IoT Operations geïnstalleerd met een standaardverlener voor TLS-servercertificaten. U kunt deze verlener gebruiken voor ontwikkeling en testen. Zie De standaardcertificeringsinstantie (CA) en verlener met Azure IoT-bewerkingen voor meer informatie. De volgende stappen zijn alleen vereist als u een andere verlener wilt gebruiken.
De benadering voor het maken van de verlener verschilt, afhankelijk van uw scenario. De volgende secties bevatten voorbeelden om u te helpen aan de slag te gaan.
De CA-verlener is handig voor ontwikkeling en testen. Deze moet worden geconfigureerd met een certificaat en een persoonlijke sleutel die is opgeslagen in een Kubernetes-geheim.
Het basiscertificaat instellen als een Kubernetes-geheim
Als u een bestaand CA-certificaat hebt, maakt u een Kubernetes-geheim met het CA-certificaat en PEM-bestanden met persoonlijke CA-sleutels. Voer de volgende opdracht uit om het CA-certificaat te importeren als een Kubernetes-geheim en sla de volgende sectie over.
kubectl create secret tls test-ca --cert tls.crt --key tls.key -n azure-iot-operations
Als u geen CA-certificaat hebt, kan certificaatbeheer een CA-certificaat voor u genereren. Het gebruik van certificaatbeheer voor het genereren van een CA-certificaat wordt bootstrapping genoemd van een CA-verlener met een zelfondertekend certificaat.
Begin met het maken van
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
Maak het zelfondertekende CA-certificaat met de volgende opdracht:
kubectl apply -f ca.yaml
Certificaatbeheer maakt een CA-certificaat aan de hand van de standaardinstellingen. U kunt de eigenschappen van dit certificaat wijzigen door de certificaatspecificatie te wijzigen. Zie de documentatie voor certificaatbeheer voor een lijst met geldige opties.
Het basiscertificaat distribueren
In het vorige voorbeeld wordt het CA-certificaat opgeslagen in een Kubernetes-geheim met de naam test-ca
. U kunt het certificaat in PEM-indeling ophalen uit het geheim en opslaan in het bestand ca.crt
met de volgende opdracht:
kubectl get secret test-ca -n azure-iot-operations -o json | jq -r '.data["tls.crt"]' | base64 -d > ca.crt
Dit certificaat moet worden gedistribueerd en vertrouwd door alle clients. Gebruik bijvoorbeeld de --cafile
vlag voor een Mosquitto-client.
Verlener maken op basis van CA-certificaat
Certificaatbeheer heeft een verlener nodig op basis van het CA-certificaat dat in de vorige stap is gegenereerd of geïmporteerd. Maak het volgende bestand als 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
Maak de verlener met de volgende opdracht:
kubectl apply -f issuer-ca.yaml
Met de voorgaande opdracht maakt u een verlener voor het uitgeven van TLS-servercertificaten. Noteer de naam en het type van de uitgever. In het voorbeeld is my-issuer
de naam en het soort.Issuer
Deze waarden worden later ingesteld in de BrokerListener-resource.
Automatisch TLS-certificaatbeheer voor een poort inschakelen
Het volgende voorbeeld is een BrokerListener-resource die TLS inschakelt op poort 8884 met automatisch certificaatbeheer.
Ga in Azure Portal naar uw IoT Operations-exemplaar.
Selecteer onder Onderdelen de optie MQTT Broker.
Selecteer of maak een listener. U kunt slechts één listener per servicetype maken. Als u al een listener van hetzelfde servicetype hebt, kunt u meer poorten toevoegen aan de bestaande listener.
U kunt TLS-instellingen toevoegen aan de listener door TLS te selecteren op een bestaande poort of door een nieuwe poort toe te voegen.
Geef de volgende instellingen op:
Instelling Omschrijving Naam Naam van de BrokerListener-resource. Voer aio-broker-loadbalancer-tls
in.Poort Poortnummer waarop de BrokerListener luistert naar MQTT-verbindingen. Voer 8884 in. Verificatie De referentie voor verificatieresources. Autorisatie De naslaginformatie over autorisatieresources. TLS Selecteer de knop Toevoegen. Naam van verlener Naam van de cert-manager-uitgever. Vereist. Soort verlener Soort certificaatbeheerder. Vereist. Groep Verleners Groep van de certificaatbeheerderverlener. Vereist. Algoritme voor persoonlijke sleutel Algoritme voor de persoonlijke sleutel. Beleid voor rotatie van persoonlijke sleutels Beleid voor het roteren van de persoonlijke sleutel. DNS-namen Alternatieve dns-onderwerpnamen voor het certificaat. IP-adressen IP-adressen van de alternatieve onderwerpnamen voor het certificaat. Geheime naam Kubernetes-geheim met een X.509-clientcertificaat. Duur De totale levensduur van het TLS-servercertificaat is standaard ingesteld op 90 dagen. Verlengen voor Wanneer moet het certificaat worden vernieuwd. Selecteer Toepassen om de TLS-instellingen op te slaan.
Nadat de BrokerListener-resource is geconfigureerd, maakt de MQTT-broker automatisch een nieuwe service met de opgegeven poort en TLS ingeschakeld.
Optioneel: servercertificaatparameters configureren
De enige vereiste parameters zijn Issuer
naam en Issuer
soort. Alle andere eigenschappen van de gegenereerde TLS-servercertificaten worden automatisch gekozen. Met de MQTT-broker kunnen bepaalde eigenschappen echter worden aangepast volgens dezelfde syntaxis als certificaten van certificaatbeheer. U kunt bijvoorbeeld het algoritme en het rotatiebeleid voor persoonlijke sleutels opgeven. Deze instellingen bevinden zich onder tls.certManagerCertificateSpec
of in het deelvenster TLS-configuratie in Azure Portal.
Zie Broker Listener CertManagerCertIficateSpec API-naslaginformatie voor een volledige lijst met deze instellingen.
Implementatie verifiëren
Gebruik kubectl om te controleren of de service die is gekoppeld aan de BrokerListener-resource wordt uitgevoerd. In het voorgaande voorbeeld is aio-broker-loadbalancer-tls
de servicenaam en de naamruimte .azure-iot-operations
Met de volgende opdracht wordt de servicestatus gecontroleerd:
$ 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
Verbinding maken met de broker met TLS
Nadat het servercertificaat is geconfigureerd, is TLS ingeschakeld. Testen met Mosquitto:
mosquitto_pub -h $HOST -p 8884 -V mqttv5 -i "test" -t "test" -m "test" --cafile ca.crt
Het --cafile
argument schakelt TLS in op de Mosquitto-client en geeft aan dat de client alle servercertificaten moet vertrouwen die zijn uitgegeven door het specifieke bestand. U moet een bestand opgeven dat de uitgever van het geconfigureerde TLS-servercertificaat bevat.
Vervang $HOST
door de juiste host:
- Als u verbinding maakt vanuit hetzelfde cluster, vervangt u de opgegeven servicenaam (
my-new-tls-listener
in voorbeeld) of de serviceCLUSTER-IP
. - Als u verbinding maakt van buiten het cluster, gebruikt u de service
EXTERNAL-IP
.
Vergeet niet om indien nodig verificatiemethoden op te geven.
Standaardhoofd-CA en verlener
Om u te helpen aan de slag te gaan, worden IoT-bewerkingen geïmplementeerd met een standaard 'quickstart'-CA-certificaat en verlener voor TLS-servercertificaten. U kunt deze verlener gebruiken voor ontwikkeling en testen. Zie De standaard-basis-CA en verlener voor TLS-servercertificaten voor meer informatie.
Voor productie moet u een CA-verlener configureren met een certificaat van een vertrouwde CERTIFICERINGsinstantie, zoals beschreven in de vorige secties.
TLS configureren met handmatig certificaatbeheer
Als u een MQTT-broker handmatig wilt configureren voor het gebruik van een specifiek TLS-certificaat, geeft u dit op in een BrokerListener-resource met een verwijzing naar een Kubernetes-geheim en implementeert u het met kubectl. In dit artikel ziet u een voorbeeld waarin TLS wordt geconfigureerd met zelfondertekende certificaten voor testen.
Een certificeringsinstantie maken met stap CLI
Stap is een certificaatbeheerder waarmee u snel aan de slag kunt wanneer u uw eigen privé-CA maakt en beheert.
Installeer stap CLI en maak een basis-CA-certificaat en -sleutel.
step certificate create --profile root-ca "Example Root CA" root_ca.crt root_ca.key
Maak een tussenliggend CA-certificaat en een sleutel die is ondertekend door de basis-CA.
step certificate create --profile intermediate-ca "Example Intermediate CA" intermediate_ca.crt intermediate_ca.key \ --ca root_ca.crt --ca-key root_ca.key
Een servercertificaat maken
Gebruik stap CLI om een servercertificaat te maken op basis van het tussenliggende CA-certificaat en de sleutel.
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
Hier en localhost
zijn de alternatieve onderwerpnamen (SAN's) voor respectievelijk de front-end van de MQTT-broker in Kubernetes en lokale clients. Als u verbinding wilt maken via internet, voegt u een --san
met een extern IP-adres toe. De --no-password --insecure
vlaggen worden gebruikt voor het testen om wachtwoordprompts over te slaan en wachtwoordbeveiliging voor de persoonlijke sleutel uit te schakelen, omdat deze is opgeslagen in een Kubernetes-geheim. Voor productie gebruikt u een wachtwoord en slaat u de persoonlijke sleutel op een veilige locatie op, zoals Azure Key Vault.
Vereisten voor certificaatsleutelalgoritmen
Zowel EC- als RSA-sleutels worden ondersteund, maar alle certificaten in de keten moeten hetzelfde sleutelalgoritmen gebruiken. Als u uw eigen CA-certificaten importeert, moet u ervoor zorgen dat het servercertificaat hetzelfde sleutelalgoritme gebruikt als de CA's.
Servercertificaatketen importeren als een Kubernetes-geheim
Maak een volledige servercertificaatketen, waarbij de volgorde van de certificaten van belang is. Het servercertificaat is de eerste in het bestand en het tussenliggende certificaat is de tweede.
cat mqtts-endpoint.crt intermediate_ca.crt > server_chain.crt
Maak een Kubernetes-geheim met de servercertificaatketen en serversleutel met behulp van kubectl.
kubectl create secret tls server-cert-secret -n azure-iot-operations \ --cert server_chain.crt \ --key mqtts-endpoint.key
TLS-handmatig certificaatbeheer voor een poort inschakelen
In het volgende voorbeeld ziet u een BrokerListener-resource die TLS inschakelt op poort 8884 met handmatig certificaatbeheer.
Ga in Azure Portal naar uw IoT Operations-exemplaar.
Selecteer onder Onderdelen de optie MQTT Broker.
Selecteer of maak een listener. U kunt slechts één listener per servicetype maken. Als u al een listener van hetzelfde servicetype hebt, kunt u meer poorten toevoegen aan de bestaande listener. Als u het voorbeeld wilt volgen, geeft u de naam van de listenerservice op als
mqtts-endpoint
.U kunt TLS-instellingen toevoegen aan de listener door TLS te selecteren op een bestaande poort of door een nieuwe poort toe te voegen.
Geef de volgende instellingen op:
Instelling Beschrijving Poort Poortnummer waarop de BrokerListener luistert naar MQTT-verbindingen. Vereist. Verificatie De referentie voor verificatieresources. Autorisatie De naslaginformatie over autorisatieresources. TLS Selecteer de knop Toevoegen. Geheime naam Kubernetes-geheim met een X.509-clientcertificaat. Selecteer Toepassen om de TLS-instellingen op te slaan.
Verbinding maken met de broker met TLS
Als u de TLS-verbinding met de Mosquitto-client wilt testen, publiceert u een bericht en geeft u het basis-CA-certificaat door in de parameter --cafile
.
mosquitto_pub -d -h localhost -p 8885 -i "my-client" -t "test-topic" -m "Hello" --cafile root_ca.crt
Vergeet niet om items zoals gebruikersnaam en wachtwoord op te geven als MQTT-brokerverificatie is ingeschakeld.
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
Tip
Als u localhost wilt gebruiken, moet de poort beschikbaar zijn op de hostcomputer. Een voorbeeld is kubectl port-forward svc/mqtts-endpoint 8885:8885 -n azure-iot-operations
. Met sommige Kubernetes-distributies zoals K3d kunt u een doorgestuurde poort toevoegen met k3d cluster edit $CLUSTER_NAME --port-add 8885:8885@loadbalancer
.
Als u verbinding wilt maken met de broker, moet u de hoofdmap van de vertrouwensrelatie, ook wel vertrouwensbundel genoemd, distribueren naar alle clients. In dit geval is de basis van vertrouwen de zelfondertekende basis-CA die door de stap-CLI is gemaakt. Distributie van de basis van vertrouwen is vereist voor de client om de servercertificaatketen te verifiëren. Als uw MQTT-clients workloads zijn in het Kubernetes-cluster, moet u ook een ConfigMap maken met de basis-CA en deze koppelen in uw pod.
Extern IP-adres gebruiken voor het servercertificaat
Als u via internet verbinding wilt maken met TLS, moet het servercertificaat van de MQTT-broker zijn externe hostnaam of IP-adres hebben als san. In productie is deze informatie meestal een DNS-naam of een bekend IP-adres. Tijdens het ontwikkelen/testen weet u mogelijk niet welke hostnaam of extern IP-adres is toegewezen vóór de implementatie. Als u dit probleem wilt oplossen, implementeert u eerst de listener zonder het servercertificaat, maakt u het servercertificaat en geheim met het externe IP-adres en importeert u het geheim in de listener.
Als u de voorbeeld-TLS-listener manual-tls-listener
probeert te implementeren, maar het kubernetes-geheim server-cert-secret
waarnaar wordt verwezen niet bestaat, wordt de bijbehorende service gemaakt, maar de pods worden niet gestart. De service wordt gemaakt omdat de operator het externe IP-adres voor de listener moet reserveren.
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
Dit gedrag wordt verwacht tijdens het importeren van het servercertificaat. In de health manager-logboeken wordt vermeld dat de MQTT-broker wacht op het servercertificaat.
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.
Notitie
Over het algemeen zijn podslogboeken in een gedistribueerd systeem niet deterministisch en moeten ze voorzichtig worden gebruikt. De juiste manier om informatie zoals deze weer te geven, is via Kubernetes-gebeurtenissen en aangepaste resourcestatus, die zich in de achterstand bevindt. Overweeg de vorige stap als tijdelijke tijdelijke oplossing.
Hoewel de front-endpods niet zijn ingeschakeld, is het externe IP-adres al beschikbaar.
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
Volg hier dezelfde stappen als voorheen om een servercertificaat te maken met dit externe IP-adres in --san
en maak het Kubernetes-geheim op dezelfde manier. Nadat het geheim is gemaakt, wordt het automatisch geïmporteerd in de listener.