Pomijając kwestie bezpieczeństwa przekazywanych danych coraz trudniej jest korzystać z żądań HTTP ponieważ coraz mniej serwerów dopuszcza połączenie bez szyfrowania.

Tworzenie skrótu certyfikatu serwera

By skorzystać z HTTPS w Arduino musimy uzyskać skrót SHA-1 certyfikatu używanego przez serwer z którym chcemy się łączyć.

openssl s_client -connect www.xyz.org:443

Interesuje nas treść zawarta między znacznikami -----BEGIN CERTIFICATE----- i -----END CERTIFICATE----- Kopiujemy ten fragment do pliku wraz ze znacznikami, następnie tworzy skrót SHA-1

openssl x509 -noout -in ./plikCertyfikatu -fingerprint -sha1

Z otrzymanego odcisku należy usunąć znaki :, przykładowy odcisk poniżej

const char* fingerprint = "2D EC DC 39 E1 43 FB 81 BF 75 33 7E F4 69 E9 3D 9B EA BF 31";

Prócz tego odcisk SHA-1 możena podejrzeć we właściwościach certyfikatu w Mozilla Firefox na zakładce ogólne.

Wysyłanie żądania HTTPS

Niezbędne są dwie biblioteki, WiFi.h by połączyć się z siecią WiFi i HTTPClient.h celem stworzenia klasy która pozwoli na wykonanie żądania HTTP.

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

Deklarujemy dane niezbędne do połączenia z siecią

const char* ssid = "nazwaSieci";
const char* password = "hasło";

i dodajemy wcześniej odpowiednio spreparowany certyfikat

const char* fingerprint = "2D EC DC 39 E1 43 FB 81 BF 75 33 7E F4 69 E9 3D 9B EA BF 31";

W funkcji setup() otwieramy połączenie szeregowe celem monitrowania pracy kontrolera i łączymy się do sieci WiFi

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

    WiFi.begin(ssid, password);
    Serial.print("Connecting to WiFi .");
    while (WiFi.status() != WL_CONNECTED) {
        Serial.print(".");
        delay(100);
    }
    Serial.println();
    Serial.println("Connected to WiFi!");
}

Po połączeniu się z siecią towrzymy obiekt HTTPClient który pozwoli na wysłanie zapytania HTTPS.

HTTPClient http;

Przed użyciem obiekt http musimy zainicjalizować podając adres zapytania oraz ceryfikat

http.begin("https://www.testowyServer.org/dane?x=1", fingerprint);

Wysłanie zapytania GET odbywa się poprzez wywołanie funkcji GET() na obiekcie http. Funkcja zwróci int, jeżeli wartość jest większa od 0 to jest kodem zwróconym przez serwer www a wartość mniejsza od 0 oznacza wewnętrzny błąd kontrolera.

int httpCode = http.GET();

Po wykonaniu zapytania możemy wyświetlić treść zwróconą przez serwer,

if(httpCode > 0) {
    String payload = http.getString();
    Serial.println(httpCode);
    Serial.println(payload);
}
else {
    Serial.println("Blad podczas generowania zapytania");
}

Po przetworzeniu zapytania należy wywołać funkcję end() celem zwolnienia zasobów zajętych przez obiekt HTTPClient

http.end();

Następny wpis