Skocz do zawartości

ESP8266 HTTPS serwer instalacja certyfikatu SSL


Sebolas

Pomocna odpowiedź

Witam, 

stworzyłem serwer HTTPS na płytce ESP8266 przy użyciu biblioteki ESP8266WebServerSecure oraz ręcznie wygenerowanego certyfikatu i klucza. Docelowo chciałbym łączyć się z serwerem przy pomocy apki mobilnej. Początkowo był to serwer HTTP, ale najprawdopodobniej Android od którejś wersji już nie zezwala na połączenia z niezabezpieczonym HTTP, wymaga HTTPS. Niestety powyższe rozwiązanie z HTTPS również okazało się niewystarczające, ponieważ certyfikat musi być wydany przez rozpoznawalnego autoryzowanego dystrybutora i apka rzuca błąd: Trust anchor for certification path not found. W związku z tym wykupiłem jakiś najtańszy certyfikat SSL w celu sprawdzenia czy w ten sposób uda się to wreszcie pogodzić, otrzymałem 3 pliki z certyfikatami: certificate.cert, dv_ca.pem, private.pem. Czy ktoś się orientuje jak zainstalować taki certyfikat na płytce ESP8266? 🙄 A może jakieś inne rozwiązanie opisanego problemu komunikacji apki z serwerem? 

Za wszelkie podpowiedzi z góry dziękuję. Poniżej wstawiam swój kod serwera HTTPS z ręcznie generowanym certyfikatem: 

#include <Arduino.h>
#include <ESP8266WebServer.h>
#include <ESP8266WebServerSecure.h>
#include <ESP8266mDNS.h>
#include <ArduinoJson.h>

#define output4 4
#define output5 5
#define input0 A0


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

 //HTTPS server object, port number 443
BearSSL::ESP8266WebServerSecure server(443);

static const char serverCert[] PROGMEM = R"EOF(
-----BEGIN CERTIFICATE-----

-----END CERTIFICATE-----

)EOF";

static const char serverKey[] PROGMEM =  R"EOF(
-----BEGIN PRIVATE KEY-----

-----END PRIVATE KEY-----

)EOF";

void handleNotFound() { 
   String message = "No such a data or incorrect request...";
   server.send(404, "text/plain", message);
}

void changeStatus(){
    //Parsing request argument to string
  String postBody = server.arg("plain");
    //Changing output value condition
  if(server.hasArg("number")&&server.hasArg("status")){
    int pinNumber = server.arg("number").toInt();
    if(server.arg("status")=="on"){
      digitalWrite(pinNumber, HIGH);
    } else if(server.arg("status")=="off"){
      digitalWrite(pinNumber, LOW);
    } 
  } else {
      handleNotFound();
    }
  Serial.println("Argument: "+postBody);
  server.send(200, "text/plain", postBody); 
}
 
void getStatus(){
    //Creating json document
  DynamicJsonDocument doc(200);
    //Pushing data to json document
  if(digitalRead(output4)==LOW){
    JsonObject out4 = doc.createNestedObject("sensor 4");
    out4["name"] = "output4";
    out4["value"] = 0;
  } else {
    JsonObject out4 = doc.createNestedObject("sensor 4");
    out4["name"] = "output4";
    out4["value"] = 1;
  }
  if(digitalRead(output5)==LOW){
    JsonObject out5 = doc.createNestedObject("sensor 5");
    out5["name"] = "output5";
    out5["value"] = 0;
  } else {
    JsonObject out5 = doc.createNestedObject("sensor 5");
    out5["name"] = "output5";
    out5["value"] = 1;
  }
    //Getting analog input value
    JsonObject in0 = doc.createNestedObject("sensor 0");
    in0["name"] = "input0";
    in0["value"] = analogRead(A0);
    //Variable co
   String outputData = "";
   serializeJsonPretty(doc, outputData);
   server.send(200, "application/json", outputData);
}

void setup() {
  // put your setup code here, to run once:
 
  Serial.begin(115200);
  // Initialize the output variables as outputs
  pinMode(output5, OUTPUT);
  pinMode(output4, OUTPUT);
  // Set outputs to LOW
  digitalWrite(output5, LOW);
  digitalWrite(output4, LOW);

  //Get current time
  configTime(3 * 3600, 0, "pool.ntp.org", "time.nist.gov");
  //Start wifi connection
  WiFi.begin(ssid, password);
  delay(100);
  Serial.println("Trying to connect wifi network");
  while(WiFi.status() != WL_CONNECTED){
    Serial.print(".");
    delay(500);
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(WiFi.SSID());
  Serial.print("IP adress: ");
  Serial.println(WiFi.localIP());
 //Handling requests
  server.on("/", HTTP_GET, getStatus);
  server.on("/led", HTTP_GET, changeStatus);
  //Setting server certificate and key
  server.getServer().setRSACert(new BearSSL::X509List(serverCert), new BearSSL::PrivateKey(serverKey));
  // Start server
  server.begin();
  Serial.println("Secured server ready");
}

void loop() {
  // put your main code here, to run repeatedly:
  // Handling incoming client requests in loop
   server.handleClient();
  
}

 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.