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