Sdílet prostřednictvím


Konfigurace protokolu TLS s ruční 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ů.

Pokud chcete ručně nakonfigurovat Azure IoT MQ Preview tak, aby používal konkrétní certifikát TLS, zadejte ho v prostředku BrokerListener s odkazem na tajný klíč Kubernetes. Pak ho nasaďte pomocí kubectl. Tento článek ukazuje příklad konfigurace protokolu TLS s certifikáty podepsanými svým držitelem pro testování.

Vytvoření certifikační autority pomocí rozhraní příkazového řádku kroku

Krok je správce certifikátů, který vás rychle zprovozní při vytváření a správě vlastní privátní certifikační autority.

  1. Nainstalujte rozhraní příkazového řádku kroku a vytvořte certifikát a klíč kořenové certifikační autority (CA).

    step certificate create --profile root-ca "Example Root CA" root_ca.crt root_ca.key
    
  2. Vytvořte certifikát a klíč zprostředkující certifikační autority podepsaný kořenovou certifikační autoritou.

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

Vytvoření certifikátu serveru

Pomocí rozhraní příkazového řádku krok vytvořte certifikát serveru z podepsaného zprostředkující certifikační autoritou.

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 Tady jsou localhost alternativní názvy subjektu (SAN) pro front-end zprostředkovatele Azure IoT MQ v Kubernetes a místních klientech. Pokud se chcete připojit přes internet, přidejte --san externí IP adresu. Příznaky --no-password --insecure se používají k testování, aby se přeskočí výzvy k zadání hesla a zakázala ochranu heslem pro privátní klíč, protože je uložená v tajném kódu Kubernetes. V produkčním prostředí použijte heslo a privátní klíč uložte do zabezpečeného umístění, jako je Azure Key Vault.

Požadavky na algoritmus klíče certifikátu

Podporují se klíče EC i RSA, ale všechny certifikáty v řetězu musí používat stejný algoritmus klíče. Pokud importujete vlastní certifikáty certifikační autority, ujistěte se, že certifikát serveru používá stejný algoritmus klíče jako certifikační autority.

Import řetězu certifikátů serveru jako tajného kódu Kubernetes

  1. Vytvořte úplný řetěz certifikátů serveru, ve kterém záleží na pořadí certifikátů: certifikát serveru je první certifikát v souboru, zprostředkující je druhý.

    cat  mqtts-endpoint.crt intermediate_ca.crt  > server_chain.pem
    
  2. Vytvořte tajný klíč Kubernetes s řetězem certifikátů serveru a klíčem serveru pomocí kubectl.

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

Povolení protokolu TLS pro naslouchací proces

tls Upravte nastavení v prostředku BrokerListener a určete ruční konfiguraci protokolu TLS odkazující na tajný klíč Kubernetes. Poznamenejte si název tajného klíče použitého pro certifikát serveru TLS (server-cert-secret v předchozím příkladu).

apiVersion: mq.iotoperations.azure.com/v1beta1
kind: BrokerListener
metadata:
  name: manual-tls-listener
  namespace: azure-iot-operations
spec:
  brokerRef: broker
  authenticationEnabled: false # If true, BrokerAuthentication must be configured
  authorizationEnabled: false
  serviceType: loadBalancer # Optional, defaults to clusterIP
  serviceName: mqtts-endpoint # Match the SAN in the server certificate
  port: 8885 # Avoid port conflict with default listener at 8883
  tls:
    manual:
      secretName: server-cert-secret

Jakmile se prostředek BrokerListener vytvoří, operátor automaticky vytvoří službu Kubernetes a nasadí naslouchací proces. Stav služby můžete zkontrolovat spuštěním kubectl get svcpříkazu .

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

Pokud chcete otestovat připojení TLS s klientem mosquitto, publikujte zprávu a předejte kořenový certifikát certifikační autority v parametru --cafile.

$ mosquitto_pub -d -h localhost -p 8885 -i "my-client" -t "test-topic" -m "Hello" --cafile root_ca.crt
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

Pokud chcete použít localhost, musí být port dostupný na hostitelském počítači. Například kubectl port-forward svc/mqtts-endpoint 8885:8885 -n azure-iot-operations. S některými distribucemi Kubernetes, jako je K3d, můžete přidat přesměrovaný port s k3d cluster edit $CLUSTER_NAME --port-add 8885:8885@loadbalancer.

Poznámka:

Pokud se chcete připojit k zprostředkovateli, musíte klientům distribuovat kořen důvěryhodnosti, označovaný také jako sada důvěryhodnosti. V tomto případě je kořenem důvěryhodnosti kořenová certifikační autorita vytvořená kořenovou certifikační autoritou podepsanou svým držitelem. Aby klient ověřil řetěz certifikátů serveru, vyžaduje se distribuce kořenového adresáře důvěryhodnosti. Pokud jsou klienti MQTT úlohami v clusteru Kubernetes, musíte také vytvořit objekt ConfigMap s kořenovou certifikační autoritou a připojit ho do podu.

Nezapomeňte zadat uživatelské jméno, heslo atd. pokud je povolené ověřování MQ.

Použití externí IP adresy pro certifikát serveru

Pokud se chcete připojit pomocí protokolu TLS přes internet, musí mít certifikát serveru Azure IoT MQ svůj externí název hostitele jako síť SAN. V produkčním prostředí se obvykle jedná o název DNS nebo dobře známou IP adresu. Během vývoje/testování ale možná nevíte, jaký název hostitele nebo externí IP adresa je přiřazená před nasazením. Pokud chcete tento problém vyřešit, nejprve nasaďte naslouchací proces bez certifikátu serveru, pak vytvořte certifikát serveru a tajný klíč s externí IP adresou a nakonec naimportujte tajný kód do naslouchacího procesu.

Pokud se pokusíte nasadit ukázkový naslouchací proces manual-tls-listener TLS, ale odkazovaný tajný klíč server-cert-secret Kubernetes neexistuje, vytvoří se přidružená služba, ale pody se nespustí. Služba se vytvoří, protože operátor musí rezervovat externí IP adresu pro naslouchací proces.

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

Toto chování se ale očekává a při importu certifikátu serveru je v pořádku ho nechat. Protokoly správce stavu zmíní, že Azure IoT MQ čeká na certifikát serveru.

$ 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.

Poznámka:

Obecně platí, že v distribuovaném systému nejsou protokoly podů deterministické a měly by se používat s opatrností. Správný způsob, jak se dostat k informacím, je prostřednictvím událostí Kubernetes a stavu vlastních prostředků, které jsou v backlogu. Představte si předchozí krok jako dočasné alternativní řešení.

I když front-endové pody nejsou vzhůru, externí IP adresa je už dostupná.

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

Odsud postupujte stejným postupem jako předtím a vytvořte certifikát serveru s touto externí IP adresou --san a stejným způsobem vytvořte tajný klíč Kubernetes. Po vytvoření tajného kódu se automaticky naimportuje do naslouchacího procesu.