INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
HTTP GET request mit ServerCertificateValidation & SecurityProtocol verwenden
05.11.2020, 12:07
Beitrag #1
HTTP GET request mit ServerCertificateValidation & SecurityProtocol verwenden
Hallo zusammen,

mit Hilfe von https://randomnerdtutorials.com/esp8266-...t-arduino/ habe ich einen Arduino-Sketch erstellt, der einen HTTP GET request an einen WebService sendet, welcher derzeit auf einem Server läuft:

Code:
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>

const char* ssid = "MyWiFiName";
const char* password = "MyWifiPassword";

//My Domain name with URL path or IP address with path
String serverName = "http://192.168.200.123:55558/api/DBGeraetestatus";

// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastTime = 0;
// Timer set to 10 minutes (600000)
unsigned long timerDelay = 600000;
// Set timer to 5 seconds (5000)
//unsigned long timerDelay = 5000;

void setup() {
  Serial.begin(115200);

  WiFi.begin(ssid, password);
  Serial.println("Connecting");
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());

  Serial.println("Timer set to 5 seconds (timerDelay variable), it will take 5 seconds before publishing the first reading.");
}

void loop() {
  //Send an HTTP POST request every 10 minutes
  if ((millis() - lastTime) > timerDelay) {
    //Check WiFi connection status
    if(WiFi.status()== WL_CONNECTED){
      HTTPClient http;

      String serverPath = serverName + "?filter=ipadresse&value=192.168.200.244";
      
      // My Domain name with URL path or IP address with path
      http.begin(serverPath.c_str());
      
      // Send HTTP GET request
      int httpResponseCode = http.GET();
      
      if (httpResponseCode>0) {
        Serial.print("HTTP Response code: ");
        Serial.println(httpResponseCode);
        String payload = http.getString();
        Serial.println(payload);
      }
      else {
        Serial.print("Error code: ");
        Serial.println(httpResponseCode);
      }
      // Free resources
      http.end();
    }
    else {
      Serial.println("WiFi Disconnected");
    }
    lastTime = millis();
  }
}

Als Antwort kommt ein JSON mit einem 4-stelligen PIN rüber.

Der WebService auf dem Server sendet seinerseits einen weiteren HTTP GET request an eine spezielle Maschine, fügt aber zusätzlich noch NetworkCredentials (Name+Passwort) an, setzt den ServerCertificateValidationCallback und legt das SecurityProtocol fest, das von den vom ServicePointManager-Objekt verwalteten ServicePoint-Objekten verwendet werden soll:

Code:
private string getPinFromWebservice(string ip)
{
    Uri.TryCreate(string.Format(Constants.generatePinPath, ip), UriKind.Absolute, out requestUri);

    var request = HttpWebRequest.Create(requestUri);
    request.ContentType = "application/json";
    request.Method = "GET";

    NetworkCredential nc = new NetworkCredential("MyNetworkCredentialName", "MyNetworkCredentialPassword");
    CredentialCache cache = new CredentialCache();
    cache.Add(requestUri, "Basic", nc);
    cache.Add(requestUri, "NTLM", nc);
    request.Credentials = cache;

    ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
    {
        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
        {
            var json = reader.ReadToEnd();
            return System.Text.RegularExpressions.Regex.Replace(json, @"[^0-9]", "").ToString();
        }
    }
}

Durch Recherche habe ich herausgefunden, dass
Code:
http.setAuthorization(user, password);

Basic-Authentifikation hinzufügt und der HttpClient theoretisch https handeln kann, aber
Code:
begin();
dafür eventuell ein Zertifikat als Parameter benötigen könnte. (Quelle: https://github.com/esp8266/Arduino/blob/...ent.h#L153). Ist es möglich, den ServerCertificateValidationCallback und das SecurityProtocol in Arduino/C ebenfalls zu setzen? Also kann man den unteren C#-Code irgendwie übersetzen, sodass er auf meinem ESP8266 läuft und die HTTP GET requests mit https und angefügten NetworkCredentials ausführt? Also dass man den Server theoretisch überspringen und die requests vom Arduino direkt an die Maschine (und nicht an/über den Server) senden kann?

Freue mich über jede Antwort. Vielen Dank im Vorraus für sämtliche Hilfe.

Liebe Grüße
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.11.2020, 12:13
Beitrag #2
RE: HTTP GET request mit ServerCertificateValidation & SecurityProtocol verwenden
In welchem Forum möchtest Du nun die Antworten haben?

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.11.2020, 14:21 (Dieser Beitrag wurde zuletzt bearbeitet: 05.11.2020 14:27 von TBMSam.)
Beitrag #3
RE: HTTP GET request mit ServerCertificateValidation & SecurityProtocol verwenden
(05.11.2020 12:13)Tommy56 schrieb:  In welchem Forum möchtest Du nun die Antworten haben?

Gruß Tommy

Hallo @Tommy56 und vielen Dank für deine Rückfrage.

Prinzipiell ist mir egal wo ich die Antworten bekomme, hauptsache ich bekomme irgendwo überhaupt eine adäquate Antwort^^

Liebe Grüße
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.11.2020, 14:33
Beitrag #4
RE: HTTP GET request mit ServerCertificateValidation & SecurityProtocol verwenden
Einer der Nachteile von Crossposting ist, dass dann evtl. in beiden Foren gedacht wird, das andere Forum wird die Frage schon beantworten.
Den HTTPS-Request findest Du in den Beispielen zu Deinem ESP.
Falls Du mit Credentials Username und Passwort meinst, ist das eher ein HTTP(S)-Problem.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Shelly ein- und ausschalten per http-Befehl Faultier_1982 20 608 21.11.2020 20:35
Letzter Beitrag: Tommy56
  Rotary Encoder und I2C Display gleichzeitig verwenden BenGroll 3 655 27.07.2020 10:23
Letzter Beitrag: hotsystems
  Frage zum richtigen verwenden einer Funktion Gerdchen03 3 748 10.04.2020 19:37
Letzter Beitrag: Tommy56
  File-Name in Sketch verwenden AnFi 6 857 06.01.2020 14:12
Letzter Beitrag: AnFi
  Http Aufruf API manu241 23 4.096 03.12.2018 22:53
Letzter Beitrag: Tommy56
  HTTP-Server lesen / SIM800l AT+HTTPREAD uk1408 1 1.733 22.02.2018 19:25
Letzter Beitrag: georg01
  TFT neu Verwenden Harry Hirsch 11 3.118 01.08.2017 13:22
Letzter Beitrag: Harry Hirsch
  String / HTTP Request Marc2014 4 2.756 23.12.2016 15:42
Letzter Beitrag: Tommy56
  html, client , NODEMCULUA, Wifi, match request , Frage Marc2014 2 1.634 15.02.2016 18:41
Letzter Beitrag: Marc2014
  Mehrere MCP23017 dynamisch verwenden itsy 5 3.459 14.02.2016 13:22
Letzter Beitrag: itsy

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste