Sorry für das letzte Posting. Habe das jetzt erst mit den Beispielen verstanden.
Teste gerade alles aus und melde mich morgen.
Sorry für das letzte Posting. Habe das jetzt erst mit den Beispielen verstanden.
Teste gerade alles aus und melde mich morgen.
Hier nun die vier Ausgaben.
Bild 1: BasicHttpclient unverändert
Bild 2: BasicHttpclient mit angepassert URl
Bild 3: BasicHTTPSClient unverändert
Bild 4: BasicHTTPSclient mit angepassert URl
Infos dazu:
Ich habe die nachfolgend Zeilen im BasicHTTPclient so geändert:
Serial.print("[HTTP] begin...\n");
if (http.begin(client, "http://meinedomain.de/iot/entry.php")) { // HTTP
bzw. auf
http://meinedomain.de/iot/entry.php?board=0&uptime=42&adc=1&pin1=1&pin2=2
und bei dem BasicHTTPSClient entsprechend auf:
https://meinedomain.de/iot/entry.php
bzw.auf:
https://meinedomain.de/iot/entry.php?board=0&uptime=42&adc=1&pin1=1&pin2=2
Ich hoffe, dass waren die richtigen Stellen. Ich möchte nochmals erwähnen, dass das für mich alles Neuland ist, und dass ich mich wahrscheinlich dadurch sehr anfängerhaft verhalte. Aber ... ich will das hinkriegen. Dabei ist noch zu erwähnen, dass http://-Anfragen durch meinen Webserver automatisch auf https:// umgeleitet werden.
die ersten beiden Screenshots zeigen, dass dein Webspace von http auf https umleiten will.
warum der 3te Screenshot nicht erfolgreich ist, ist eigenartig. Ich hätte erwartet dass der originale https Skech funktioniert.
Das sollte eigentlich der Fingerprint im Sketch zum Url im Sketch passen. Muss ich morgen gegentesten warum das nicht geht.
Im vierten Screenshot wäre es mir klar, denn dein eigener Url passt nicht zum Fingerprint aus dem Sketch.
Was du nun machen müsstest:
zwei weitere Versuche mit BasicHTTPSClient
kommentiere die Zeile 17 aus:
// Fingerprint for demo URL, expires on June 2, 2021, needs to be updated well before this date
//const uint8_t fingerprint[20] = {0x40, 0xaf, 0x00, 0x6b, 0xec, 0x90, 0x22, 0x41, 0x8e, 0xa3, 0xad, 0xfa, 0x1a, 0xe8, 0x25, 0x41, 0x1d, 0x1a, 0x54, 0xb3};
damit sollte eigentlich die Prüfung ausgeschaltet werden, ich weis aber nicht ob dein webspace das akzeptiert.
sechster Versuch: aktiviere wieder diese Zeile aber ersetze die Daten mit dem SHA256 Fingerprint vom Zertifikat deines Webservers.
nach diesen Versuchen kannst du auch mal hier nachlesen, ob das für dich verständlich ist:
und als 7. Variante client.setInsecure(); probieren.
Schaut jetzt alles nach gebastel aus, daher ist das Schrittweise vorgehen notwendig.
Hi,
weiter geht es.
Das auskommentieren der Zeile 17 brachte keinen Erfolg. Weder bei der kompletten URL noch der angepassten URL. "Connected fail".
Zeile wieder aktiviert und den SHA256 Fingerprint eingetragen. Wobei der Fingerprint den ich eingetragen habe, doch wohl einen anderen Uni-Code hat, oder sehe ich das falsch. Also mein Fingerprint ist in Kolonnen mit zwei Zahlen oder Zahl mit Buchstabe aufgebaut. Das Ergebnis mit Fehlermeldung siehst Du im ersten Bild.
Bin dann im zweiten Schritt hingegangen und habe die Zeile komplett gelöscht und mit den beiden Zeilen aus der Anleitung von HTTPS requests to any URL using the ESP8266 - Maakbaas ersetzt. Natürlich den Inhalt auf meine Domain und Fingerprint geändert. Hat leider auch nicht funktioniert. Die Fehlermeldung siehst Du im zweiten Bild.
Bei der von Dir 7. Variante musste ich passen. Was genau soll ich da ausprobieren. Wird client.setInsecure(); einfach eingefügt, oder an einer bestimmten Stelle und was muss da noch geändert werden?
Irgendwie sieht Dein Fingerprint komisch aus.
Meiner hat diese Form:
const char* fingerprint = "CF:F5:E0:00:1D:76:D5:AF:4B:DA:32:B5:FF:C3:67:8D:8A:6E:D5:22";
Gruß Tommy
Mhhhh? Also ich habe mir den aus Safari kopiert. Kann es sein, dass da die Doppelpunkte nicht angezeigt werden und natürlich müssen dann noch die Leerstellen vor und hinter den Doppelpunkten entfernt werden?
Aber was bedeutet das für mich, selbst wenn es so ist?
Wie sollte dann Zeile 17 aussehen?
Und mal nee ganz doofe Frage, off topic. Wie kriege ich es hin, dass ich über neue Antworten per Mail informiert werde?
Ich habe es mit diesem Fingerprint mal vor längerer Zeit (ca. 1 Jahr) zum Laufen bekommen (aus Firefox kopiert).
Seither habe ich es nicht wieder getestet.
Die Benachrichtigungsfunktion vom Chat soll nicht wirklich funktionieren.
Gruß Tommy
also ich würde mich da ganz genau ans Beispiel halten
const uint8_t fingerprint[20] = {0x18, 0x85, 0x41
Ich habe mal etwas im Code von WiFiClientSecureBearSSL.cpp (Zeile 585 ff) gestöbert.
Der Fingerprint für setFingerprint muss im PROGMEM stehen! Blank und : werden überlesen.
Gruß Tommy
Edit:
// Use web browser to view and copy
// SHA1 fingerprint of the certificate
const char fingerprint[] PROGMEM = "5F:F1:60:31:09:04:3E:F2:90:D2:B0:8A:50:38:04:E8:37:9F:BC:76";
// oder
const char fingerprint[] PROGMEM = "5F F1 60 31 09 04 3E F2 90 D2 B0 8A 50 38 04 E8 37 9F BC 76";
// oder
const char fingerprint[] PROGMEM = "5FF1603109043EF290D2B08A503804E8379FBC76";
Jeweils auf Deinen Server angepasst
noiasca:
also ich würde mich da ganz genau ans Beispiel haltenconst uint8_t fingerprint[20] = {0x18, 0x85, 0x41
Was heißt das für mich? Bei mir gibt es, wenn ich mir den Fingerprint über Safari anschaue nicht mit der Kombination ZahlxZahlZahl, sondern lediglich ZahlBuchstabe, BuchstabeZahl, ZahlZahl und BuchstabeBuchstabe
Habe mir gerade mal den Fingerprint in Firefox angeschaut. Da sieht der Aufbau genau so aus, wie Tommy in gepostet hat. Also ganz genau so, wie ich in eingetragen habe. Nur mit Doppelpunkten und vor und nach den Doppelpunkten ohne Leerstellen.
Soll ich die Zeile 17 mal so eingeben wie Tommy es vor gibt, also:
const char fingerprint[] PROGMEM = "5F:F1:60:31:09:04:3E:F2:90:D2:B0:8A:50:38:04:E8:37:9F:BC:76";
und das mit meinem Fingerprint ohne Leerstellen und überall den Doppelpunkten?
Du könntest auch meinen Beitrag #28 lesen.
Gruß Tommy
Bist mir bitte nicht böse, aber der edit-Beitrag dort mit dem Code, war bis vor zwei Minuten noch nicht zu lesen.
Heist den Code passe ich auf meinen Fingerprint an, lösche Zeile 17 und setze dort die neuen Zeilen ein?
Wichtig: PROGMEM nicht vergessen!
Gruß Tommy
Yes!
Aber nur zur Sicherheit ... ich würde jetzt eigentlich die Zeile (wahrscheinlich 17) löschen.
Also die Zeile mit:
const uint8_t fingerprint ....
und dann mit Deinen angepassten Zeilen dort einfügen. Korrekt?
Ja, aber mit Deinem Fingerprint. Eigentlich brauchst Du ja nur das davor autauschen.
Gruß Tommy
Mist, funktioniert immer noch nicht. Mit allen drei Varianten des Fingerprints nicht. Kommt immer "Connecting failed".
Habe mal von Code des letzten Versuches, also dem Versuch wo der Fingerprint ohne Doppelpunkt und ohne Leerstellen eingetragen ist, hier rein gepostet. Habe das Ganze immer ohne
const char* host = "https://********
eingetragen.
Überall wo Sternchen sind, stehen natürlich "live" reale Daten.
/**
BasicHTTPSClient.ino
Created on: 20.08.2018
*/
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>
// Fingerprint for demo URL, expires on June 2, 2021, needs to be updated well before this date
const char fingerprint[] PROGMEM = "**************************************************************";
ESP8266WiFiMulti WiFiMulti;
void setup() {
Serial.begin(115200);
// Serial.setDebugOutput(true);
Serial.println();
Serial.println();
Serial.println();
for (uint8_t t = 4; t > 0; t--) {
Serial.printf("[SETUP] WAIT %d...\n", t);
Serial.flush();
delay(1000);
}
WiFi.mode(WIFI_STA);
WiFiMulti.addAP("************", "**********");
}
void loop() {
// wait for WiFi connection
if ((WiFiMulti.run() == WL_CONNECTED)) {
std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);
client->setFingerprint(fingerprint);
HTTPClient https;
Serial.print("[HTTPS] begin...\n");
if (https.begin(*client, "https://*************/iot/entry.php")) { // HTTPS
Serial.print("[HTTPS] GET...\n");
// start connection and send HTTP header
int httpCode = https.GET();
// httpCode will be negative on error
if (httpCode > 0) {
// HTTP header has been send and Server response header has been handled
Serial.printf("[HTTPS] GET... code: %d\n", httpCode);
// file found at server
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
String payload = https.getString();
Serial.println(payload);
}
} else {
Serial.printf("[HTTPS] GET... failed, error: %s\n", https.errorToString(httpCode).c_str());
}
https.end();
} else {
Serial.printf("[HTTPS] Unable to connect\n");
}
}
Serial.println("Wait 10s before next round...");
delay(10000);
}
Ersetze mal testweise das setFingerprint durch setInsecure(). Dann wird kein Check der Serveridentität durchgeführt. Wenn das auch nicht funktioniert, liegt der Fehler wo anders.
Gruß Tommy
Nur zur Sicherheit.
Meinst Du Zeile 48, also:
client->setFingerprint(fingerprint);
in
client->setInsecure(fingerprint);
???
Und dann wahrscheinlich wieder alle drei Fingerprintvarianten testen, richtig? Oder interessiert in diesem Fall der Fingerprint gar nicht, denn wenn ich Dich ja richtig verstanden haben, soll es den Check der Serveridentität verhindern.
Nein, client.setInsecure() ohne fingerprint.
Hier ist mal ein aktuell funktionierender Code. Du kannst ihn zum Testen benutzen, das ist mein Server. Ich werde das Script morgen auf dem Server wieder löschen.
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
const char* ssid = "SSID";
const char* password = "geheim";
const char* host = "www.wikinger-tommy.de";
const int httpsPort = 443;
// Use web browser to view and copy
// SHA1 fingerprint of the certificate
const char* fingerprint PROGMEM = "99:CC:CB:15:A2:7E:69:C7:FE:3B:93:66:BA:0D:F7:68:F1:B7:EA:38";
void setup() {
Serial.begin(115200);
Serial.println();
Serial.print("connecting to ");
Serial.println(ssid);
WiFi.disconnect();
WiFi.persistent(false);
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;
Serial.print("connecting to ");
Serial.println(host);
Serial.printf("Using fingerprint '%s'\n", fingerprint);
client.setFingerprint(fingerprint);
if (!client.connect(host, httpsPort)) {
Serial.println("connection failed");
return;
}
Serial.println("connected");
String url = "/wetter/insert.php";
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() && client.available()) {
String line = client.readStringUntil('\n');
Serial.println(line);
if (line == "\r") {
Serial.println("headers received");
break;
}
}
while (client.connected() && client.available()) {
String line = client.readStringUntil('\n');
Serial.println(line);
if (line.startsWith("STATUS")) {
if (line.indexOf("OK")) Serial.println("Insert successfull!");
else if (line.indexOf("ERROR")) Serial.println("Insert failed");
}
}
}
void loop() {
}
Gruß Tommy
Also, wieder einen Schritt weiter. Endlich ein Connect zur Seite. Allerdings kommt es dann am Ende der Ausführung noch zu einer Fehlermeldung. Da steht:
NOK; valid=0; data not valid
Komisch war die Sache mit dem Fingerprint. Ich arbeite hier an einem Mac. Dort habe ich mir über Safari, Firefox und Chrome den SHA-256 Fingerabdruck rausgesucht. Überall fängt er mit 18 an dann mit einer Leerstelle und dann immer weitere zweier Kolonnen. Habe ihn dann aber nach Deiner Vorlage mit 18: und dann die anderen zweier Kolonnen immer getrennt mit einem Doppelpunkt eingetragen. Kein Connect möglich. Mein Bruder hat dann über seinen Windows-Rechner und Chrome geschaut und dort fing der Fingerprint warum auch immer mit 5022c usw. an. Habe den dann eingetragen und es ging.
Wie geht es denn jetzt weiter?
Hier einmal der Screenshot: