Der Microsoft Azure Device Provisioning Service ist ein Hilfsdienst der die JIT-Bereitstellung im richtigen IoT-Hub ohne manuelles eingreifen ermöglicht. Der Device Provisioning Service ermöglicht die skalierbare und sichere Bereitstellung von Millionen von Geräten.
Einen Azure Device Provisioning Service erstellen
Zum Erstellen eines Device Provisioning Services öffnen wir das Microsoft Azure Portal. Dort klicken wir auf + Resource erstellen aus und geben in das Suchfeld Device Provisioning Service ein. Wählen anschließend im Ergebnis Drop-Down IoT Hub Device Provisioning Service aus.
Auf der Ãœbersichtsseite des Services klicken wir auf Erstellen.
Im Feld Name geben wir iotgdps oder einen anderen beliebigen Namen ein. Wählen unser Abonnement aus, die Ressourcengruppe sowie die gewünschte Region (Standort). Anschließend klicken wir auf Erstellen.
IoT Hubs in dem Azure Device Provisioning Service registrieren
Nachdem wir erfolgreich den Device Provisioning Service erstellt haben, müssen wir in diesem unseren IoT Hub, oder auch durchaus mehrere IoT Hubs um beispielsweise ein IoT-Gerät einem IoT Hub in der nächsten Region mit niedrigen Latenz (Geo Sharding) aber auch für eine Lastverteilung, registrieren.
Um einen IoT Hub mit einem Device Provisioning Service zu verknüpfen, öffnen wir unseren zuvor erstellen Device Provisioning Service iotgdps und wählen im linken Menü auf Einstellungen > Verknüpfte IoT Hubs.
Dort klicken wir auf + Hinzufügen und wählen aus der Liste IoT Hub unseren zuvor erstellten IoT Hub iotghub aus. Als Zugriffsrichtlinie wählen wir iothubowner aus und klicken anschließend auf Speichern.
Nachdem der IoT Hub mit dem Device Provisioning Service verknüpft wurde, erscheint dieser in der Liste Verknüpfte IoT Hubs.
Individual Enrollment
Bei Individual Enrollments handelt es sich um jeweils einen Eintrag pro IoT-Gerät und ist dann eine Option, wenn jedes IoT-Gerät ein individuelle Erstkonfigurationen erfordert. Wir werden in dieser Artikel-Serie nur auf Enrollment Groups eingehen (Registrierungsgruppe), da das Prinzip identisch ist.
Enrollment Groups
Enrollment Groups oder auch Registrierungsgruppen, stellen eine Gruppe von IoT-Geräten dar, die einen gemeinsamen Nachweismechanismus nutzen. Enrollment Groups werden dann verwendet, wenn eine große Anzahl von IoT-Geräten eine gemeinsame Erstkonfiguration nutzen oder einem Mandaten zugeordnet sind.
Eine Registrierungsgruppe anlegen
Bevor wir mit der Erstellung einer Registrierungsgruppe beginnen, benötigen wir OpenSSL für die Zertifikatserstellung.
Installieren und Konfigurieren von OpenSSL
Um OpenSSL auf einem Windows System zu installieren, benötigen wir die Windows Binaries die wir unter dem nachfolgenden Link downloaden können.
OpenSSL Windows Binaries https://kb.firedaemon.com/support/solutions/articles/4000121705
OpenSSL Windows Binaries – Download ZIP: https://mirror.firedaemon.com/OpenSSL/openssl-1.1.1k-dev.zip
Diesen entpacken wir in einen beliebigen Ordner und müssen anschließend zwei Umgebungsvariablen hinzufügen. Dazu öffnen wir unter PC Infos > Erweiterte Systemeigenschaften > Erweitert > Umgebungsvariablen … . Im Bereich Systemvariablen klicken wir auf Neu … und geben als Namen der Variable OPENSSL_CONF ein. Im Feld Wert der Variablen geben wir das bin-Verzeichnis an, gefolgt von openssl.cfg. In meinem Fall
C:\Tools\OpenSSL\x64\bin\openssl.cfg
Als nächstes doppelklicken wir auf die Path-Variable im Bereich Systemvariablen.
Im Dialog Umgebungsvariable bearbeiten klicken wir auf Neu und geben in der Zeile den Pfad zum OpenSSL bin-Verzeichnis an. Bei mir wäre das c:\tools\openssl\x64\bin\.
Um zu testen ob OpenSSL sich von der Eingabeaufforderung aus aufrufen lässt, öffnen wir die Eingabeaufforderung und geben openssl ein. Wenn alles funktioniert hat, so sollte OpenSSL> als Prompt erscheinen.
Erstellen einer Zertifikatskette
Nachdem OpenSSL auf unserem Computer läuft, müssen wir nun eine Zertifikatskette erstellen. Als eine sehr gute Anleitung mit vorgefertigten Scripts hat sich Managing test CA certificates for samples and tutorials im Azure IoT C SDKs and Libraries GitHub Repository erwiesen.
Als Erstes laden wir die notwendigen Scripte vom nachfolgenden GitHub Pfad herunter https://github.com/Azure/azure-iot-sdk-c/tree/master/tools/CACertificates.
Danach öffnen wir die PowerShell als Administrator.
Nun setzen wir die Umgebungsvariable $ENV:OPENSSL_CONF und verweisen auf unsere openssl.cfg Datei, falls das oben nicht bereits schon geschehen ist.
PS C:\WINDOWS\system32> $ENV:OPENSSL_CONF ="C:\Tools\OpenSSL\x64\bin\openssl.cfg"
Ich wechsle nun mit cd N:\CACertificates
in das Verzeichnis in das ich die CACertificates Datei heruntergeladen habe.
Führe nun den nachfolgenden Befehl aus um die Skripte ausführen zu können und bestätige die Frage ob ich die Ausführungsrichtlinien ändern möchte mit Ja.
PS N:\CACertificates> Set-ExecutionPolicy -ExecutionPolicy Unrestricted Ausführungsrichtlinie ändern Die Ausführungsrichtlinie trägt zum Schutz vor nicht vertrauenswürdigen Skripts bei. Wenn Sie die Ausführungsrichtlinie ändern, sind Sie möglicherweise den im Hilfethema "about_Execution_Policies" unter "https:/go.microsoft.com/fwlink/?LinkID=135170" beschriebenen Sicherheitsrisiken ausgesetzt. Möchten Sie die Ausführungsrichtlinie ändern? [J] Ja [A] Ja, alle [N] Nein [K] Nein, keine [H] Anhalten [?] Hilfe (Standard ist "N"): J PS N:\CACertificates>
Im nächsten Schritt müssen wir die Skripte in den globalen Namespace von PowerShell bringen (. .\ca-certs.ps1
hier bitte darauf achten das es zwei Punkte mit einem Leerzeichen zwischen den Punkten sind!).
PS N:\CACertificates> . .\ca-certs WARNUNG: This script is provided for prototyping only. WARNUNG: DO NOT USE CERTIFICATES FROM THIS SCRIPT FOR PRODUCTION! PS N:\CACertificates>
Um zu schauen ob wir bisher alles richtig gemacht haben, führen wir den Befehl Test-CACertsPrerequisites
aus. Die Ausgabe sollte dem der nachfolgenden entsprechen.
PS N:\CACertificates> Test-CACertsPrerequisites Testing if any test certificates have already been installed... Ok. Testing if openssl.exe is set in PATH... Ok. Testing if environment variable OPENSSL_CONF is set... Ok. Success
Jetzt wird eine CA (ein Root-Zertifikat) erzeugt und sog. Intermediate Zertifikate, welche über die Kette zum CA hoch signiert. Heißt wenn wir 3 Intermediate Zertifikatsstufen haben wird Intermediate 1 vom Root CA signiert, das Intermediate 2 von Intermediate 1 und das Intermediate 3 von Intermediate 2.
Dazu geben wir New-CACertsCertChain rsa
ein und führen den Befehl aus.
PS N:\CACertificates> New-CACertsCertChain rsa Beginning to install certificate chain to your LocalMachine\My store Testing if any test certificates have already been installed... Ok. WARNUNG: Generating certificate CN=Azure IoT CA BOGX01 Root CA which is for prototyping, NOT PRODUCTION. It has a hard-coded password and will expire in 365 days. Verzeichnis: N:\CACertificates Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 17.03.2021 14:59 872 RootCABOGX01.cer PSPath : Microsoft.PowerShell.Security\Certificate::LocalMachine\Root\7C4XXXBBD4F3280BXXX2E8A9EB9BXXX 6705EA3D8 PSParentPath : Microsoft.PowerShell.Security\Certificate::LocalMachine\Root PSChildName : 7C4XXXBBD4F3280BXXX2E8A9EB9BXXX PSIsContainer : False Archived : False Extensions : {System.Security.Cryptography.Oid, System.Security.Cryptography.Oid, System.Security.Cryptography.Oid, System.Security.Cryptography.Oid...} FriendlyName : IssuerName : System.Security.Cryptography.X509Certificates.X500DistinguishedName NotAfter : 17.03.2022 14:59:21 NotBefore : 17.03.2021 14:49:21 HasPrivateKey : False PrivateKey : PublicKey : System.Security.Cryptography.X509Certificates.PublicKey RawData : {48, 130, 3, 100...} SerialNumber : 7C4XXXBBD4F3280BXXX2E8A9EB9BXXX SubjectName : System.Security.Cryptography.X509Certificates.X500DistinguishedName SignatureAlgorithm : System.Security.Cryptography.Oid Thumbprint : 7C4XXXBBD4F3280BXXX2E8A9EB9BXXX Version : 3 Handle : 2332444188400 Issuer : CN=Azure IoT CA BOGX01 Root CA Subject : CN=Azure IoT CA BOGX01 Root CA EnhancedKeyUsageList : {Clientauthentifizierung (1.3.6.1.5.5.7.3.2), Serverauthentifizierung (1.3.6.1.5.5.7.3.1)} DnsNameList : {Azure IoT CA BOGX01 Root CA} SendAsTrustedIssuer : False EnrollmentPolicyEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty EnrollmentServerEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty PolicyId : WARNUNG: Generating certificate CN=Azure IoT CA BOGX01 Intermediate 1 CA which is for prototyping, NOT PRODUCTION. It has a hard-coded password and will expire in 365 days. WARNUNG: Generating certificate CN=Azure IoT CA BOGX01 Intermediate 2 CA which is for prototyping, NOT PRODUCTION. It has a hard-coded password and will expire in 365 days. WARNUNG: Generating certificate CN=Azure IoT CA BOGX01 Intermediate 3 CA which is for prototyping, NOT PRODUCTION. It has a hard-coded password and will expire in 365 days. Success
Die Zertifikate wurden erfolgreich im Verzeichnis erstellt.
Zertifikat dem Device Provisioning Service hinzufügen
Diese Zertifikate müssen nun zum Device Provisioning Service hinzugefügt werden. Dazu öffnen wir im Azure Portal unseren Device Provisoning Service und wählen im linken Menü unter Einstellungen > Zertifikate aus.
Hier klicken wir auf Hinzufügen. Auf der Seite Zertifikat hinzufügen geben wir einen beliebigen Namen für das Zertifikat ein und wählen unser Root Zertifikat aus. Klicken anschließend auf Speichern.
Das Zertifikat wurde erfolgreich hinzufügt, es ist jedoch noch ungeprüft (Unverified).
Um das Zertifikat zu überprüfen, klicken wir auf das Zertifikat und es erscheint rechts ein Panel mit Zertifikatsdetails. Weiter unten klicken wir auf Prüfcode generieren und kopieren den Verifizierungscode in die Zwischenablage.
In der PowerShell Konsole führen wir den Befehl New-CACertsVerificationCert “<kopierter Verifizierungscode>“ aus.
PS N:\CACertificates> New-CACertsVerificationCert "6DA841AEB56784XXX44C2XX03B67AXX985C4DE3XX64F83XX" Using Signing Cert::: [Subject] CN=Azure IoT CA BOGX01 Root CA [Issuer] CN=Azure IoT CA BOGX01 Root CA [Serial Number] 1AXX3E5AXXC2029A4DAXXB75F47ADEXA [Not Before] 17.03.2021 14:49:21 [Not After] 17.03.2022 14:59:21 [Thumbprint] 7C4E9DBBD4F3280BD052E8A9EB9B7EC6705EA3D8 WARNUNG: Generating certificate CN=6DA841AEB56784XXX44C2XX03B67AXX985C4DE3XX64F83XX which is for prototyping, NOT PRODUCTION. It has a hard-coded password and will expire in 365 days. Verzeichnis: N:\CACertificates Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 17.03.2021 15:22 944 verifyCert4.cer Certificate with subject CN=6DA841AEB56784XXX44C2XX03B67AXX985C4DE3XX64F83XX has been output to N:\CACertificates\.\verifyCert4.cer
Dieser Befehl erzeugt ein weiteres Zertifikat mit dem Dateinamen VerifyCert4.cer.
Im Panel Zertifikatdetails wählen wir im Feld PEM- oder CER-Verifizierungszertifikatsdatei die Datei VerifyCert4.cer aus und klicken auf Überprüfen.
Nach einem kurzen Augenblick und einem Aktualisieren der Zertifikate Seite, sollte der Status des Zertifikats nun Verified sein.
Ein Gerätezertifikat erstellen
Der Device Provisioning Service ist nun konfiguriert. Im letzten Schritt müssen wir ein Zertifikat für unser IoT-Gerät erstellen. In der PowerShell Konsole führen wir den Befehl New-CACertsDevice mydevice
aus. mydevice kann durch einen beliebigen Gerätenamen ersetzt werden. Der Befehl wird bei der Ausführung nach einem Passwort fragen. Ich wähle 1234 als Passwort.
PS N:\CACertificates> New-CACertsDevice bogxiotdevice1000 Cmdlet New-CACertsDevice an der Befehlspipelineposition 1 Geben Sie Werte für die folgenden Parameter an: certPassword: **** WARNUNG: Generating certificate CN=bogxiotdevice1000 which is for prototyping, NOT PRODUCTION. It has a hard-coded password and will expire in 365 days. Verzeichnis: N:\CACertificates Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 17.03.2021 16:29 3661 bogxiotdevice1000.pfx Password required unable to load Private Key 21876:error:0909006C:PEM routines:get_name:no start line:..\crypto\pem\pem_lib.c:745:Expecting: ANY PRIVATE KEY unable to load certificate 11616:error:0909006C:PEM routines:get_name:no start line:..\crypto\pem\pem_lib.c:745:Expecting: TRUSTED CERTIFICATE Certificate with subject CN=bogxiotdevice1000 has been output to N:\CACertificates\.\bogxiotdevice1000-public.pem
Das Skript generiert nun ein Zertifikat mit dem Namen bogxiotdevice1000.pfx. Diesen benötigen im nächsten Schritt um unser IoT-Gerät mit dem Device Provisioning Service zu verbinden. Dazu mehr im nächsten Artikel.
Erstellen einer Enrollment Group (Registrierungsgruppe)
Ein letzter Schritt fehlt uns noch: das Erstellen einer Enrollment Group! Dazu gehen wir im Azure Portal auf den Device Provisioning Service und wählen im linken Menü unter Einstellungen > Registrierungen verwalten.
Hier klicken wir auf + Registrierungsgruppe hinzufügen. Einen Gruppennamen können wir nach belieben eingeben. Als Nachweistyp wählen wir Zertifikat aus und bei IoT Edge-Gerät wählen wir False. Zertifikatstyp ist ein Zertifizierungsstellenzertifikat. Der vorerst letzte Schritt (auf die weiteren Einstellungen kommen wir in weiteren Artikeln zurück) ist die Auswahl des Zertifikats. Im DropDown Primäres Zertifikat wählen wir uns registriertes und validiertes Root-Zertifikat aus und klicken auf Speichern.
Damit sind wir durch!
Update
Beim PowerShell-Skript gibt es ein Problem mit der Generierung von Device Zertifikaten. Private und Public Zertifikate werden nicht erstellt. Nachdem man das Skript in der PowerShell-Konsole ausgeführt hat, muss man abschließend noch nachfolgende Befehle für die erforderlichen Device Zertifikate ausführen um die fehlenden -all, -private und -public Dateien zu generieren.
openssl pkcs12 -in bogxiotdevicenam1.pfx -out bogxiotdevicenam1-all.pem -nodes -password pass:1234 openssl rsa -in bogxiotdevicenam1-all.pem -out bogxiotdevicenam1-private.pem openssl x509 -in bogxiotdevicenam1-all.pem -out bogxiotdevicenam1-public.pem
Weiterführende Links
- Azure IoT Hub Device Provisioning Service (DPS) Documentation
- Azure IoT C SDKs and Libraries
- Managing test CA certificates for samples and tutorials
- Azure IoT Samples for C# (.NET)
- Service provisioning samples
- AZ-220ZH-Microsoft-Azure-IoT-Developer /06-Automatic Enrollment of Devices in DPS /Final /ContainerDevice