Arduino schéma - arduino.sk

ESP32 - WPA2 Enterprise (802.1x)

Kompletné projekty s návodom a zdrojovým kódom
Príspevky: 53
Registrovaný: Uto 23. Dec 2014 2:15:50

ESP32 - WPA2 Enterprise (802.1x)

Poslaťod martinius96 » Uto 05. Jún 2018 16:07:20

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ázok
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: Vybrať všetko
#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ázok
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: Vybrať všetko
#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");
}

Príspevky: 53
Registrovaný: Uto 23. Dec 2014 2:15:50

Re: ESP32 - WPA2 Enterprise (802.1x)

Poslaťod martinius96 » Str 25. Júl 2018 23:41:04

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ázok
Keď som však skúšal doma na mnou konfigurovanom RADIUS serveri (Linux Zeroshell), nedokázal som sa pripojiť na sieť z dôvodu vypršania timeoutu pre HANDSHAKE, čím sa proces autentifikácie nedokončil. Z ostatných zariadení som sa pripojil bez akéhokoľvek problému.
Obrázok
Overovacia metóda u všetkých sietí bola PEAP + MsCHAPv2.

Späť na Hotové projekty