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!