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