ESP32 WiFi eduroam WPA/WPA2 Enterprise IoT IBM Watson, Bluemix PEAP, EAP-TTLS Arduino Core 802.1X RADIUS Identity Password Realm Domain MQTT HTTP, HTTPS
Zdrojové kódy pre mikrokontróler ESP32 sú dostupné: TU v Github repozitári
Ak ste sketch vyskúšali a pripojenie vám funguje, prosím potvrďte mi to na mail (pomôže aj screenshot zo Serial monitoru): martinius96@gmail.com

Princíp siete eduroam


Sieť eduroam (education roaming) je celosvetová počítačová infraštruktúra, ktorá je implementovaná vo vedeckej a univerzitnej sfére. Pôvodná myšlienka projektu - siete eduroam vznikla v Holandsku v roku 2002. Sieť je navrhnutá pre celosvetové využívanie študentmi, vedeckými pracovníkmi a pedagógmi. Je tvorená sieťou RADIUS serverov, ktoré overujú používateľov, ktorí sa chcú do siete pripojiť a využívať služby internetu a LAN siete. Táto infraštruktúra RADIUS serverov sa často označuje aj ako federácia. RADIUS server je zariadenie poskytujúce služby AAA: autentizácie, autorizácie a tarifikácie (AAA - Authentication, Authorization, and Accounting). Zariadenie je fyzický prvok siete, ktorý overuje prihlasovacie údaje používateľov, ktorí sa do siete pripájajú. Každý používateľ siete eduroam sa vie pripojiť do siete z akejkoľvek organizácie na svete, ktorá je v projekte eduroam zaradená bez nutnosti meniť konfiguračné nastavenia sieťového profilu. Všetky prístupové body vysielajú SSID eduroam. Používateľ sa tak pripája, spôsobom, akoby bol v domácej organizácii. Každá organizácia v sieti eduroam sa musí prispôsobiť určitým pravidlám, ktoré sú jednoznačne definované, čo umožňuje ich vzájomnú kompatibilitu. Každý používateľ siete eduroam je jednoznačne priradený k svojej organizácii prostredníctvom realmu. Realm je definovaný v tvare @organizácia.doména. V prípade Technickej univerzity v Košiciach je to realm @tuke.sk pre študentov, pedagógov i vedeckých pracovníkov.


Existujú ešte dva vyžiadané parametre, ktoré sú pri prihlasovaní do WiFi siete eduroam potrebné. Ak sa používateľ prihlasuje do siete eduroam, musí zadať identitu, ktorá je tvorená jeho menom, alebo identifikátorom a realmom organizácie. Druhým parametrom, ktorý používateľ pri prihlasovaní do WiFi siete používa je jeho heslo. Heslo je uložené v databáze v čitateľnej podobe, alebo vo formáte NTLM hashu. Tieto spôsoby zadania hesla je možné aplikovať aj na strane klienta snažiaceho sa o prístup do siete. V prípade, že sa používateľ prihlasuje do siete eduroam vo vlastnej organizácii, môže použiť len prihlasovacie meno, nevyžaduje sa identifikátor s realmom. Tento spôsob je však možné aplikovať iba vo vlastnej organizácii, keďže sa z inej organizácie klient nepripojí, nakoľko neexistuje realm v identite používateľa. Na Slovensku sieť eduroam prevádzkuje rada univerzít, konektivitu medzi nimi a do internetu zabezpečuje združenie SANET.


Každý klient pri pripojení do siete eduroam musí prekonať dve fázy:
  • 1. Autentizácia - preukázanie identity a hesla prostredníctvom supplicanta
  • 2. Autorizácia - odpoveď RADIUS servera Povoľ prístup / Zamietni prístup
  • Ak používateľ zlyhá pri preukázaní identity a hesla, autorizácia sa vykoná s výsledkom zakáž prístup, klientovi nie je pridelená IP adresa a nemôže využívať služby internetu a LAN siete. Pokus môže opakovať. V prípade, že klient, ktorý je autentizovaný a autorizovaný vykonáva zakázanú aktivitu, je možné zablokovať iba jeho fyzickú MAC adresu prostredníctvom smerovačov, prípadne realm pre všetkých používateľov danej organizácie prostredníctvom RADIUS servera. Nakoľko klient môže využiť anonymnú identitu, organizácia, kde sa klient pripája do siete eduroam nevie meno používateľa, dokáže získať iba tento identifikačný reťazec z domácej organizácie, avšak vysielanie tohto reťazca nie je nutnosťou. Od roku 2017 je možné zablokovať aj reťazec Chargeable user identity, ktorá používateľa zablokuje v sieti eduroam, každý používateľ má tento parameter iný. RADIUS server siete eduroam je v organizáciách najčastejšie v softvérovej konfigurácii operačného systému Linux Debian s rozšírením FreeRADIUS. Okrem nastavenia RADIUS serverov na štandard siete eduroam sa vyžaduje aj nastavenie a overenie dôveryhodných prístupových bodov. Prístupové body obsahujú konfiguráciu s adresou RADIUS servera, prenosovým protokolom s uloženým reťazcom - vzájomne zdieľaným tajomstvom. Tento textový reťazec je pre každý prístupový bod iný, avšak musí sa zhodovať s nastaveným pre daný prístupový bod na strane RADIUS servera.


    Povolené porty - eduroam


    Používateľ po úspešnom pripojení do WiFi siete eduroam môže využívať tieto sieťové porty:
    Služba Protokol Port Smer komunikácie
    Standard IPSec VPN IP (ESP) 50 Obojsmerne
    IP (AH) 51 Obojsmerne
    UDP(IKE) 500 Von
    OpenVPN 2.0 UDP (OpenVPN) 1194 Obojsmerne
    IPv6 Tunnel broker IP 41 Obojsmerne
    IPSec NAT-Traversal UDP (IPSec) 4500 Obojsmerne
    Cisco IPSec VPNoTCP TCP 10000 Von
    PPTP VPN TCP (PPTP) 1723 Obojsmerne
    IP (GRE) 47 Von
    SSH TCP 22 Von
    HTTP TCP 80 Von
    TCP 443 Von
    TCP 3128 Von
    TCP 8080 Von
    Mail služby - odosielanie TCP (SMTP-SSL) 465 Von
    TCP (decbsrv) 579 Von
    Mail služby - prijímanie TCP (IMAP) 143 Von
    TCP (IMAP-SSL) 993 Von
    TCP (POP3) 110 Von
    TCP (POP3-SSL) 995 Von
    FTP TCP 21 Von

    Zdrojový kód pre ESP32 - Core 2.0.3+


    /*|----------------------------------------------------------|*/
    /*|Experimental example for eduroam connection               |*/
    /*|Sketch wasnt tested, I am not more student, cant try it   |*/
    /*|Changes from @debsahu (Github) and  esp_wpa2 library ref. |*/
    /*|Edited by: Martin Chlebovec (martinius96)                 |*/
    /*|Compilation under 2.0.3 Arduino Core worked               |*/
    /*|Previous stable cores are NOT usable, does not have       |*/
    /*|WiFi.begin() definition with these parameters for PEAP... |*/
    /*|----------------------------------------------------------|*/
    /*|Let me know if you were successful in connecting to WiFi: |*/
    /*|with screenshots from Serial at martinius96@gmail.com     |*/
    /*|----------------------------------------------------------|*/
    
    //Code based on commit by @jpswensen from 15th March 2022: https://github.com/espressif/arduino-esp32/commit/d977359e343bd1dfd83b82d14b6afc2a84fdd998
    //Commit is to 2.0.3-RC1 Arduino Core, used in 2.0.3 Release version of Arduino Core for ESP32
    
    #include <WiFi.h> //Wifi library
    #include "esp_wpa2.h" //wpa2 library for connections to Enterprise networks
    
    //Identity for user with password related to his realm (organization)
    //Available option of anonymous identity for federation of RADIUS servers or 1st Domain RADIUS servers
    
    #define EAP_ANONYMOUS_IDENTITY "anonymous@tuke.sk" //anonymous@example.com, or you can use also nickname@example.com
    #define EAP_IDENTITY "username@tuke.sk" //nickname@example.com, at some organizations should work nickname only without realm, but it is not recommended
    #define EAP_PASSWORD "password" //password for eduroam account
    
    //SSID NAME
    const char* ssid = "eduroam"; // eduroam SSID
    
    //Intermediate CA cert (GEANT OV RSA CA 4) in .pem format
    //Used for WiFi connection as trusted CA that issued certificate for wifi.uvt.tuke.sk
    const static char* test_root_ca PROGMEM = \
        "-----BEGIN CERTIFICATE-----\n" \
        "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\n" \
        "-----END CERTIFICATE-----\n";
    
    //Root CA cert (USERTrust RSA Certification Authority) in .pem format
    //Use if connection not successful with Intermediate CA above
    /*
      const static char* test_root_ca PROGMEM = \
      "-----BEGIN CERTIFICATE-----\n" \
      "MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB\n" \
      "iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl\n" \
      "cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV\n" \
      "BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw\n" \
      "MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV\n" \
      "BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU\n" \
      "aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy\n" \
      "dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK\n" \
      "AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B\n" \
      "3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY\n" \
      "tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/\n" \
      "Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2\n" \
      "VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT\n" \
      "79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6\n" \
      "c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT\n" \
      "Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l\n" \
      "c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee\n" \
      "UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE\n" \
      "Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd\n" \
      "BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G\n" \
      "A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF\n" \
      "Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO\n" \
      "VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3\n" \
      "ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs\n" \
      "8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR\n" \
      "iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze\n" \
      "Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ\n" \
      "XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/\n" \
      "qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB\n" \
      "VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB\n" \
      "L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG\n" \
      "jjxDah2nGN59PRbxYvnKkKj9\n" \
      "-----END CERTIFICATE-----\n";
    */
    
    void setup() {
      Serial.begin(115200);
      delay(10);
      Serial.println();
      Serial.print(F("Connecting to network: "));
      Serial.println(ssid);
      WiFi.disconnect(true);  //disconnect form wifi to set new wifi connection
      WiFi.mode(WIFI_STA); //init wifi mode
      WiFi.begin(ssid, WPA2_AUTH_PEAP, EAP_ANONYMOUS_IDENTITY, EAP_IDENTITY, EAP_PASSWORD, test_root_ca); //with CERTIFICATE
      //WiFi.begin(ssid, WPA2_AUTH_PEAP, EAP_ANONYMOUS_IDENTITY, EAP_IDENTITY, EAP_PASSWORD); //without CERTIFICATE
    
      // Example: a cert-file WPA2 Enterprise with PEAP
      //WiFi.begin(ssid, WPA2_AUTH_PEAP, EAP_IDENTITY, EAP_USERNAME, EAP_PASSWORD, test_root_ca, client_cert, client_key);
    
      // Example: TLS with cert-files and no password
      //WiFi.begin(ssid, WPA2_AUTH_TLS, EAP_IDENTITY, NULL, NULL, test_root_ca, client_cert, client_key);
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(F("."));
      }
      Serial.println("");
      Serial.println(F("WiFi is connected!"));
      Serial.println(F("IP address set: "));
      Serial.println(WiFi.localIP()); //print LAN IP
    }
    void loop() {
      yield();
    }