ESP32 - WPA2 Enterprise (802.1x)

Tvoříte zajímavý projekt? Pochlubte se s ním.
Pravidla fóra
Vkládejte prosím jen HOTOVÉ projekty, které chcete představit ostatním.
Odpovědět
martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

ESP32 - WPA2 Enterprise (802.1x)

Příspěvek od martinius96 » 05 čer 2018, 15:54

Ahoj, podarilo sa mi ubastliť z troch kódov sketch pre ESP32 dosky, prostredníctvom ktorej je možné sa napojiť na sieť 802.1x, najčastejšie sa s ňou dá stretnúť na unvierzitách (Eduroam), prípadne v korporáciách, väčších firmách. Od štandardných PSK sietí sa odlišuje tým, že vyžaduje okrem hesla do siete aj meno používateľa (a ďalšie mechanizmy na výmenu kľúčov, EAPoL rámce atď..). Každý používateľ má svoje meno (identitu) a heslo a ich kombinácia umožní prístup do siete. Mechanizmus overovania je trošku zložitejší, ESP32 komunikuje len s AP a AP komunikuje s RADIUS serverom, ktorý dosku do siete overuje.
Obrázek
Testoval som pod Eduroam a pod lokálnou sieťou, kde fungoval lokálny RADIUS server. Pri oboch pokusoch o spojenie to bolo úspešné, priemerná doba pripojenia je 4-5 sekúnd, pokým doska preukáže identitu a heslo. Zadávanie certifikátov nebolo potrebné, doska si ich dokázala vyžiadať ako je to napr u Androidu, či Windowsu 8+. Obe 802.1x siete, kde som pripojenie testoval využívali v prvom kroku metódu overenia PEAP a v druhom kroku MsCHAPv2.

Ukážkový sketch obsahuje okrem pripojenia dosky do siete aj pripojenie na externý webserver po HTTP protokole pre overenie konektivity do internetu. Všetko sa vypisuje na Serial monitor. V ukážkovom kóde je nutné zmeniť iba SSID, identitu a heslo, prípadne názov ESP32 dosky v sieti (volitelné).
2018 verzia:

Kód: Vybrat vše

#include "esp_wpa2.h"
#include <WiFi.h>
String line;
const char* ssid = "magicwifi"; // wifi siet
#define EAP_IDENTITY "identitavsieti" //eap identita 
#define EAP_PASSWORD "heslo" //heslo
#define MENOPC "ESP32Devboard" 

void setup() {
    Serial.begin(115200);
    delay(10);
    Serial.println();
    Serial.print("Pripajam sa na: ");
    Serial.println(ssid);
    WiFi.disconnect(true); 
    esp_wifi_sta_wpa2_ent_set_identity((uint8_t *)EAP_IDENTITY, strlen(EAP_IDENTITY));
    esp_wifi_sta_wpa2_ent_set_username((uint8_t *)EAP_IDENTITY, strlen(EAP_IDENTITY));
    esp_wifi_sta_wpa2_ent_set_password((uint8_t *)EAP_PASSWORD, strlen(EAP_PASSWORD));
    esp_wpa2_config_t config = WPA2_CONFIG_INIT_DEFAULT();
    esp_wifi_sta_wpa2_ent_enable(&config);
   Serial.println("MAC adresa: ");
   Serial.println(WiFi.macAddress());
    WiFi.begin(ssid); //pripajanie
 WiFi.setHostname(MENOPC); //volitelne
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("");
    Serial.println("WiFi pripojene");
    Serial.println("IP addresa: ");
    Serial.println(WiFi.localIP());
}
const char* host = "arduino.php5.sk"; //server na ktory sa pripajame (domena)

void loop() {
    delay(5000);

    Serial.print("Pripajam sa na server: ");
    Serial.println(host);

    WiFiClient client;
    if (!client.connect(host, 80)) { //pripajanie na server pod HTTP
        Serial.println("connection failed");
    }
    String url = "/rele/rele1.txt";    //request na subor pod serverom
    Serial.print("Requesting URL: ");
    Serial.println(url);
    client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                 "Host: " + host + "\r\n" +
                 "Connection: close\r\n\r\n");
    unsigned long timeout = millis();
    while (client.available() == 0) {
        if (millis() - timeout > 5000) {
            Serial.println(">>> Timeout prebehol, response sa nevratila !");
            client.stop();
        }
    }
    while(client.available()) {
         line = client.readStringUntil('\n'); //citanie po posledny riadok
        Serial.println(line); //ulozenie premennej z response
    
    }
    
    if (line=="VYP"){
      Serial.println("Vypnuty spotrebic");
      }else if (line=="ZAP"){
      Serial.println("Zapnuty spotrebic");
      }
    Serial.println();
    Serial.println("Ukoncene spojenie");
}
Na test som využil dosku ESP32 Devkit v1 DoIT s čipom WROOM-32.
Obrázek
V prípade, že používate starú verziu pre ESP32 dosky, je možné že tento sketch nebude fungovať z dôvodu zmeny knižníc, pridávam preto aj jemne upravenú verziu pre rok 2017.
2017 verzia:

Kód: Vybrat vše

#include "esp_wpa2.h"
#include <WiFi.h>
String line;
const char* ssid = "magicwifi"; // wifi siet
#define EAP_IDENTITY "identitavsieti" //eap identita 
#define EAP_PASSWORD "heslo" //heslo
#define MENOPC "ESP32Devboard" 

void setup() {
    Serial.begin(115200);
    delay(10);
    Serial.println();
    Serial.print("Pripajam sa na: ");
    Serial.println(ssid);
    WiFi.disconnect(true); 
    esp_wifi_sta_wpa2_ent_set_identity((uint8_t *)EAP_IDENTITY, strlen(EAP_IDENTITY));
    esp_wifi_sta_wpa2_ent_set_username((uint8_t *)EAP_IDENTITY, strlen(EAP_IDENTITY));
    esp_wifi_sta_wpa2_ent_set_password((uint8_t *)EAP_PASSWORD, strlen(EAP_PASSWORD));
    esp_wifi_sta_wpa2_ent_enable();
   Serial.println("MAC adresa: ");
   Serial.println(WiFi.macAddress());
    WiFi.begin(ssid); //pripajanie
 WiFi.setHostname(MENOPC); //volitelne
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("");
    Serial.println("WiFi pripojene");
    Serial.println("IP addresa: ");
    Serial.println(WiFi.localIP());
}
const char* host = "arduino.php5.sk"; //server na ktory sa pripajame (domena)

void loop() {
    delay(5000);

    Serial.print("Pripajam sa na server: ");
    Serial.println(host);

    WiFiClient client;
    if (!client.connect(host, 80)) { //pripajanie na server pod HTTP
        Serial.println("connection failed");
    }
    String url = "/rele/rele1.txt";    //request na subor pod serverom
    Serial.print("Requesting URL: ");
    Serial.println(url);
    client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                 "Host: " + host + "\r\n" +
                 "Connection: close\r\n\r\n");
    unsigned long timeout = millis();
    while (client.available() == 0) {
        if (millis() - timeout > 5000) {
            Serial.println(">>> Timeout prebehol, response sa nevratila !");
            client.stop();
        }
    }
    while(client.available()) {
         line = client.readStringUntil('\n'); //citanie po posledny riadok
        Serial.println(line); //ulozenie premennej z response
    
    }
    
    if (line=="VYP"){
      Serial.println("Vypnuty spotrebic");
      }else if (line=="ZAP"){
      Serial.println("Zapnuty spotrebic");
      }
    Serial.println();
    Serial.println("Ukoncene spojenie");
}

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: ESP32 - WPA2 Enterprise (802.1x)

Příspěvek od martinius96 » 26 črc 2018, 00:08

UPDATE: Tak pár zistení pri používaní.. Na univerzitných Eduroam sieťach funguje pripojenie na 802.1x bezproblémovo (mám potvrdené i zo zahraničia). Eduroam býva konfigurovaný najčastejšie na Debiane s rozšírením FreeRadius pre autentifikačný server - RADIUS.
Obrázek
Keď som však skúšal doma na mnou konfigurovanom RADIUS serveri (Linux Zeroshell), nedokázal som sa pripojiť na sieť z dôvodu jednej chyby, ktorá ešte proces neukončila, primárnym problémom bolo vypršanie timeoutu pre HANDSHAKE, čím sa proces autentifikácie nedokončil. Z ostatných zariadení som sa pripojil bez akéhokoľvek problému.
Obrázek
Overovacia metóda u všetkých sietí bola PEAP + MsCHAPv2.

Kód s pripojením na 802.1x s HTTP requestom mi vývojár z ESP32-Arduino Core mergol do ich repozitára, môžte ho odteraz nájsť aj v oficiálnom balíčku príkladov ako WifiClientEnterprise. https://github.com/espressif/arduino-es ... rprise.ino

MichalCzEJ
Příspěvky: 17
Registrován: 03 bře 2018, 21:38
Reputation: 0

Re: ESP32 - WPA2 Enterprise (802.1x)

Příspěvek od MichalCzEJ » 26 črc 2018, 00:35

Nevyznám se moc v Radius serveru, spíše jen vím co to je a jak to +/- funguje, ale mám v plánu se to naučit.

Chtěl jsem se tě zeptat, jestli vidíš tuhle chybu jako chybu u tebe na serveru (na tom Linux Zeroshellu), nebo by stačilo prasácky v knihovně na ESP prodloužit timeout na handshake.

Případně, nemáš na tvém AP nastavené WPA a WPA2 (TKIP + AES) zároveň, jak to mají v oblibě dělat výrobci u dnešního zabezpečení WLAN.

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: ESP32 - WPA2 Enterprise (802.1x)

Příspěvek od martinius96 » 26 črc 2018, 00:51

Neviem kde je chyba, nakoľko metódy u oboch sietí pre overenie sú totožné, ale na strane dosky to zrejme nebude
Na AP mám nastavené WPA/WPA2 (Automatic) Enterprise a taktiež šifrovanie je automatické.
Chcel som to prasácky nájsť a predĺžiť, ale v tej knižnici, kde to hlási chybu som to neobjavil, je tam iba pole, ktoré obsahuje súbor chýb a medzi nimi je i HANDSHAKE timeout. niečo v štýle (AP_TIMEOUT, HANDSHAKE_TIMEOUT...)

Tieto doplnkové informácie a chyby je možné vidieť v serial monitore, keď sa v ArduinoIDE nastaví Core Debug na Info. Skúšal som to všeliako..
Je tam ešte rozdiel ten, že pri Eduroame je certifikát vydaný overenou autoritou CA a v prípade Zeroshell-u je podpísaný sebou samým.. Skrátene sa to dá nazvať ako málo dôveryhodný, ale to priamo chybu nespôsobilo.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: ESP32 - WPA2 Enterprise (802.1x)

Příspěvek od pavel1tu » 26 črc 2018, 11:47

Já se zeptám asi blbě - to řešíš jen připojení na WPA2/Radius server na nějakou WiFi.

Pak tahle deska zvládá SSL(HTTPS/SFTP....) připojení na server ?
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: ESP32 - WPA2 Enterprise (802.1x)

Příspěvek od martinius96 » 26 črc 2018, 12:41

Áno, je to iba sketch na pripojenie na sieť pod WPA/WPA2 Enterprise.
Tieto wifiny sa využívajú na univerzitách a v organizáciách. Myslím, že to niekto využije najmä pri bakalárskej či diplomovej práci na projekte. Na sieť takéhoto typu sa napríklad s ESP8266 pripojiť nedá.

ESP32 plne zvláda i HTTPS, veď je to predsa dvojjadro na 160/240MHz. Vyžaduje ale pre HTTPS spojenie root certifikát, ktorý sa vkladá priamo do kódu, musia sa tam jednotlivé riadky certifikátu ukončovať cez \n, trošku patlačka. Pri ESP8266 stačil odtlačok certifikátu. Keďže ale tu ide o root certifikát, tak je to zrejme certifikát tej autority.
Napríklad ja mám freehosting na php5.sk, tá ma certifikát od RapidSSL a nad tým je Digicert a pravdepodobne to vyžaduje jeho certifikát. Ešte som to neskúšal, neviem ako sa mám dopátrať k tomu certifikátu, prostredníctvom prehliadača pri prehliadaní certifikátu a ciest som sa k tomu konkrétnemu formátu nedostal.

MichalCzEJ
Příspěvky: 17
Registrován: 03 bře 2018, 21:38
Reputation: 0

Re: ESP32 - WPA2 Enterprise (802.1x)

Příspěvek od MichalCzEJ » 26 črc 2018, 13:37

Možná budu trošku odbočovat od tématu, ale na ESP8266 momentálně testuji odesílání teplota do MySQL na HTTPS hosting! Mám vlastní VPS s Let’s Encrypt certifikátem a vynucené používání HTTPS. Viděl jsem právě u tebe Martine, že tam házíš ty otisk do kódu, já to mám úplně bez toho, sice snížím bezpečnost, ale kdo mi bude chtít nabourat teplotu, kterou posílám co 5s na server. Můj odhad je 0 lidí :D Ale aspoň takhle nechám ESPčko jak dlouho chci někde ležet a nemusím se o něj starat, kdežto u otisku máš 1 rok platnost pokud se nemýlím.

https://github.com/MichalCzEJ/ESP8266-HTTPS

Je možné, že se tam někde objeví chyba v podobě špatného { } .., mazal jsem tam třeba knihovnu na ledky WS2812FX atd..
Na ESP32 to funguje taktéž po pár úpravách v kódu.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 14 hostů