Share via


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.

  1. 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
    
  2. 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.

  1. 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
    
  2. 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änsten CLUSTER-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 namnet aio-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.