ESP8266 + HTTPS + FirtzBox 7490 - funktioniert nicht?

Hallo Leute,

ich stehe gerade auf dem Schlauch, vielleicht kann mich jemand von euch runter schubsen?!

Bei der Umsetzung von diesem Projekt habe ich Schwierigkeiten mit der Verbindung zum Host.

Als Hardware habe ich einen NodeMCU mit ESP8266. Die Verbindung zum Internet stellt eine Fritzbox 7490 her. Dem ESP habe ich in den Fritzbox-Einstellungen Rechte zur "Selbstsändigen Portfreigabe" gegeben. Der Internetzugriff über HTTPS auf die Fritzbox ist aus und der TCP-Port für HTTPS auf 443 gestellt. Das müsste der Standart-Port sein?!

Die WiFi-Verbindung zwischen Fritzbox und ESP kommt problemlos zu stande. Die Verbindung zum Host, in diesem Fall facebook.com, scheitert.

(Probiere ich den Beispiel-Sketch ESP8266WiFi-HTTPSRequest habe ich das gleiche Problem. Verbindung zur Fritzbox klappt, die Verbindung zu github.com funktioniert aber nicht.)

#include <ESP8266WiFi.h> 
#include <WiFiClientSecure.h> 
#include <SevenSegmentTM1637.h>
#include <ArduinoJson.h> 
// Wifi 
const char* ssid = "*****"; 
const char* password = "*************"; 
// Facebook 
// https://github.com/gbrault/esp8266-Arduino/blob/master/doc/esp8266wifi/client-secure-examples.md 
const char* host = "graph.facebook.com"; 
const String url = "/*************?access_token=***********|*******************&fields=fan_count"; 
const int httpsPort = 443; 
const char* fingerprint = "74:13:76:77:B8:BF:CA:95:73:DE:04:5A:48:AF:7A:6B:E1:A1:C0:F3"; 

// Display https://github.com/bremme/arduino-tm1637 
const byte PIN_CLK = D3;   // define CLK pin (any digital pin) 
const byte PIN_DIO = D4;   // define DIO pin (any digital pin) 
String payload; 
SevenSegmentTM1637 display(PIN_CLK, PIN_DIO); 
void setup() { 
 Serial.begin(9600); 
 // Wifi 
 WiFi.begin(ssid, password); 
 Serial.println(); 
 Serial.print("Connecting "); 
 while (WiFi.status() != WL_CONNECTED) { 
   delay(500); 
   Serial.print("."); 
   // display.print("CONNECTING"); 
 } 
 Serial.println(); 
 Serial.print("Connected, IP address: "); 
 Serial.println(WiFi.localIP()); 
 // Display   
 // display.begin();            // initializes the display 
 // display.setBacklight(100);  // set the brightness to 100 % 
 // display.print("START"); 
} 
void loop() { 
 String wifistatus = "WIFI OK"; 
 // Use WiFiClientSecure class to create TLS connection 
 WiFiClientSecure client; 
 if (!client.connect(host, httpsPort)) { 
   String wifistatus = "WIFI FAIL"; 
   Serial.println("connection failed"); 
   return; 
 } 
 // display.print(wifistatus); 
 if (client.verify(fingerprint, host)) { 
   Serial.println("certificate matches"); 
 } else { 
   Serial.println("certificate doesn't match"); 
   Serial.println(fingerprint); 
 } 
 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; 
   } 
 } 
 // JSON 
 String line = client.readStringUntil('\n'); 
 DynamicJsonBuffer jsonBuffer; 
 JsonObject& root = jsonBuffer.parseObject(line); 
 int fancount = root[String("fan_count")]; 
 if (fancount > 0) { 
   Serial.print("Fans: "); 
   Serial.println(fancount); 
   // display.clear(); 
   // display.print(fancount); 
 } else { 
   // display.clear(); 
   // display.print("ERR1"); 
   // display.blink(); 
 } 
 delay(30000); 
}

Die Display-Befehle habe ich raus genommen, da aktuell kein Display angeschlossen ist.

Der Serial-Monitor spuckt folgendes aus:

Connecting ..
Connected, IP address: 192.168.188.62
certificate doesn't match
74:13:76:77:B8:BF:CA:95:73:DE:04:5A:48:AF:7A:6B:E1:A1:C0:F3
request sent
headers received
certificate doesn't match
74:13:76:77:B8:BF:CA:95:73:DE:04:5A:48:AF:7A:6B:E1:A1:C0:F3
request sent
headers received
certificate doesn't match
74:13:76:77:B8:BF:CA:95:73:DE:04:5A:48:AF:7A:6B:E1:A1:C0:F3

etc...

Den Fingerprint habe ich auch schon in unterschiedlichen Schreibweisen (groß, klein, zusammen, ohne :slight_smile: probiert, ohne Erfolg.

Für Hinweise bin ich dankbar! Liegt es an der Fritzbox? Oder doch an mir? Oder... :confused:

viele Grüße
Michel

Dann lass doch den Fingerprint einfach weg.

Gruß Fips

Danke für die flotte Antwort.

Ich hab den Eindruck die Verbindung zu Facebook oder im Beispiel-Sketch zu Github kommt gar nicht erst zustande. Er zeigt ja auch "certificate doesn't match" an, wenn er keinen Fingerprint zum Verlgeich hat. Oder?

Grüße
Michel

Michel104:
Dem ESP habe ich in den Fritzbox-Einstellungen Rechte zur "Selbstsändigen Portfreigabe" gegeben.

Das braucht er nicht, wenn er eine Verbindung nach Außen aufmachen will.

Michel104:
Der Internetzugriff über HTTPS auf die Fritzbox ist aus

Das verstehe ich nicht.

Welche Version der ESP8266-Software hast Du?

Schreibe mal ein paar Serial.print rein, denn Du bekommst Antwort vom Server:

 while (client.connected()) {
   String line = client.readStringUntil('\n');
   Serial.print(line);
   if (line == "\r") {
     Serial.println("headers received");  // <---- Diese Ausgabe kam
     break;
   }
 }
 // JSON
 String line = client.readStringUntil('\n'); 
 Serial.print(line);
...

Der Fingerprint stimmt.

Gruß Tommy

Der Port für https wird von der FritzBox umgestellt, wenn man sie für Zugriffe von außen / aus dem Internet freigeben will (z.B. für FTP). Daher mein Hinweis, dass der Internetzugriff aus ist.

Ich verwende die esp8266 by ESP8266 Community Version 2.2.0. In der aktuellen Version 2.5.0 habe ich Probleme, den Sketch zu übertragen.

Grüße
Michel

Version 2.4.2 sollte der bessere Weg sein. Ich habe keine Probleme mit dem HTTPS-Zugriff.

Was sagen die print-Ausgaben?

Gruß Tommy

Tommy56:
Was sagen die print-Ausgaben?

Was genau soll ausgegeben werden?

Es ist auch gut möglich, dass es nicht klappt wegen fehlender Rechte bei der Facebook-App. Das ist allerdings so nervig, dass ich vermutlich lieber das Projekt einstelle anstatt mich weiter mit FB auseinader zu setzen...

Sorry, ich war noch nicht ganz wach. :astonished:

Es ist aber, wie ich vorhin geschrieben habe. Ich bekomme eine Antwort vom Server, die aber wegen fehlender Berichtigung in Facebook abgeleht wird. Hier ein Auszug aus der Rückmeldung vom Server:

HTTP/1.1 400 Bad Request
Vary: Accept-Encoding
x-app-usage: {"call_count":0,"total_cputime":0,"total_time":0}
WWW-Authenticate: OAuth "Facebook Platform" "invalid_request" "(#10) To use 'Page Public Content Access', your use of this endpoint must be reviewed and approved by Facebook. To submit this 'Page Public Content Access' feature for review please read our documentation on reviewable features: https://developers.facebook.com/docs/apps/review."
Content-Type: text/javascript; charset=UTF-8
facebook-api-version: v3.2
Strict-Transport-Security: max-age=15552000; preload
Pragma: no-cache
.....
Date: Thu, 21 Mar 2019 16:47:14 GMT
Transfer-Encoding: chunked
Connection: close

Falls zufällig jemand Ahnung von Facebook-API hat, wäre ich natürlich dankbar für einen Tipp, aber:
Von mir aus kann der Beitrag geschlossen werden, das Problem aus dem Titel besteht nicht.