Sicherheit des ESP8266 (HTTPS, OTA, Zertifikate, …)

IoT-Sicherung und Bot-Netze sind gerade überall im Gespräch.

Grund genug, sich ein paar Gedanken über die Sicherheit des geliebten ESP8266 zu machen.

Eine Anmerkung vorweg: Die Entwicklung des ESP8266 schreitet rasend voran, weshalb dieser Artikel den Stand Dez 2016 widerspiegelt.

HTTPS Requests

Https Requests sind, wie das unten aufgeführte Beispiel zeigt, ohne großen Aufwand möglich.

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>

ESP8266WiFiMulti WiFiMulti;

void setup() {

	Serial.begin(115200);
	WiFiMulti.addAP("XX", "XXXXXXXXXXXXXXXX");
}

void loop() {
	if((WiFiMulti.run() == WL_CONNECTED)) {

		HTTPClient http;

		Serial.println("HTTP Request\n");
		http.begin("https://www.howsmyssl.com/", "C9 B3 B9 42 F6 41 B8 A2 77 71 00 FA 77 39 51 EC AF 2C 54 A8");
		int httpCode = http.GET();
		Serial.printf("Code: %d / %s\n", httpCode, http.errorToString(httpCode).c_str());
		if(httpCode == HTTP_CODE_OK) {
			String payload = http.getString();
			Serial.println(payload);
		}
		http.end();
	}
	delay(10000);
}

Zwei Punkte sind jedoch zu beachten:

Zum einen werden die Zertifikate zur Zeit über den Fingerprint des Zertifikates geprüft. Dieser Fingerprint ändert sich jedoch jedes mal, wenn das Zertifikate ausgetauscht wird. In diesem Fall muss der Fingerprint im Quellcode angepasst werden.  Eine Prüfung über Zertifikatsketten ist noch in den Kinderschuhen (Stichwort verifyCertChain / Issue 1851).

Zum anderen wird  TLS zur Zeit nur in der Version 1.1 mit den folgenden Verschlüsselungsalgorithmen unterstützt:

  • TLS_RSA_WITH_AES_128_CBC_SHA
  • TLS_RSA_WITH_AES_256_CBC_SHA

Diverse Webserver unterstützen diese Algorithmen nicht. Aus diesem Grund kann eine Verbindung zu bestimmten Servern nicht aufgebaut, obwohl der Fingerprint korrekt ist.

Auf meiner lighttpd Installation muss ich ihn zu den erlaubten Algorithmen hinzufügen (“AES256-SHA”):

ssl.cipher-list = "AES256+EECDH:AES256+EDH:AES256-SHA:!aNULL:!eNULL"

Man sollte jedoch im Hinterkopf behalten, dass diese Algorithmen aus guten Grund  auf den Servern nicht aktiv sind, da sie u.a. keine Perfect_Forward_Secrecy  bieten.

 

HTTPS Server

Dieser Punkt ist leicht: Es gibt noch keinen leicht nutzbaren HTTPS Server der auf dem ESP8266 läuft.

Zugriff aus dem Internet

Wenn ein Zugriff aus dem Internet auf den ESP8266 notwendig ist, sollte dies über eine VPN-Verbindung erfolgen oder über einen HTTPS-Reserve-Proxy. Eine Anleitung für letztes findet sich bei joe at jjssoftware. Ich würde den Zugang jedoch noch um eine Authentifizierung ergänzen, zumindest aber den Zugriff auf die OTA Webseite (siehe unten) einzuschränken.

Access Point

Zumindest wenn Arduino genutzt wird, ist der ESP8266 sowohl im Access Point (spannt ein WLAN auf) als auch im Station-Modus (er verbindet sich mit einem existierenden WLAN) aktiv.  Für das aufgespannte Netzwerk wird kein Passwort gesetzt, so dass jeder in der Nähe sich verbinden kann.

Daher sollte der ESP8266 explizit in den Station-Modus versetzt werden:

WiFi.mode(WIFI_STA);

Alternativ sollte ein sicheres Password für das WLAN gesetzt werden.

OTA (Over the Air)

Ein Segen und ein Fluch. OTA ermöglicht ein Upgrade der Firmware über WLAN. Kein Kabel oder ähnliches ist mehr möglich. Neben der reinen Fehlerkorrektur kann dieses Verfahren natürlich genutzt werden, den ESP8266 zu manipulieren.

Während man WebUpdater.ino ganz schnell vergessen sollte, ist SecureWebUpdater.ino sicherlich ein guter Start, aber man sollte einige Dinge beachten.

Zum einen sollte man ein sicheres Passwort wählen, zum anderen ist in diesem Fall sowohl der AP als auch der Station-Modus aktiv. Beachten sollte man auch, dass ohne die Nutzung von HTTPS, was zur Zeit nicht möglich ist, dass Passwort bei der Übertragung nicht wirklich geschützt ist.

Wünschenswert wäre es auch, die Firmware signieren zu können, um die Herkunft zu überprüfen.

Ein Issue zu diesem Thema ist auf Github bereits geöffnet und Ideen wurden schon entwickelt. Aber eine Implementierung gibt es nicht.

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert


The reCAPTCHA verification period has expired. Please reload the page.