Im Artikel Der Microsoft Azure Device Provisioning Service haben wir gelernt was der Microsoft Azure Device Provisioning Service ist und wie dieser eingerichtet wird. Anschlie횩end haben wir im Artikel Ein Simulated Device (C#) mit dem Azure Device Provisioning Service verbinden und provisionieren ein simuliertes IoT-Ger채t in C# entwickelt und eine automatische Provisionierung des IoT-Ger채tes mit Hilfe des Azure Device Provisioning Services f체r eine IoT-Instanz vorgenommen.

Um die Linie beizubehalten, werden wir auch hier wieder neben dem simulierten IoT-Ger채t ein echtes ESP32 Mikrocontroller-Board nutzen um diesen wiederum mit Hilfe des Azure Device Provisioning Services automatisch zu provisionieren.

Wir werden das Beispiel in diesem Artikel mit einem neuen Root CA Zertifikat durchspielen und zwar mit Zertifikaten nach dem in dem Espressif ESP Azure IoT SDK GitHub Respositoy beschriebenen Verfahren.

Espressif stellt auf GitHub das ESP Azure IoT SDK zur Vef체gung. Es bietet unterschiedliche Beispiel f체r die Espressif ESP32 und ESP8266 Mikrocontrollerfamilien. Mit prov_de_client_II_sample existiert ein Beispiel, welches die Provisionierung des IoT-Ger채tes mit dem Azure Device Provisioning Service aufzeigt. Wir werden in diesem Artikel dieses Beispiel Schritt-f체r-Schritt durchspielen und auch die Repository klonen.

Zertifikate erstellen mit OpenSSL nach dem Espressif Beispiel

Die Zertifikate werden mit Hilfe von OpenSSL generiert. OpenSSL sollte bereits installiert und eingerichtet sein. Falls nicht, ist das Verfahren im Artikel Der Microsoft Azure Device Provisioning Service beschrieben. Das von mit verwendete Beispiel kann man hier (prov_dev_client_II_sample) auf Github finden.

Wir 철ffnen die Eingabeaufforderung und f체hren die folgenden Schritt durch.

Als Erstes generieren wir einen Root CA Private Key:

openssl genrsa -out rootCA.key 4096

Im n채chsten Schritt erstellen wir das Root CA Zertifikat. Der Befehl fragt nach Informationen, welche im Zertifikat abgelegt werden. Hier kann man alles beim Standard belassen oder aber auch individuelle Eintr채ge vornehmen. Bei Common Name muss ein Eintrag gemacht werden.

 $ openssl req -x509 -new -key rootCA.key -days 1024 -out rootCA.pem

Jetzt wird der Schl체ssel f체r das IoT-Ger채t bzw. die Ger채tegruppe erzeugt.

openssl genrsa -out leaf_private_key.pem 4096

Und mit dem nachfolgenden Befehl der Certificate Signing Request generiert. Die Angaben f체r notwendigen Informationen sind, wie oben bereits durchgef체hrt, optional! Wichtig ist jedoch, dass f체r das Attribut Common Namen in diesem Fall die gew체nschte DeviceID (in diesem Beispiel XYBIOTD1000) angegeben werden muss! Diese DeviceID muss mit der DeviceID in der IoT-Ger채te Konfiguration identisch sein und damit wird auch das IoT-Ger채t in der IoT Hub-Instanz registriert.

openssl req -new -key leaf_private_key.pem -out leaf.csr

Mit dem OpelSSL Parameter X509 wird das Ger채tezertifikat generiert.

openssl x509 -req -in leaf.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out leaf_certificate.pem

Das sind die generierten Zertifikatsdateien im Explorer:

Zertifikat zum Device Provisioning Service hinzuf체gen

Um das Zertifikat dem Device Provisioning Service hinzuzuf체gen, 철ffnen wir das Azure Portal und dort den gew체nschten Device Provisioning Service. Im linken Men체 w채hlen wir unter Settings > Certificates.

Mit einem Klick auf + Add 철ffnet sich das Panel Add Certificate. Hier geben wir einen beliebigen Namen f체r das Zertifikat ein und w채hlen das Root CA Zertificat rootCA.pem.

Mit einem Klick auf Save f체gen wir das Zertifikat hinzu. Es ist noch im Status Unverified.

Um das Zertifikat zu verifizieren klicken wir auf den Namen des zuvor hinzugef체gten Zertifikats (EspressIfESP32SampleCertv2). Im Panel Certificates klicken wir auf die Schaltfl채che Generate Verification Code. Es wird ein Verifizierungscode im Feld Verification Code generiert. Diesen kopieren wir in die Zwischenablage.

Das Browser-Fenster lassen wir ge철ffnet und auch das Panel Certificates. Um nun das Verifizierungs-Zertifikat zu generieren m체ssen wir zuerst in der Eingabeaufforderung nachfolgenden Befehl eingeben. Dieser Befehl erzeugt einen Certificate Signing Request.

openssl req -new -key rootCA.key -out verification.csr

Der Befehl fragt erneut nach Informationen, die wir wie oben bereits mehrfach gemacht, einfach beim Standard belassen k철nnen. Bis auf Common Name! Hier f체gen wir den Verifizierungscode ein, den wir im Schritt zuvor in die Zwischenablage kopiert haben! Hinweis: Als challenge password nehme ich immer f체r die Beispiele 1234 und das Attribut optional company name lasse ich leer.

Um das Verifizierungs-Zertificat zu generieren, geben wir nachfolgenden Befehl ein:

openssl x509 -req -in verification.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out verification_certificate.pem

Die erzeugte Datei verification_certificate.pem w채hlen wir im Azure Portal, im noch ge철ffneten Browser-Fenster im Panel Certificates im Feld Verification Certificate .pem or .cer file aus und klicken anschlie횩end auf die Schaltfl채che Verify.

Wenn die Verifizierung erfolgreich war, 채ndert sich der Status des Zertifikats in der Zertifikatsliste von Unverified in Verfied.

Eine Enrollment-Group erstellen

Wir erstellen in diesem Abschnitt eine neue Enrollment-Gruppe. Dazu 철ffnen wir den gew체nschten Device Provisioning Service in dem dieser erstellt werden soll und w채hlen im linken Men체 unter Settings > Manage enrollments aus.

Auf der Seite Manage enrollments klicken wir auf + Add enrollment group. Es 철ffnet sich die Seite Add Enrollment Group. Hier geben wir einen beliebigen Namen f체r die Enrollment Group ein und w채hlen bei Attestation Type Certificate und bei IoT Edge device False aus. Als Primary Certificate w채hlen wir das zuvor hinzugef체gte Zertifikat aus und lassen die weiteren Einstellungen unver채ndert. Zum Erstellen der Enrollment Group klicken wir auf Save.

Nach erfolgreichem Speichern erscheint die Enrollment Group in der Liste der Enrollment Groups.

Ger채te-Konfiguration und Programmierung des ESP32

Nachdem wir nun das Zertifikate und die Enrollment Group erfolgreich angelegt und konfiguriert haben, m체ssen wir im n채chsten Schritt die Github Repository klonen und das Beispiel konfigurieren, bevor wir den ESP32 programmieren.

Die Url der Github-Repository lautet https://github.com/espressif/esp-azure. Dazu erstellen wir ein beliebiges Verzeichnis auf einem beliebigen Laufwerk und 철ffnen die Eingabeaufforderung. Dann wechseln wir in das Verzeichnis und geben den folgenden Befehl ein:

git clone https://github.com/espressif/esp-azure

Es wird automatisch ein Unterverzeichnis mit dem Name esp-azure angelegt. Dort wechseln wir in das Verzeichnis esp-azure\examples\prov_dev_client_ll_sample\main\certs und kopieren in dieses Verzeichnis die zuvor erstellten beiden Zertifikate leaf_certificate.pem und leaf_private_key.pem.

Nun muss noch die Konfiguration des Beispiels erfolgt, so dass der ESP32 wei횩 mit welchem WLAN es sich verbinden soll, wie die DeviceID lautet usw. Dazu wechseln wir in das Verzeichnis esp-azure\examples\prov_dev_client_ll_sample und f체hren den folgenden Befehl aus:

idf.py make menuconfig

Der Befehl erzeugt eine Datei mit dem Namen sdkconfig. Mehr zu menuconfig kann man hier nachlesen. Die Datei sdkconfig 철ffnen wir einem Editor und suchen nach # Example Configuration. Hier passen wir die nachfolgenden Werte f체r die Konfiguration an.

#
# Example Configuration
#
CONFIG_WIFI_SSID="BOGX"
CONFIG_WIFI_PASSWORD="mypassword"
CONFIG_IOTHUB_CONNECTION_STRING="iotgdps.azure-devices-provisioning.net"
CONFIG_DEVICE_COMMON_NAME="XYBIOTD1000"
CONFIG_DPS_ID_SCOPE="0ne00XXA1XX"
# end of Example Configuration

Die Konfiguration

Die WLAN Konfiguration erfolgt 체ber die beiden Eintr채ge bei CONFIG_WIFI_SSID und CONFIG_WIFI_PASSWORD. Diese beiden Eintr채ge beinhalten den Namen und das Passwort des WLAN’s mit dem sich der ESP32 verbinden soll.

Den IoT Hub Connection-String tragen wir ein beim Parameter CONFIG_IOTHUB_CONNECTION_STRING. Den IoT-Hub Connection String finden wir im Azure Portal. Dort 철ffnen wir den IoT Hub und unter Overview ist es der Hostname den wir ben철tigen. Das ist der Connection-String.

Die DeviceID, welchen wir bei der Generierung der Zertifikate festgelegt haben, tragen wir bei CONFIG_DEVICE_COMMON_NAME ein. Und die ID Scope des Device Provisioning Services, welches wir bei CONFIG_DPS_ID_SCOPE eintragen, finde wir nat체rlich auch im Azure Portal. Dazu 철ffnen wir unseren Device Provisioning Service und auf der Seite Overview ben철tigen wir den Wert von ID Scope.

Im letzten Schritt erstellen wir das Beispiel mit dem Befehl idf.py build. Dazu m체ssen wir uns im Verzeichnis esp-azure\examples\prov_dev_client_ll_sample befinden!

idf.py build

Der Build-Vorgang kann enige Minuten dauern. Zeit zum Kaffee holen! Um das Beispiel auf den ESP32 zu schreiben, gebe ich in der Eingabeaufforderung den Befehl idf.py -p COM3 flash ein. Das Monitoring kann mit idf.py -p COM3 monitor gestartet werden.

idf.py -p COM3 flash

Check

Wenn wir alles richtig gemacht haben, m체ssten wir im Azure Portal den Device Provision Service 철ffnen. Danach im linken Men체 Settings > Manage enrollments ausw채hlen. Dort in der Liste der Enrollment Groups die von uns erstellte Gruppe ausw채hlen und auf der Seite <EnrollmentGroup Name> (in unserem Fall EnrollmentGroupEspressIfESP32Certv2) im Reiter Registration Records sollte nun unser IoT-Ger채t erscheinen:

Dieser Eintrag sollte auch im IoT Hub zu finden sein. Dazu wieder im Azure Portal den IoT Hub 철ffnen und im linken Men체 unter Explorers den Punkt IoT devices ausw채hlen. Dort sollte ebenfalls unser IoT-Ger채t mit der DeviceID XYBIOTD1000 aufgelistet sein.

Done!