Konfigurowanie protokołu TLS z automatycznym zarządzaniem certyfikatami w celu zabezpieczenia komunikacji MQTT w wersji zapoznawczej usługi Azure IoT MQ
Ważne
Usługa Azure IoT Operations Preview — włączona przez usługę Azure Arc jest obecnie dostępna w wersji zapoznawczej. Nie należy używać tego oprogramowania w wersji zapoznawczej w środowiskach produkcyjnych.
Zobacz Dodatkowe warunki użytkowania wersji zapoznawczych platformy Microsoft Azure, aby zapoznać się z postanowieniami prawnymi dotyczącymi funkcji platformy Azure, które są w wersji beta lub wersji zapoznawczej albo w inny sposób nie zostały jeszcze wydane jako ogólnie dostępne.
Protokół TLS można skonfigurować tak, aby zabezpieczyć komunikację MQTT między brokerem MQTT i klientem przy użyciu zasobu BrokerListener. Protokół TLS można skonfigurować za pomocą ręcznego lub automatycznego zarządzania certyfikatami.
Weryfikowanie instalacji menedżera certyfikatów
Automatyczne zarządzanie certyfikatami umożliwia zarządzanie certyfikatem serwera TLS za pomocą menedżera certyfikatów. Domyślnie program cert-manager jest instalowany wraz z wersją zapoznawcza operacji usługi Azure IoT w azure-iot-operations
przestrzeni nazw. Przed kontynuowaniem sprawdź instalację.
Służy
kubectl
do sprawdzania zasobników pasujących do etykiet aplikacji 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
Jeśli zobaczysz zasobniki wyświetlane jako gotowe i uruchomione, narzędzie cert-manager jest zainstalowane i gotowe do użycia.
Napiwek
Aby jeszcze bardziej zweryfikować instalację, zapoznaj się z dokumentacją narzędzia cert-manager, aby zweryfikować instalację. Pamiętaj, aby użyć azure-iot-operations
przestrzeni nazw.
Tworzenie wystawcy dla certyfikatu serwera TLS
Zasób wystawcy certyfikatu definiuje sposób automatycznego wystawiania certyfikatów. Menedżer certyfikatów obsługuje natywnie kilka typów wystawców. Obsługuje również zewnętrzny typ wystawcy na potrzeby rozszerzania funkcji poza natywnie obsługiwanymi wystawcami. Wersja zapoznawcza usługi Azure IoT MQ może być używana z dowolnym typem wystawcy cert-manager.
Ważne
Podczas początkowego wdrażania operacje usługi Azure IoT są instalowane z domyślnym wystawcą dla certyfikatów serwera TLS. Tego wystawcy można użyć do programowania i testowania. Aby uzyskać więcej informacji, zobacz Domyślny główny urząd certyfikacji i wystawca przy użyciu operacji usługi Azure IoT. Poniższe kroki są wymagane tylko wtedy, gdy chcesz użyć innego wystawcy.
Podejście do tworzenia wystawcy różni się w zależności od scenariusza. W poniższych sekcjach wymieniono przykłady ułatwiające rozpoczęcie pracy.
Wystawca urzędu certyfikacji jest przydatny do programowania i testowania. Należy go skonfigurować przy użyciu certyfikatu i klucza prywatnego przechowywanego w kluczu tajnym kubernetes.
Konfigurowanie certyfikatu głównego jako wpisu tajnego kubernetes
Jeśli masz istniejący certyfikat urzędu certyfikacji, utwórz wpis tajny Kubernetes z certyfikatem urzędu certyfikacji i plikami PEM klucza prywatnego. Uruchom następujące polecenie i skonfigurowaliśmy certyfikat główny jako wpis tajny kubernetes i możesz pominąć następną sekcję.
kubectl create secret tls test-ca --cert tls.crt --key tls.key -n azure-iot-operations
Jeśli nie masz certyfikatu urzędu certyfikacji, menedżer certyfikatów może wygenerować certyfikat głównego urzędu certyfikacji. Generowanie certyfikatu głównego urzędu certyfikacji przy użyciu menedżera certyfikatu jest nazywane uruchamianiem wystawcy urzędu certyfikacji z certyfikatem z podpisem własnym.
Zacznij od utworzenia elementu
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
Utwórz certyfikat urzędu certyfikacji z podpisem własnym za pomocą następującego polecenia:
kubectl apply -f ca.yaml
Menedżer certyfikatów tworzy certyfikat urzędu certyfikacji przy użyciu jego wartości domyślnych. Właściwości tego certyfikatu można zmienić, modyfikując specyfikację certyfikatu. Aby uzyskać listę prawidłowych opcji, zobacz dokumentację menedżera certyfikatów.
Dystrybuowanie certyfikatu głównego
Poprzedni przykład przechowuje certyfikat urzędu certyfikacji w kluczu tajnym Kubernetes o nazwie test-ca
. Certyfikat w formacie PEM można pobrać z wpisu tajnego i przechowywać w pliku ca.crt
za pomocą następującego polecenia:
kubectl get secret test-ca -n azure-iot-operations -o json | jq -r '.data["tls.crt"]' | base64 -d > ca.crt
Ten certyfikat musi być dystrybuowany i zaufany przez wszystkich klientów. Na przykład użyj --cafile
flagi dla klienta mosquitto.
Za pomocą usługi Azure Key Vault można zarządzać wpisami tajnymi dla Wpisów tajnych IoT MQ zamiast wpisów tajnych platformy Kubernetes. Aby dowiedzieć się więcej, zobacz Zarządzanie wpisami tajnymi przy użyciu usługi Azure Key Vault lub wpisów tajnych platformy Kubernetes.
Tworzenie wystawcy na podstawie certyfikatu urzędu certyfikacji
Menedżer certyfikatów wymaga wystawcy na podstawie certyfikatu urzędu certyfikacji wygenerowanego lub zaimportowanego we wcześniejszym kroku. Utwórz następujący plik jako 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
Utwórz wystawcę za pomocą następującego polecenia:
kubectl apply -f issuer-ca.yaml
Poprzednie polecenie tworzy wystawcę do wystawiania certyfikatów serwera TLS. Zanotuj nazwę i rodzaj wystawcy. W przykładzie nadaj nazwę my-issuer
i rodzaj Issuer
. Te wartości są ustawiane w zasobie BrokerListener później.
Włączanie protokołu TLS dla portu
Zmodyfikuj tls
ustawienie w zasobie BrokerListener, aby określić port TLS i wystawcę dla frontonów. Poniżej przedstawiono przykład zasobu BrokerListener, który umożliwia protokół TLS na porcie 8884 z automatycznym zarządzaniem certyfikatami.
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
Po skonfigurowaniu zasobu BrokerListener usługa IoT MQ automatycznie tworzy nową usługę z włączonym określonym portem i protokołem TLS.
Opcjonalne: Konfigurowanie parametrów certyfikatu serwera
Jedynymi wymaganymi parametrami są issuerRef.name
i issuerRef.kind
. Wszystkie właściwości wygenerowanych certyfikatów serwera TLS są wybierane automatycznie. Jednak usługa IoT MQ umożliwia dostosowanie niektórych właściwości przez określenie ich w zasobie BrokerListener w obszarze tls.automatic.issuerRef
. Poniżej przedstawiono przykład wszystkich obsługiwanych właściwości:
# 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
Weryfikowanie wdrożenia
Użyj narzędzia kubectl, aby sprawdzić, czy usługa skojarzona z zasobem BrokerListener jest uruchomiona. W powyższym przykładzie nazwa usługi to my-new-tls-listener
, a przestrzeń nazw to azure-iot-operations
. Następujące polecenie sprawdza stan usługi:
$ 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
Połączenie do brokera przy użyciu protokołu TLS
Po skonfigurowaniu certyfikatu serwera protokół TLS jest włączony. Aby przetestować z mosquitto:
mosquitto_pub -h $HOST -p 8884 -V mqttv5 -i "test" -t "test" -m "test" --cafile ca.crt
--cafile
Argument włącza protokół TLS na kliencie mosquitto i określa, że klient powinien ufać wszystkim certyfikatom serwera wystawionym przez dany plik. Należy określić plik zawierający wystawcę skonfigurowanego certyfikatu serwera TLS.
Zastąp $HOST
element odpowiednim hostem:
- Jeśli nawiązujesz połączenie z poziomu tego samego klastra, zastąp ciąg nazwą usługi podaną (
my-new-tls-listener
na przykład) lub usługąCLUSTER-IP
. - W przypadku nawiązywania połączenia spoza klastra usługa
EXTERNAL-IP
.
Pamiętaj, aby w razie potrzeby określić metody uwierzytelniania. Na przykład nazwa użytkownika i hasło.
Domyślny główny urząd certyfikacji i wystawca w usłudze Azure IoT Operations Preview
Aby ułatwić rozpoczęcie pracy, operacje usługi Azure IoT są wdrażane przy użyciu domyślnego głównego urzędu certyfikacji "Szybki start" i wystawcy dla certyfikatów serwera TLS. Tego wystawcy można użyć do programowania i testowania.
Certyfikat urzędu certyfikacji jest z podpisem własnym i nie jest zaufany przez żadnych klientów spoza operacji usługi Azure IoT. Podmiot certyfikatu urzędu certyfikacji jest
CN = Azure IoT Operations Quickstart Root CA - Not for Production
i wygasa w ciągu 30 dni od momentu instalacji.Certyfikat głównego urzędu certyfikacji jest przechowywany w kluczu tajnym kubernetes o nazwie
aio-ca-key-pair-test-only
.Publiczna część certyfikatu głównego urzędu certyfikacji jest przechowywana w ConfigMap o nazwie
aio-ca-trust-bundle-test-only
. Możesz pobrać certyfikat urzędu certyfikacji z obiektu ConfigMap i sprawdzić go za pomocą narzędzia kubectl i 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
Domyślnie w
azure-iot-operations
przestrzeni nazw jest już skonfigurowany wystawca urzędu certyfikacji o nazwieaio-ca-issuer
. Jest on używany jako wspólny wystawca urzędu certyfikacji dla wszystkich certyfikatów serwera TLS dla operacji IoT. Usługa IoT MQ używa wystawcy utworzonego na podstawie tego samego certyfikatu urzędu certyfikacji do wystawiania certyfikatów serwera TLS dla domyślnego odbiornika TLS na porcie 8883. Wystawcę można sprawdzić za pomocą następującego polecenia:$ 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
W środowisku produkcyjnym należy skonfigurować wystawcę urzędu certyfikacji z certyfikatem z zaufanego urzędu certyfikacji, zgodnie z opisem w poprzednich sekcjach.