Sdílet prostřednictvím


Konfigurace protokolu TLS s automatickou správou certifikátů pro zabezpečení komunikace MQTT v Azure IoT MQ Preview

Důležité

Azure IoT Operations Preview – Služba Azure Arc je aktuálně ve verzi PREVIEW. Tento software ve verzi Preview byste neměli používat v produkčních prostředích.

Právní podmínky, které platí pro funkce Azure, které jsou ve verzi beta, verzi Preview nebo které zatím nejsou veřejně dostupné, najdete v Dodatečných podmínkách použití pro Microsoft Azure verze Preview.

Protokol TLS můžete nakonfigurovat pro zabezpečení komunikace MQTT mezi zprostředkovatelem MQTT a klientem pomocí prostředku BrokerListener. Protokol TLS můžete nakonfigurovat pomocí ruční nebo automatické správy certifikátů.

Ověření instalace nástroje cert-manager

Pomocí automatické správy certifikátů můžete ke správě certifikátu serveru TLS použít nástroj cert-manager. Ve výchozím nastavení je nástroj cert-manager nainstalovaný společně s Azure IoT Operations Preview v azure-iot-operations oboru názvů. Než budete pokračovat, ověřte instalaci.

  1. Slouží kubectl ke kontrole podů odpovídajících popiskům aplikací nástroje cert-manager.

    $ 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. Pokud se zobrazí pody, které jsou připravené a spuštěné, nainstaluje se cert-manager a je připravený k použití.

Tip

Pokud chcete instalaci dále ověřit, zkontrolujte instalaci v dokumentaci nástroje cert-manager. Nezapomeňte použít azure-iot-operations obor názvů.

Vytvoření vystavitele pro certifikát serveru TLS

Prostředek vystavitele cert-manager definuje, jak se certifikáty vydávají automaticky. Cert-manager podporuje několik typů vystavitelů nativně. Podporuje také externí typ vystavitele pro rozšíření funkčnosti nad rámec nativně podporovaných vystavitelů. Azure IoT MQ Preview je možné použít s jakýmkoli typem vystavitele cert-manageru.

Důležité

Během počátečního nasazení se operace Azure IoT nainstalují s výchozím vystavitelem pro certifikáty serveru TLS. Tento vystavitel můžete použít pro vývoj a testování. Další informace najdete v tématu Výchozí kořenová certifikační autorita a vystavitel s využitím operací Azure IoT. Následující postup se vyžaduje jenom v případě, že chcete použít jiného vystavitele.

Přístup k vytvoření vystavitele se liší v závislosti na vašem scénáři. Následující části obsahují příklady, které vám pomůžou začít.

Vystavitel certifikační autority je užitečný pro vývoj a testování. Musí být nakonfigurovaný s certifikátem a privátním klíčem uloženým v tajném kódu Kubernetes.

Nastavení kořenového certifikátu jako tajného kódu Kubernetes

Pokud máte existující certifikát certifikační autority, vytvořte tajný klíč Kubernetes s certifikátem certifikační autority a soubory PEM privátního klíče. Spusťte následující příkaz a nastavili jste kořenový certifikát jako tajný klíč Kubernetes a můžete přeskočit další část.

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

Pokud certifikát certifikační autority nemáte, může správce certifikátů vygenerovat kořenový certifikát certifikační autority za vás. Použití nástroje cert-manager k vygenerování kořenového certifikátu certifikační autority se označuje jako bootstrapping vystavitele certifikační autority s certifikátem podepsaným svým držitelem.

  1. Začněte vytvořením 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. Vytvořte certifikát certifikační autority podepsaný svým držitelem pomocí následujícího příkazu:

    kubectl apply -f ca.yaml
    

Cert-manager vytvoří certifikát certifikační autority pomocí jeho výchozích hodnot. Vlastnosti tohoto certifikátu lze změnit úpravou specifikace certifikátu. Seznam platných možností najdete v dokumentaci k nástroji cert-manager.

Distribuce kořenového certifikátu

Předchozí příklad ukládá certifikát certifikační autority do tajného kódu Kubernetes s názvem test-ca. Certifikát ve formátu PEM lze načíst z tajného kódu a uložit do souboru ca.crt pomocí následujícího příkazu:

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

Tento certifikát musí být distribuovaný a důvěryhodný všemi klienty. Například použijte --cafile příznak pro klienta mosquitto.

Azure Key Vault můžete použít ke správě tajných kódů pro IoT MQ místo tajných kódů Kubernetes. Další informace najdete v tématu Správa tajných kódů pomocí služby Azure Key Vault nebo tajných kódů Kubernetes.

Vytvoření vystavitele na základě certifikátu certifikační autority

Cert-manager potřebuje vystavitele na základě certifikátu certifikační autority vygenerovaného nebo importovaného v předchozím kroku. Vytvořte následující soubor takto 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

Vytvořte vystavitele pomocí následujícího příkazu:

kubectl apply -f issuer-ca.yaml

Předchozí příkaz vytvoří vystavitele pro vystavování certifikátů serveru TLS. Poznamenejte si název a druh vystavitele. V příkladu název my-issuer a druh Issuer. Tyto hodnoty se později nastaví v prostředku BrokerListener.

Povolení protokolu TLS pro port

tls Upravte nastavení v prostředku BrokerListener tak, aby určil port TLS a vystavitele pro front-endy. Následuje příklad prostředku BrokerListener, který umožňuje protokol TLS na portu 8884 s automatickou správou certifikátů.

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

Jakmile je prostředek BrokerListener nakonfigurovaný, IoT MQ automaticky vytvoří novou službu se zadaným portem a povoleným protokolem TLS.

Volitelné: Konfigurace parametrů certifikátu serveru

Jediné požadované parametry jsou issuerRef.name a issuerRef.kind. Automaticky se vyberou všechny vlastnosti vygenerovaných certifikátů serveru TLS. IoT MQ však umožňuje přizpůsobení určitých vlastností zadáním v prostředku BrokerListener v části tls.automatic.issuerRef. Následuje příklad všech podporovaných vlastností:

# 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

Ověření nasazení

Pomocí kubectl zkontrolujte, jestli je spuštěná služba přidružená k prostředku BrokerListener. V příkladu výše je my-new-tls-listener název služby a obor názvů je azure-iot-operations. Následující příkaz zkontroluje stav služby:

$ 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

Připojení do zprostředkovatele pomocí protokolu TLS

Po nakonfigurování certifikátu serveru je povolený protokol TLS. Testování pomocí moskvitu:

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

Argument --cafile povolí protokol TLS na klientovi mosquitto a určuje, že klient by měl důvěřovat všem certifikátům serveru vydaným daným souborem. Musíte zadat soubor, který obsahuje vystavitele nakonfigurovaného certifikátu serveru TLS.

Nahraďte $HOST příslušným hostitelem:

Nezapomeňte v případě potřeby zadat metody ověřování. Například uživatelské jméno a heslo.

Výchozí kořenová certifikační autorita a vystavitel s využitím Azure IoT Operations Preview

Abyste mohli začít, nasadí se operace Azure IoT s výchozí kořenovou certifikační autoritou pro rychlý start a vystavitelem pro certifikáty serveru TLS. Tento vystavitel můžete použít pro vývoj a testování.

  • Certifikát certifikační autority je podepsaný svým držitelem a není důvěryhodný pro žádné klienty mimo provoz Azure IoT. Předmět certifikátu certifikační autority je CN = Azure IoT Operations Quickstart Root CA - Not for Production a jeho platnost vyprší za 30 dnů od doby instalace.

  • Kořenový certifikát certifikační autority je uložený v tajném kódu Kubernetes.aio-ca-key-pair-test-only

  • Veřejná část kořenového certifikátu certifikační autority je uložena v objektu ConfigMap s názvem aio-ca-trust-bundle-test-only. Certifikát certifikační autority můžete načíst z objektu ConfigMap a zkontrolovat ho pomocí kubectl a 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
    
  • Ve výchozím nastavení je v oboru názvů aio-ca-issuernakonfigurovaný vystavitel certifikační autorityazure-iot-operations. Používá se jako společný vystavitel certifikační autority pro všechny certifikáty serveru TLS pro operace IoT. IoT MQ používá vystavitele vytvořeného ze stejného certifikátu certifikační autority k vydávání certifikátů serveru TLS pro výchozí naslouchací proces TLS na portu 8883. Vystavitele můžete zkontrolovat pomocí následujícího příkazu:

    $ 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
    

V produkčním prostředí musíte nakonfigurovat vystavitele certifikační autority s certifikátem od důvěryhodné certifikační autority, jak je popsáno v předchozích částech.