{"id":755,"date":"2016-12-20T20:47:14","date_gmt":"2016-12-20T19:47:14","guid":{"rendered":"http:\/\/www.open4me.de\/?p=755"},"modified":"2017-01-10T20:55:44","modified_gmt":"2017-01-10T19:55:44","slug":"sicherheit-esp8266-https-ota-zertifikate","status":"publish","type":"post","link":"https:\/\/www.open4me.de\/index.php\/2016\/12\/sicherheit-esp8266-https-ota-zertifikate\/","title":{"rendered":"Sicherheit des ESP8266 (HTTPS, OTA, Zertifikate, &#8230;)"},"content":{"rendered":"<p>IoT-Sicherung und Bot-Netze sind gerade \u00fcberall im Gespr\u00e4ch.<\/p>\n<p>Grund genug, sich ein paar Gedanken \u00fcber die Sicherheit des geliebten ESP8266 zu machen.<\/p>\n<p>Eine Anmerkung vorweg: Die Entwicklung des ESP8266 schreitet rasend voran, weshalb dieser Artikel den Stand Dez 2016 widerspiegelt.<\/p>\n<p><!--more--><\/p>\n<h1>HTTPS Requests<\/h1>\n<p>Https Requests sind, wie das unten aufgef\u00fchrte Beispiel zeigt, ohne gro\u00dfen Aufwand m\u00f6glich.<\/p>\n<pre class=\"lang:c++ decode:true\" title=\"HTTPS Request\">#include &lt;Arduino.h&gt;\r\n#include &lt;ESP8266WiFi.h&gt;\r\n#include &lt;ESP8266WiFiMulti.h&gt;\r\n#include &lt;ESP8266HTTPClient.h&gt;\r\n\r\nESP8266WiFiMulti WiFiMulti;\r\n\r\nvoid setup() {\r\n\r\n\tSerial.begin(115200);\r\n\tWiFiMulti.addAP(\"XX\", \"XXXXXXXXXXXXXXXX\");\r\n}\r\n\r\nvoid loop() {\r\n\tif((WiFiMulti.run() == WL_CONNECTED)) {\r\n\r\n\t\tHTTPClient http;\r\n\r\n\t\tSerial.println(\"HTTP Request\\n\");\r\n\t\thttp.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\");\r\n\t\tint httpCode = http.GET();\r\n\t\tSerial.printf(\"Code: %d \/ %s\\n\", httpCode, http.errorToString(httpCode).c_str());\r\n\t\tif(httpCode == HTTP_CODE_OK) {\r\n\t\t\tString payload = http.getString();\r\n\t\t\tSerial.println(payload);\r\n\t\t}\r\n\t\thttp.end();\r\n\t}\r\n\tdelay(10000);\r\n}\r\n\r\n<\/pre>\n<p>Zwei Punkte sind jedoch zu beachten:<\/p>\n<p>Zum einen werden die Zertifikate zur Zeit \u00fcber den Fingerprint des Zertifikates gepr\u00fcft. Dieser Fingerprint \u00e4ndert sich jedoch jedes mal, wenn das Zertifikate ausgetauscht wird. In diesem Fall muss der Fingerprint im Quellcode angepasst werden.\u00a0 Eine Pr\u00fcfung \u00fcber Zertifikatsketten ist noch in den Kinderschuhen (Stichwort verifyCertChain \/ <a href=\"https:\/\/github.com\/esp8266\/Arduino\/issues\/1851\">Issue 1851<\/a>).<\/p>\n<p>Zum anderen wird\u00a0 TLS zur Zeit nur in der Version 1.1 mit den folgenden Verschl\u00fcsselungsalgorithmen unterst\u00fctzt:<\/p>\n<ul>\n<li>TLS_RSA_WITH_AES_128_CBC_SHA<\/li>\n<li>TLS_RSA_WITH_AES_256_CBC_SHA<\/li>\n<\/ul>\n<p>Diverse Webserver unterst\u00fctzen diese Algorithmen nicht. Aus diesem Grund kann eine Verbindung zu bestimmten Servern nicht aufgebaut, obwohl der Fingerprint korrekt ist.<\/p>\n<p>Auf meiner lighttpd Installation muss ich ihn zu den erlaubten Algorithmen hinzuf\u00fcgen (&#8222;AES256-SHA&#8220;):<\/p>\n<pre class=\"lang:default decode:true\">ssl.cipher-list = \"AES256+EECDH:AES256+EDH:AES256-SHA:!aNULL:!eNULL\"\r\n<\/pre>\n<p>Man sollte jedoch im Hinterkopf behalten, dass diese Algorithmen aus guten Grund\u00a0 auf den Servern nicht aktiv sind, da sie u.a. keine <a href=\"https:\/\/de.wikipedia.org\/wiki\/Perfect_Forward_Secrecy\">Perfect_Forward_Secrecy<\/a>\u00a0 bieten.<\/p>\n<p>&nbsp;<\/p>\n<h1>HTTPS Server<\/h1>\n<p>Dieser Punkt ist leicht: Es gibt noch keinen leicht nutzbaren HTTPS Server der auf dem ESP8266 l\u00e4uft.<\/p>\n<h1>Zugriff aus dem Internet<\/h1>\n<p>Wenn ein Zugriff aus dem Internet auf den ESP8266 notwendig ist, sollte dies \u00fcber eine VPN-Verbindung erfolgen oder \u00fcber einen HTTPS-Reserve-Proxy. Eine Anleitung f\u00fcr letztes findet sich bei <a href=\"https:\/\/jjssoftware.github.io\/secure-your-esp8266\/\">joe at jjssoftware<\/a>. Ich w\u00fcrde den Zugang jedoch noch um eine Authentifizierung erg\u00e4nzen, zumindest aber den Zugriff auf die OTA Webseite (siehe unten) einzuschr\u00e4nken.<\/p>\n<h1>Access Point<\/h1>\n<p>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.\u00a0 F\u00fcr das aufgespannte Netzwerk wird kein Passwort gesetzt, so dass jeder in der N\u00e4he sich verbinden kann.<\/p>\n<p>Daher sollte der ESP8266 explizit in den Station-Modus versetzt werden:<\/p>\n<pre class=\"lang:c++ decode:true\">WiFi.mode(WIFI_STA);<\/pre>\n<p>Alternativ sollte ein sicheres Password f\u00fcr das WLAN gesetzt werden.<\/p>\n<h1>OTA (Over the Air)<\/h1>\n<p>Ein Segen und ein Fluch. OTA erm\u00f6glicht ein Upgrade der Firmware \u00fcber WLAN. Kein Kabel oder \u00e4hnliches ist mehr m\u00f6glich. Neben der reinen Fehlerkorrektur kann dieses Verfahren nat\u00fcrlich genutzt werden, den ESP8266 zu manipulieren.<\/p>\n<p>W\u00e4hrend man WebUpdater.ino ganz schnell vergessen sollte, ist <a href=\"https:\/\/github.com\/esp8266\/Arduino\/blob\/master\/libraries\/ESP8266HTTPUpdateServer\/examples\/SecureWebUpdater\/SecureWebUpdater.ino\">SecureWebUpdater.ino<\/a> sicherlich ein guter Start, aber man sollte einige Dinge beachten.<\/p>\n<p>Zum einen sollte man ein sicheres Passwort w\u00e4hlen, 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\u00f6glich ist, dass Passwort bei der \u00dcbertragung nicht wirklich gesch\u00fctzt ist.<\/p>\n<p>W\u00fcnschenswert w\u00e4re es auch, die Firmware signieren zu k\u00f6nnen, um die Herkunft zu \u00fcberpr\u00fcfen.<\/p>\n<p>Ein Issue zu diesem Thema ist auf Github bereits <a href=\"https:\/\/github.com\/esp8266\/Arduino\/issues\/2103\">ge\u00f6ffnet <\/a>und Ideen wurden schon entwickelt. Aber eine Implementierung gibt es nicht.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>IoT-Sicherung und Bot-Netze sind gerade \u00fcberall im Gespr\u00e4ch. Grund genug, sich ein paar Gedanken \u00fcber 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.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[37,36],"tags":[],"class_list":["post-755","post","type-post","status-publish","format-standard","hentry","category-esp8266","category-mikroprozessor"],"_links":{"self":[{"href":"https:\/\/www.open4me.de\/index.php\/wp-json\/wp\/v2\/posts\/755","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.open4me.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.open4me.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.open4me.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.open4me.de\/index.php\/wp-json\/wp\/v2\/comments?post=755"}],"version-history":[{"count":14,"href":"https:\/\/www.open4me.de\/index.php\/wp-json\/wp\/v2\/posts\/755\/revisions"}],"predecessor-version":[{"id":809,"href":"https:\/\/www.open4me.de\/index.php\/wp-json\/wp\/v2\/posts\/755\/revisions\/809"}],"wp:attachment":[{"href":"https:\/\/www.open4me.de\/index.php\/wp-json\/wp\/v2\/media?parent=755"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.open4me.de\/index.php\/wp-json\/wp\/v2\/categories?post=755"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.open4me.de\/index.php\/wp-json\/wp\/v2\/tags?post=755"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}