Ich habe mir die Aufgabe gestellt die google tabellen (sheets) mit dem ESP32 mit Daten zu füllen. Das erste Problem war die Verbindung zu HTTPS, es hat nicht geklappt das richtige Zertifikat zu bekommen. Ich habe versucht das Beispiel WiFiClientSecure ESP32 für die Verbindung mit script.google.com zu verwenden. Die erste Erkenntnis war dass, die Kommunikation auch ohne Zertifikat Überprüfung funktioniert. Einfach folgende Zeile auskommentieren.
client.setCACert(test_root_ca);
Nach mehreren Stunden Recherche und Versuche hat es auch mit Zertifikat Überprüfung funktioniert. So bekommen Sie das root_ca Zertifikat über Firefox.
Öffnen Sie Die Seite script.google.com.
Navigieren Sie zum Menü Browsers zum Extras / Seiteninformationen.
In erschienen Fenster wechseln Sie zum Reiter Sicherheit / Zertifikat Anzeigen.
Wählen Sie das GlobalSignRootCA-R2 aus und betätigen Sie das Button Exportieren.
Es wird eine Datei erzeugt.
GlobalSignRootCA-R2.cr
Danach öffnen Sie die Datei mit einem Texteditor und kopieren den kompletten Inhalt in den Sketsch. Bitte fügen Sie den Inhalt der Zwischenablage zwischen diesen beiden Zeilen.
const char test_root_ca[] PROGMEM = R“=====(
)=====“ ;
Diese Schreibweise der konstanten Daten erspart das einfügen vom „“ und /n Zeichen n jede Zeile.
Sie können gern das Root-CA Zertifikat für Google auch von hier übernehmen, der ist bis Ende 2021 gültig.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
#include <WiFiClientSecure.h> const char* ssid = "IhrWlan"; const char* password = "Passwort"; const char root_ca[] PROGMEM = R"=====( -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG 3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO 291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- )=====" ; WiFiClientSecure client; void setup() { Serial.begin(115200); Serial.println("Warte auf Verbindung"); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("IP Addresse: "); Serial.println(WiFi.localIP()); client.setCACert(root_ca); // Setze Google Fingerprint Serial.println("\nVerbinde mit dem server..."); if (!client.connect("support.google.com", 443)) // Starte SSL Verbindung { Serial.println("Nicht verbunden!"); } else { Serial.println("Verbunden!"); client.println("GET https://support.google.com/"); // Bilde GET Anfrage über HTTPS client.println("Host: support.google.com"); client.println("Connection: close"); client.println(); while (client.connected()) // Empfange Header { String line = client.readStringUntil('\n'); // Serial.println(line); if (line == "\r") { // Serial.println("headers received"); break; } } int lenge=0; while (client.connected()) // Empfange Webseite { while(client.available()) // Solange Puffer daten Enthält { char c = client.read(); lenge++; if(lenge<1000)Serial.write(c); if(lenge>342000)Serial.write(c); } } Serial.println(""); Serial.println(String(lenge)+" Byte empfangen"); client.stop(); } } void loop() { } |
In diesem Arduino Beispiel Sketch empfange ich die Google Webseite https://support.google.com/
Weil diese Webseite 342KB groß ist, kann die nicht im Terminal angezeigt werden. ESP32 kann die Seite komplett empfangen, aber nicht rechtzeitig über Serielle Schnittstelle ausgeben. Deswegen werden hier nur erste 1000 und letzte 256 Zeichen ausgegeben.
Das schreiben in das Google Tabellen klappt bereits. Ich werde bald ein tutorial darüber schreiben.
Es wäre auch interessant die Zertifikat Datei „GlobalSignRootCA-R2.cr“ in Spiffs abzulegen und von da aus zu Lesen. Dass hätte ermöglicht bei dem Ablauf des Zertifikates, den neue Fingerprint, ohne das Programm neu zu kompilieren, leicht zu installieren.