Konfigurera TLS med automatisk certifikathantering för att skydda MQTT-kommunikation i Förhandsversionen av Azure IoT MQ
Viktigt!
Förhandsversion av Azure IoT Operations – aktiverad av Azure Arc finns för närvarande i FÖRHANDSVERSION. Du bör inte använda den här förhandsgranskningsprogramvaran i produktionsmiljöer.
Juridiska villkor för Azure-funktioner i betaversion, förhandsversion eller som av någon annan anledning inte har gjorts allmänt tillgängliga ännu finns i kompletterande användningsvillkor för Microsoft Azure-förhandsversioner.
Du kan konfigurera TLS för att skydda MQTT-kommunikationen mellan MQTT-koordinatorn och klienten med hjälp av en BrokerListener-resurs. Du kan konfigurera TLS med manuell eller automatisk certifikathantering.
Verifiera installationen av cert-manager
Med automatisk certifikathantering använder du cert-manager för att hantera TLS-servercertifikatet. Som standard installeras cert-manager tillsammans med Förhandsversionen av Azure IoT Operations i azure-iot-operations
namnområdet. Kontrollera installationen innan du fortsätter.
Använd
kubectl
för att söka efter poddar som matchar cert-manager-appetiketterna.$ kubectl get pods --namespace azure-iot-operations -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
Om poddarna visas som redo och körs är cert-manager installerat och redo att användas.
Dricks
Kontrollera installationen ytterligare genom att kontrollera installationen av cert-manager-dokumentationen. Kom ihåg att använda azure-iot-operations
namnområdet.
Skapa en utfärdare för TLS-servercertifikatet
Utfärdarresursen cert-manager definierar hur certifikat utfärdas automatiskt. Cert-manager stöder flera typer av utfärdare internt. Den har också stöd för en extern utfärdartyp för att utöka funktioner utöver de utfärdare som stöds internt. Förhandsversionen av Azure IoT MQ kan användas med alla typer av utfärdare av cert-manager.
Viktigt!
Under den första distributionen installeras Azure IoT Operations med en standardutfärdare för TLS-servercertifikat. Du kan använda den här utfärdaren för utveckling och testning. Mer information finns i Standardrotcertifikatutfärdare och utfärdare med Azure IoT-åtgärder. Stegen nedan krävs bara om du vill använda en annan utfärdare.
Metoden för att skapa utfärdaren skiljer sig beroende på ditt scenario. I följande avsnitt visas exempel som hjälper dig att komma igång.
CA-utfärdaren är användbar för utveckling och testning. Den måste konfigureras med ett certifikat och en privat nyckel som lagras i en Kubernetes-hemlighet.
Konfigurera rotcertifikatet som en Kubernetes-hemlighet
Om du har ett befintligt CA-certifikat skapar du en Kubernetes-hemlighet med CA-certifikatet och PEM-filerna för privata nycklar. Kör följande kommando och du har konfigurerat rotcertifikatet som en Kubernetes-hemlighet och kan hoppa över nästa avsnitt.
kubectl create secret tls test-ca --cert tls.crt --key tls.key -n azure-iot-operations
Om du inte har något CA-certifikat kan cert-manager generera ett rotcertifikatutfärdarcertifikat åt dig. Att använda cert-manager för att generera ett rotcertifikatutfärdarcertifikat kallas bootstrapping för en CA-utfärdare med ett självsignerat certifikat.
Börja med att skapa
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
Skapa det självsignerade CA-certifikatet med följande kommando:
kubectl apply -f ca.yaml
Cert-manager skapar ett CA-certifikat med dess standardvärden. Egenskaperna för det här certifikatet kan ändras genom att ändra certifikatspecifikationen. En lista över giltiga alternativ finns i cert-manager-dokumentationen .
Distribuera rotcertifikatet
I föregående exempel lagras CA-certifikatet i en Kubernetes-hemlighet med namnet test-ca
. Certifikatet i PEM-format kan hämtas från hemligheten och lagras i en fil ca.crt
med följande kommando:
kubectl get secret test-ca -n azure-iot-operations -o json | jq -r '.data["tls.crt"]' | base64 -d > ca.crt
Certifikatet måste distribueras och vara betrott av alla klienter. Använd till exempel --cafile
flaggan för en mosquitto-klient.
Du kan använda Azure Key Vault för att hantera hemligheter för IoT MQ i stället för Kubernetes-hemligheter. Mer information finns i Hantera hemligheter med Hjälp av Azure Key Vault eller Kubernetes-hemligheter.
Skapa utfärdare baserat på CA-certifikat
Cert-manager behöver en utfärdare baserat på ca-certifikatet som genererades eller importerades i det tidigare steget. Skapa följande fil som 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
Skapa utfärdaren med följande kommando:
kubectl apply -f issuer-ca.yaml
Föregående kommando skapar en utfärdare för att utfärda TLS-servercertifikaten. Anteckna utfärdarens namn och typ. I exemplet anger du namn my-issuer
och typ Issuer
. Dessa värden anges i BrokerListener-resursen senare.
Aktivera TLS för en port
Ändra inställningen tls
i en BrokerListener-resurs för att ange en TLS-port och Utfärdare för klientdelerna. Följande är ett exempel på en BrokerListener-resurs som aktiverar TLS på port 8884 med automatisk certifikathantering.
apiVersion: mq.iotoperations.azure.com/v1beta1
kind: BrokerListener
metadata:
name: my-new-tls-listener
namespace: azure-iot-operations
spec:
brokerRef: broker
authenticationEnabled: false # If set to true, a BrokerAuthentication resource must be configured
authorizationEnabled: false
serviceType: loadBalancer # Optional; defaults to 'clusterIP'
serviceName: my-new-tls-listener # Avoid conflicts with default service name 'aio-mq-dmqtt-frontend'
port: 8884 # Avoid conflicts with default port 8883
tls:
automatic:
issuerRef:
name: my-issuer
kind: Issuer
När BrokerListener-resursen har konfigurerats skapar IoT MQ automatiskt en ny tjänst med den angivna porten och TLS aktiverat.
Valfritt: Konfigurera servercertifikatparametrar
De enda obligatoriska parametrarna är issuerRef.name
och issuerRef.kind
. Alla egenskaper för de genererade TLS-servercertifikaten väljs automatiskt. IoT MQ tillåter dock att vissa egenskaper anpassas genom att ange dem i BrokerListener-resursen under tls.automatic.issuerRef
. Följande är ett exempel på alla egenskaper som stöds:
# cert-manager issuer for TLS server certificate. Required.
issuerRef:
# Name of issuer. Required.
name: my-issuer
# 'Issuer' or 'ClusterIssuer'. Required.
kind: Issuer
# Issuer group. Optional; defaults to 'cert-manager.io'.
# External issuers may use other groups.
group: cert-manager.io
# Namespace of certificate. Optional; omit to use default namespace.
namespace: az
# Where to store the generated TLS server certificate. Any existing
# data at the provided secret will be overwritten.
# Optional; defaults to 'my-issuer-{port}'.
secret: my-issuer-8884
# Parameters for the server certificate's private key.
# Optional; defaults to rotationPolicy: Always, algorithm: ECDSA, size: 256.
privateKey:
rotationPolicy: Always
algorithm: ECDSA
size: 256
# Total lifetime of the TLS server certificate. Optional; defaults to '720h' (30 days).
duration: 720h
# When to begin renewing the certificate. Optional; defaults to '240h' (10 days).
renewBefore: 240h
# Any additional SANs to add to the server certificate. Omit if not required.
san:
dns:
- iotmq.example.com
ip:
- 192.168.1.1
Verifiera distributionen
Använd kubectl för att kontrollera att tjänsten som är associerad med BrokerListener-resursen körs. I exemplet ovan är my-new-tls-listener
tjänstnamnet och namnområdet är azure-iot-operations
. Följande kommando kontrollerar tjänststatusen:
$ kubectl get service my-new-tls-listener -n azure-iot-operations
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-new-tls-listener LoadBalancer 10.43.241.171 XXX.XX.X.X 8884:32457/TCP 33s
Anslut till asynkron meddelandekö med TLS
När servercertifikatet har konfigurerats är TLS aktiverat. Så här testar du med mosquitto:
mosquitto_pub -h $HOST -p 8884 -V mqttv5 -i "test" -t "test" -m "test" --cafile ca.crt
Argumentet --cafile
aktiverar TLS på mosquitto-klienten och anger att klienten ska lita på alla servercertifikat som utfärdats av den angivna filen. Du måste ange en fil som innehåller utfärdaren av det konfigurerade TLS-servercertifikatet.
Ersätt $HOST
med lämplig värd:
- Om du ansluter inifrån samma kluster ersätter du med det tjänstnamn som anges (
my-new-tls-listener
i exempel) eller tjänstenCLUSTER-IP
. - Om du ansluter utanför klustret, tjänsten
EXTERNAL-IP
.
Kom ihåg att ange autentiseringsmetoder om det behövs. Till exempel användarnamn och lösenord.
Standardrotcertifikatutfärdare och utfärdare med Förhandsversion av Azure IoT Operations
För att hjälpa dig att komma igång distribueras Azure IoT Operations med en standard"snabbstart" rotcertifikatutfärdare och utfärdare för TLS-servercertifikat. Du kan använda den här utfärdaren för utveckling och testning.
CA-certifikatet är självsignerat och inte betrott av några klienter utanför Azure IoT Operations. Certifikatutfärdarcertifikatets ämne är
CN = Azure IoT Operations Quickstart Root CA - Not for Production
och upphör att gälla om 30 dagar från installationstillfället.Rotcertifikatutfärdarcertifikatet lagras i en Kubernetes-hemlighet med namnet
aio-ca-key-pair-test-only
.Den offentliga delen av rotcertifikatutfärdarcertifikatet lagras i en ConfigMap med namnet
aio-ca-trust-bundle-test-only
. Du kan hämta CA-certifikatet från ConfigMap och inspektera det med kubectl och openssl.$ kubectl get configmap aio-ca-trust-bundle-test-only -n azure-iot-operations -o json | jq -r '.data["ca.crt"]' | openssl x509 -text -noout Certificate: Data: Version: 3 (0x2) Serial Number: 74:d8:b6:fe:63:5a:7d:24:bd:c2:c0:25:c2:d2:c7:94:66:af:36:89 Signature Algorithm: ecdsa-with-SHA256 Issuer: CN = Azure IoT Operations Quickstart Root CA - Not for Production Validity Not Before: Nov 2 00:34:31 2023 GMT Not After : Dec 2 00:34:31 2023 GMT Subject: CN = Azure IoT Operations Quickstart Root CA - Not for Production Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) pub: 04:51:43:93:2c:dd:6b:7e:10:18:a2:0f:ca:2e:7b: bb:ba:5c:78:81:7b:06:99:b5:a8:11:4f:bb:aa:0d: e0:06:4f:55:be:f9:5f:9e:fa:14:75:bb:c9:01:61: 0f:20:95:cd:9b:69:7c:70:98:f8:fa:a0:4c:90:da: 5b:1a:d7:e7:6b ASN1 OID: prime256v1 NIST CURVE: P-256 X509v3 extensions: X509v3 Basic Constraints: critical CA:TRUE X509v3 Key Usage: Certificate Sign X509v3 Subject Key Identifier: B6:DD:8A:42:77:05:38:7A:51:B4:8D:8E:3F:2A:D1:79:32:E9:43:B9 Signature Algorithm: ecdsa-with-SHA256 30:44:02:20:21:cd:61:d7:21:86:fd:f8:c3:6d:33:36:53:e3: a6:06:3c:a6:80:14:13:55:16:f1:19:a8:85:4b:e9:5d:61:eb: 02:20:3e:85:8a:16:d1:0f:0b:0d:5e:cd:2d:bc:39:4b:5e:57: 38:0b:ae:12:98:a9:8f:12:ea:95:45:71:bd:7c:de:9d
Som standard finns det redan en CA-utfärdare som har konfigurerats i
azure-iot-operations
namnområdet med namnetaio-ca-issuer
. Den används som den vanliga CA-utfärdaren för alla TLS-servercertifikat för IoT-åtgärder. IoT MQ använder en utfärdare som skapats från samma CA-certifikat för att utfärda TLS-servercertifikat för TLS-standardlyssnaren på port 8883. Du kan inspektera utfärdaren med följande kommando:$ kubectl get issuer aio-ca-issuer -n azure-iot-operations -o yaml apiVersion: cert-manager.io/v1 kind: Issuer metadata: annotations: meta.helm.sh/release-name: azure-iot-operations meta.helm.sh/release-namespace: azure-iot-operations creationTimestamp: "2023-11-01T23:10:24Z" generation: 1 labels: app.kubernetes.io/managed-by: Helm name: aio-ca-issuer namespace: azure-iot-operations resourceVersion: "2036" uid: c55974c0-e0c3-4d35-8c07-d5a0d3f79162 spec: ca: secretName: aio-ca-key-pair-test-only status: conditions: - lastTransitionTime: "2023-11-01T23:10:59Z" message: Signing CA verified observedGeneration: 1 reason: KeyPairVerified status: "True" type: Ready
För produktion måste du konfigurera en CA-utfärdare med ett certifikat från en betrodd certifikatutfärdare enligt beskrivningen i föregående avsnitt.