NodeMCU ESP8266 HTTPS Secure POST GET Request

Die meisten Mikrocontroller und Development Boards (Arduino, NodeMCU, ESP32, ESP8266 usw.) verwenden bei der Kommunikation mit einem Webserver das unverschlüsselte Protokoll HTTP. Sehr oft ist das vom Entwickler oder Anwender sogar gewollt, da hier meistens nur Steuerdaten übertragen werden und es nicht notwendig ist, diese zu verschlüsseln. Trotzdem kommt es oft zu immer mehr Problemen, wenn man HTTP anstatt HTTPS verwendet.

Warum HTTP immer mehr zum Problem wird

Für die Datenübertragung zwischen Webserver und Mikrocontroller wird seit mehr als einem Jahrzehnt HTTP verwendet. Für das Protokoll gibt es sehr viele einfache Bibliotheken und die Ressourcen an heutigen Mikrocontrollern sind für diesen Verwendungszweck ausreichen vorhanden. HTTPS ist bei jeder guten Webseite heutzutage eine Grundvoraussetzung. Immer mehr Webserver bzw. Webspace Anbieter akzeptieren nur noch das HTTPS Protokoll. Teilweise blockieren auch Firewalls bereits HTTP und lassen nur noch HTTPS-Requests durch. Genau diese gravierende und fortschreitende Entwicklung zwingt uns, die Datenübertragungsart der Mikrocontroller anzupassen.

HTTPS ohne Zertifikatabfrage

Grundsätzlich bestätigt die Zertifizierungsstelle die Echtheit des Servers. Der Client kann durch die Abfrage der Zertifikate erkennen, ob der angefragte Server tatsächlich dieser ist, oder ob jemand dazwischen die zu übertragenen Daten abfängt. Unser Beispielcode ignoriert diese Überprüfung. Das bedeutet, die Datenübertragung erfolgt zwar über HTTPS, jedoch wird die Vertraulichkeit der Gegenstelle nicht überprüft. Für die meisten Anwendungen ist der Beispielcode trotzdem geeignet. Außerdem kommuniziert der Mikrocontroller auch bei einem Zertifikatsfehler oder einem selbst signierten SSL-Zertifikat zuverlässig.

ESP8266/NodeMCU Beispielcode

Unser Beispielcode funktioniert gleich wie der eines HTTP-Requests, allerdings über HTTPs. Dazu wird am Beginn des Quellcodes eine URL definiert, die der Mikrocontroller später aufrufen wird. Während des Aufrufes kann man dann Parameter über POST und GET an den Webserver übermitteln. Das können beispielsweise Wetterdaten einer Messstation sein. Die empfangene Antwort des Servers wandelt der Sourcecode in einen String um, der dann wenn nötig relativ einfach weiterverarbeitet werden kann.

NodeMCU HTTPS Source Code
/*
HTTPS GET/POST Request for NodeMCU/ESP8266
Powered by: https://www.aeq-web.com
*/

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPClient.h>
///////////////////////////////BASIC SETINGS////////////////////////////
const char *ssid = "YOURNETWORK"; //Wifi Network Name
const char *password = "YOURPASSWORD"; //Wifi Network Key
const char *host = "www.aeq-web.com"; //Domain to Server
String path = "/test.php?get=test"; //Path of Server
const int httpsPort = 443; //HTTPS PORT (default: 443)
int refreshtime = 15; //Make new HTTPS request after x seconds
///////////////////////////////BASIC SETINGS////////////////////////////

String datarx; //Received data as string
long crontimer;

void setup() {
  delay(1000);
  Serial.begin(115200);
  WiFi.mode(WIFI_OFF);
  delay(1000);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.print("Connected: ");
  Serial.println(ssid);
}

void loop() {
  if(crontimer < millis()/1000){
    crontimer = (millis()/1000)+refreshtime;
    callhttps(); //
  }
}

void callhttps(){
  WiFiClientSecure httpsClient;
  httpsClient.setTimeout(15000);
  delay(1000);
  int retry = 0;
  while ((!httpsClient.connect(host, httpsPort)) && (retry < 15)) {
    delay(100);
    Serial.print(".");
    retry++;
  }
  if (retry == 15) {
    Serial.println("Connection failed");
  }
  else {
    Serial.println("Connected to Server");
  }
  httpsClient.print(String("GET ") + path + 
                    "HTTP/1.1\r\n" +
                    "Host: " + host +
                    "\r\n" + "Connection: close\r\n\r\n");
  while (httpsClient.connected()) {
    String line = httpsClient.readStringUntil('\n');
    if (line == "\r") {
      break;
    }
  }
  while (httpsClient.available()) {
    datarx += httpsClient.readStringUntil('\n');
  }
  Serial.println(datarx);
  datarx = "";
}
NodeMCU PHP Source Code
<?php
echo "GET: " . $_GET["get"]. " ";
echo "POST: " . $_GET["post"]. " ";
echo "Time: " . date("Y-m-d H:i:s");
?>

Oft gelesen

Anzeige:

Social Media

Newsletter