From 5d879bcb7a6cb80296a2d987ac339471c631a6ec Mon Sep 17 00:00:00 2001 From: gilex-dev Date: Wed, 8 Oct 2025 21:52:44 +0200 Subject: [PATCH] Load SSL certificate from file, add file loading for http server --- lib/WiFiManager/src/WiFiManager.cpp | 5 ++ src/main.cpp | 111 +++++++++++++++++++++------- 2 files changed, 90 insertions(+), 26 deletions(-) diff --git a/lib/WiFiManager/src/WiFiManager.cpp b/lib/WiFiManager/src/WiFiManager.cpp index 12f1508..9d6d232 100644 --- a/lib/WiFiManager/src/WiFiManager.cpp +++ b/lib/WiFiManager/src/WiFiManager.cpp @@ -143,6 +143,9 @@ void getScanResults(int count) { for (int i = 0; i < count; i++) { #ifdef ESP32 networks.at(i) = (bss_info *)WiFiScanClass::getScanInfoByIndex(i); + // networks.at(i) = new bss_info; + // networks.at(i)->ssid = (uint8_t[33])WiFi.SSID(i).c_str(); + // strncpy(networks.at(i)->ssid, (uint8_t *)(WiFi.SSID(i).c_str()), sizeof(bss_info::ssid)); #elif defined(ESP8266) networks.at(i) = WiFi.getScanInfoByIndex(i); #endif @@ -189,6 +192,7 @@ void getScanResults(int count) { } void getScanResultsESP32(WiFiEvent_t event, WiFiEventInfo_t info) { + // Serial.println(info.wifi_scan_done.status); getScanResults(WiFi.scanComplete()); // assume scan always completed since we are in scan complete CB } @@ -242,6 +246,7 @@ bool WiFiManager::loadFromJson(File file) { setupAP = doc["SetupAP"].as(); for (JsonVariant i : doc["WiFiSta"].as()) { + // Serial.println(i["name"].as() + i["ssid"].as() + i["psk"].as()); Log.noticeln("Name: %s", i["name"].as().c_str()); Log.noticeln("SSID: %s", i["ssid"].as().c_str()); Log.noticeln("PSK: %s", i["psk"].as().c_str()); diff --git a/src/main.cpp b/src/main.cpp index 4ef216a..a0d8bd7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,6 +2,8 @@ #include "logger/logger.h" #include #include +#include +#include #include #include @@ -27,8 +29,12 @@ PsychicHttpServer server; #elif defined(ESP8266) #include +#ifdef HTTP_SERVE_SSL BearSSL::ESP8266WebServerSecure server(443); BearSSL::ServerSessions serverCache(5); +#else +ESP8266WebServer server(80); +FS *fileSystem = &LittleFS; #endif #ifndef SERIAL_BAUD_RATE @@ -39,42 +45,93 @@ uint8_t mac[WL_MAC_ADDR_LENGTH]; WiFiManager manager; +DNSServer dnsServer; + unsigned long currentMillis, oldMillis; void setup() { WiFi.persistent(false); -#ifdef ESP8266 - server.getServer().setRSACert(new BearSSL::X509List(serverCert), new BearSSL::PrivateKey(serverKey)); - - // Cache SSL sessions to accelerate the TLS handshake. - server.getServer().setCache(&serverCache); - - server.on("/", []() { - server.send(200, "text/plain", "Hello from esp8266 over HTTPS!"); - }); - server.begin(); -#elif ESP32 - WiFi.mode(WIFI_MODE_STA); // required by PsychicHttp - server.listen(443, serverCert, serverKey); - server.on("/", [](PsychicRequest *request) { - return request->reply(200, "text/plain", "Hello from esp32 over HTTPS!"); - }); -#endif - - Serial.begin(SERIAL_BAUD_RATE); - Log.setPrefix(printPrefix); - Log.setSuffix(printSuffix); - Log.begin(LOG_LEVEL_VERBOSE, &Serial); - delay(2000); - - Serial.println("Starting up"); - #ifdef ESP32 LittleFS.begin(true); #else LittleFS.begin(); #endif +#ifdef HTTP_SERVE_SSL + File serverCertFile = LittleFS.open("/web/certificate.pem", "r"); // read bytes instead of string + File serverKeyFile = LittleFS.open("/web/private.pem", "r"); // read bytes instead of string +#endif + +#ifdef ESP8266 + +#ifdef HTTP_SERVE_SSL + server.getServer().setRSACert(new BearSSL::X509List(serverCertFile.readString().c_str()), new BearSSL::PrivateKey(serverKeyFile.readString().c_str())); + + // Cache SSL sessions to accelerate the TLS handshake. + server.getServer().setCache(&serverCache); +#endif + + server.on("/", []() { + server.send(200, "text/plain", "Hello from esp8266 over HTTPS!"); + }); + + server.onNotFound([]() { + Log.noticeln("Trying to serve file!"); + String uri = ESP8266WebServer::urlDecode(server.uri()); // required to read paths with blanks + + if (uri.endsWith("/")) { + uri += "index.htm"; + } + + String contentType = mime::getContentType(uri); + + if (!fileSystem->exists(uri)) { + // File not found, try gzip version + uri = uri + ".gz"; + } + if (fileSystem->exists(uri)) { + File file = fileSystem->open(uri, "r"); + if (server.streamFile(file, contentType) != file.size()) { + Log.noticeln("Sent less data than expected!"); + } + file.close(); + return true; + } + + server.send(404, "text/plain", "not found"); + return false; + }); + + server.begin(); +#elif ESP32 + WiFi.mode(WIFI_MODE_STA); // required by PsychicHttp + +#ifdef HTTP_SERVE_SSL + server.listen(443, serverCertFile.readString().c_str(), serverKeyFile.readString().c_str()); +#else + server.listen(80); +#endif + server.on("/", [](PsychicRequest *request) { + return request->reply(200, "text/plain", "Hello from esp32 over HTTPS!"); + }); + + PsychicStaticFileHandler *handler = server.serveStatic("/", LittleFS, "/web/www/"); + handler->setCacheControl("max-age=60"); +#endif +#ifdef HTTP_SERVE_SSL + serverCertFile.close(); + serverKeyFile.close(); +#endif + Serial.begin(SERIAL_BAUD_RATE); + + Log.setPrefix(printPrefix); + Log.setSuffix(printSuffix); + Log.begin(LOG_LEVEL_VERBOSE, &Serial); + delay(2000); + ArduinoOTA.begin(); + + Serial.println("Starting up"); + File file = LittleFS.open("/config/WiFiManager.json", "r"); if (!file) { Serial.println("Failed to open file for reading"); @@ -84,6 +141,8 @@ void setup() { file.close(); } + dnsServer.start(53, "*", WiFi.softAPIP()); + ArduinoOTA.begin(); } void loop() {