INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
[Info] HTTPS - Client-Verbindungen
18.12.2018, 15:13 (Dieser Beitrag wurde zuletzt bearbeitet: 18.12.2018 22:38 von Bitklopfer.)
Beitrag #1
[Info] HTTPS - Client-Verbindungen
Angeregt von diesem Thread habe ich mich nochmal mit dem Thema HTTPS beschäftigt.

Aktuell ist in den Libs des ESP8266 gerade ein Umbruch zu verzeichnen.
In der Version 2.4.2 wird standardmäßig die ältere Lib "WiFiClientSecureAxTLS" in WiFiClientSecure.h aktiviert, in 2.5.0-beta2 die neuere "WiFiClientSecureBearSSL". Diese ist aber auch in der 2.4.2 bereits vorhanden.

Zwischen beiden gibt es 2 wesentliche Unterschiede:

1. Die WiFiClientSecureAxTLS überläßt die Entscheidung zur Prüfung des SHA1-Fingerprints völlig dem Entwickler des Sketches. Die WiFiClientSecureBearSSL will von ihm eine Entscheidung haben. Dazu später im Code mehr.

2. Beide wollen den Fingerprint in unterschiedlichen Formaten. Sonst wäre es ja langweilig.

Ich fange mal mit dem 2. Teil an. Die Fingerprints (hier für jigsaw.w3.org) sehen folgendermaßen aus:
Code:
// WiFiClientSecureAxTLS
const char fingerprint[]="5A:CF:FE:F0:F1:A6:F4:5F:D2:11:11:C6:1D:2F:0E:BC:39:8D:50:E0";
// WiFiClientSecureBearSSL
const uint8_t fingerprint[20] = {0x5A,0xCF,0xFE,0xF0,0xF1,0xA6,0xF4,0x5F,0xD2,0x11,0x11,0xC6,0x1D,0x2F,0x0E,0xBC​,0x39,0x8D,0x50,0xE0};
Das händisch umzuschreiben ist fehlerträchtig, deshalb ein kleiner Sketch, um das zu vereinfachen:
Code:
char axTLS[]="5A:CF:FE:F0:F1:A6:F4:5F:D2:11:11:C6:1D:2F:0E:BC:39:8D:50:E0";
char bearSSL[105];

void convert() {
char *ptr;
byte idx = 0;
  strcpy(bearSSL,"{");
  ptr = strtok(axTLS, ":");
  // solange was gefunden wurde
  while(ptr != NULL) {
    // Serial.println(ptr);  // gibt die einzelnen Zahlen aus
    if (idx > 0) strcat(bearSSL,",");
    idx++;
    strcat(bearSSL,"0x");
    strcat(bearSSL,ptr);
    // neu suchen NULL als Eingabe, die Funktion weiß, wo sie ist
    ptr = strtok(NULL,":");
  }
  strcat(bearSSL,"}");
}

void setup() {
  Serial.begin(115200);
  Serial.println("\nStart");
  Serial.println(axTLS);
  convert();
  Serial.println(bearSSL);
}

void loop() {}
Wie kommt man an den Fingerprint? Entweder über das https-Zeichen in der Adresszeile des Browsers (Firefox) und dort auf Infos zum Key und Zertifikat anzeigen lassen oder über den Weg, der im verlinkten Beitrag angegeben war.
Hier die korrigierte Fassung:
Code:
REM download: https://www.geotrust.com/resources/root_certificates/certificates/Equifax_Secure_Certificate_Authority.pem
REM download: https://indy.fulgan.com/SSL

echo | openssl s_client -CAfile Equifax_Secure_Certificate_Authority.pem -connect jigsaw.w3.org:443 | openssl x509 -fingerprint -noout
pause
Im SSL-Verzeichnis steht immer die letzte Version. Das Zip runterladen, entpacken und in das Verzeichnis auch das pem-Zertifikat kopieren.
Beide Varianten liefern die Fingerprints im Format für axTLS.
Für alle Keys und damit Fingerprints gilt: Sie sind nur eine begrenzte Zeit gültig. (das Beispiel bis 02.06.2019).

Da die Variante mit WiFiClientSecureBearSSL den zukünftigen Weg darstellt, habe ich mich mit ihr beschäftigt. Sie bietet 3 Einstellmöglichkeiten, von denen 1 gewählt werden muss, sonst wird keine Verbindung hergestellt.

a) setInsecure() - Alle Prüfungen des Servers werden ausgeschaltet
b) setFingerprint(const uint8_t fingerprint[20]) hier wird über den Fingerprint geprüft, ob der Server auch der ist, für den er sich ausgibt
c) setKnownKey(...) hier wird auf einen public Key des Servers geprüft, dieses habe ich nicht getestet.

Hier mal ein funktionierender Code, bei dem ich die Benutzung von WiFiClientSecureBearSSL (auch für 2.4.2) erzwungen habe:
Code:
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>

const char* ssid = ".....";
const char* password = "........";

const char* host = "jigsaw.w3.org";
const int httpsPort = 443;

// SHA1 fingerprint of the certificate
const uint8_t fingerprint[20] = {0x5A, 0xCF, 0xFE, 0xF0, 0xF1, 0xA6, 0xF4, 0x5F, 0xD2, 0x11, 0x11, 0xC6, 0x1D, 0x2F, 0x0E, 0xBC, 0x39, 0x8D, 0x50, 0xE0};

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.print("connecting to ");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  // Use WiFiClientSecure class to create TLS connection
  WiFiClientSecure client;
  /****************************************************/
  // eine der beiden Funktionen muss aktiviert sein, sonst kein Connect
  client.setInsecure();
  // client.setFingerprint(fingerprint);
  /****************************************************/
  Serial.print("connecting to ");
  Serial.println(host);
  if (!client.connect(host, httpsPort)) {
    Serial.println("connection failed");
    return;
  }
  else Serial.println("connection ok");

  String url = "/HTTP/connection.html";
  Serial.print("requesting URL: ");
  Serial.println(url);

  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "User-Agent: BuildFailureDetectorESP8266\r\n" +
               "Connection: close\r\n\r\n");

  Serial.println("request sent");
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      Serial.println("headers received");
      break;
    }
    while (client.available()) {
      String line = client.readStringUntil('\n');
      Serial.println(line);
    }
  }
  Serial.println("==========");
  Serial.println("closing connection");
}

void loop() {}

Ich hoffe ich konnte Euch mit diesen grundlegenden Infos helfen, HTTPS-Clientverbindungen aufzubauen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.12.2018, 16:56
Beitrag #2
RE: HTTPS - Client-Verbindungen
Danke für die für die Info, werde ich mir am Rechner noch mal genauer ansehen.

Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  FTP client kann keine Daten empfangen I-Azubi 2 554 10.05.2019 08:53
Letzter Beitrag: Fips
  [gelöst] NTP Client Beispiele gehen 2 Sekunden nach Markus N. 10 1.325 05.05.2019 11:24
Letzter Beitrag: Markus N.
  https Problem mit dem ESP Gandalf 3 659 25.04.2019 23:11
Letzter Beitrag: Tommy56
  NodeMCU12E mit UDP Client & UDP Server & Webserver rkuehle 6 3.711 10.02.2019 20:52
Letzter Beitrag: Tommy56
  Kein client.connected() durch direkte WiFi Verbindung zwei ESP8266MOD (Wemos D1 R1) n88 4 2.256 25.02.2018 14:57
Letzter Beitrag: n88
  [Info] GPIO-Pins sind HIGH bei Boot und Sketch-Upload Tommy56 0 1.079 27.06.2017 21:09
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste