MKR1000 Certificati SSL

I progetti IoT necessitano di sicurezza e quindi della MKR1000 Certificati SSL una board genuino in  cui puoi caricare CA ( Certification Autority ) per eseguire connessioni SSL a siti, app e cloud

mkr1000 certificati ssl certificates mockyio service

In pratica le connessioni SSL necessitano della validazione da parte del client del certificato ssl esposto; tale operazione nei browser è spesso nascosta dalla presenza delle Root CA caricate nel browser stesso all’atto dell’installazione.

Nelle schede come MKR1000 e WiFi101 sono stati pre-caricate delle Root CA che ti consentono subito l’accesso ai siti https degli esempi ed ai maggiori servizi https certificati.

Tuttavia esistono molti siti che utilizzano certificati self signed ( autogenerati ) o con certificati emessi da root CA differenti da quelle già presenti nella MKR1000, anche a causa della non infinita capacità di memoria, che impedisce di poter caricare tutte le Root CA esistenti.

Se il tuo progetto fa uso ad esempio di servizi come mocky.io dovrai caricare il certificato e la CA corrispondente sulla MKR1000 Certificati SSL prima che questa possa eseguire l’accesso al servizio.

Accesso a mocky.io da browser

Quando accedi al sito mocky.io dal tuo browser, io ho usato chrome, vedrai in alto nella barra dell’Url comparire il simbolo di pericolo in rosso e l’https barrato:

mocky io https error certificates

cliccando sul simbolo apparirà una finestra simile:

mocky io detailed certificate

che ti informa dell’origine non sicura del certificato.

In un browser ti è sufficiente scegliere di procedere comunque importando il certificato e autorizzandolo assumendoti la responsabilità della verifica. In un progetto IoT con la MKR1000 o la WiFi101 l’interazione utente non è possibile e/o sarebbe scomodo se ad ogni accesso https l’utente dovesse validare il certificato.

Ecco perché trovi il tool WiFi101 FirmwareUpdater nel menu strumenti dell’IDE:

Arduino IDE 1.6.11 Wifi101_FirmwareUpdater

con cui eseguire l’update dei certificati ssl.

Accesso a Mocky.io da MKR1000

Procedendo con ordine: il primo passo è eseguire l’upload dello sketch denominato “FirmwareUpdater” sulla MKR1000 Certificati SSL per predisporre la comunicazione tra il tool di aggiornamento dei certificati e il winc1501 presente sulla board:

mkr1000 ssl certificates sketch firmware update

dopo aver eseguito l’upload dello sketch:

mkr1000 ssl certificates upload firmware sketch

puoi procedere aprendo il tool “WiFi101 FirmwareUpdater” che ti si presenta così:

Arduino IDE 1.6.11 Firmware updater Screen

e dal quale puoi eseguire sia l’update del firmware sia il caricamento dei certificati che desideri sull’MKR1000 Certificati SSL.

Seleziona la porta USB a cui è connessa la MKR1000 e cliccare su “Test connection”:

mkr1000 ssl certificates test connection

se la risposta è “The programmer is working” la MKR1000 risponde al tool e lo sketch caricato è corretto.

Clicca su “Add domain” ed aggiungi l’url del sito da cui estrarre il certificato, in questo esempio mocky.io, la porta la aggiunge in automatico il tool:

mkr1000 ssl certificates mockyio

premi quindi su “Upload Certificates to WiFi module” ed attendi l’esito dell’operazione:

mkr1000 ssl certificates mockyio success

l’upload è avvenuto correttamente ed il nuovo certificato è disponibile per le connessioni IoT ssl per cui puoi passare alla fase sul sito mocky.io.

Url da Mocky.io

Collegandoti al sito, ed accettando la validità del certificato, ti appare la schermata in cui trovi un esempio di url da richiamare:

mkr1000 certificati ssl certificates mockyio service

nel mio caso l’url è: https://www.mocky.io/v2/5185415ba171ea3a00704eed che se provi ad inserire nel browser e premere invio ti mostra, se corretta, la risposta:

mkr1000 ssl certificates web https response

Verifica che il certificato sia correttamente caricato e prova una connessione dalla MKR1000 Certificati SSL eseguendo l’upload dell’esempio fornito con l’IDE: denominato WiFiSSLClient .

Per utilizzarlo con il servizio che ho scelto per i test dovrai modificarlo come segue:

/*
This example creates a client object that connects and transfers
data using always SSL.

It is compatible with the methods normally related to plain
connections, like client.connect(host, port).

Written by Arturo Guadalupi
last revision November 2015

*/

#include <SPI.h>
#include <WiFi101.h>

char ssid[] = "A***********t"; //  your network SSID (name)
char pass[] = "m***********i";    // your network password (use for WPA, or use as key for WEP)
int keyIndex = 0;            // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;
// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
//IPAddress server(74,125,232,128);  // numeric IP for Google (no DNS)
//char server[] = "httpbin.org";    // name address for Google (using DNS)
char server[] = "www.mocky.io";    // name address for Google (using DNS)

// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 80 is default for HTTP):
WiFiSSLClient client;

void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // check for the presence of the shield:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    // don't continue:
    while (true);
  }

  // attempt to connect to Wifi network:
  while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
    status = WiFi.begin(ssid, pass);

    // wait 10 seconds for connection:
    delay(10000);
  }
  Serial.println("Connected to wifi");
  printWifiStatus();

  Serial.println("\nStarting connection to server...");
  // if you get a connection, report back via serial:
  if (client.connect(server, 443)) {
    Serial.println("connected to server");
    // Make a HTTP request:
    client.println("GET /v2/5185415ba171ea3a00704eed HTTP/1.1");
    client.println("Host: www.mocky.io");
    client.println("Connection: close");
    client.println();
  }
}

void loop() {
  // if there are incoming bytes available
  // from the server, read them and print them:
  while (client.available()) {
    char c = client.read();
    Serial.write(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting from server.");
    client.stop();

    // do nothing forevermore:
    while (true);
  }
}


void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

in cui alla linea 016:  inserisci l’SSID della  tua rete WiFi;

linea 017: immetti la password relativa al tuo SSID, necessaria per eseguire la connessione WiFi;

linea 026: il sito a cui vuoi collegarti dalla mkr1000 nell’esmpio che stai leggendo: “www.mocky.io”;

linea 031: inizializza l’istanza client della classe WiFiSSLClient che ti serve per eseguire connessioni di tipo ssl;

lascia invariate le linee fino alla linea 060, in quanto queste ultime si preoccupano di verificare la corretta comunicazione con il modulo wifi ed eseguono la connessione all’SSID specificato;

linea 062: esegui la connessione al server definito alla linea 026 sulla porta 443 ( https );

linea 065: iserisci la linea relativa alla chiamata in GET da eseguire al sito definito nella linea successiva. Tale linea rappresenta la parte successiva all’url nel sito da chimare: /v2/……

linea 066: imposta il nome del server a cui collegarti, come alla linea 026 sarà www.mocky.io;

linea 067: chuidi la conessione http al server;

linee 075-078: nella fase di loop() se dalla connessione eseguita alle linee 062-068 arriva qualche informazione la scrivi sul monitor seriale;

linee 081-084: chiudi la connessione https e scrivi sul monitor seriale “disconnecting from server”;

linea 087: usa il comando “while (true)” per fermare l’esecuzione dello script.

Risultato della connessione MKR1000 Certificati SSL

Eseguendo lo sketch ed aprendo il monitor seriale, se la connessione avviene correttamente dovresti visualizzare una schermata come la seguente:

mkr1000 ssl certificates mockyio serial output

la cui risposta, avrai notato, è esattamente quella che il sito mocky.io riporta nella response all’url chiamato da browser.

Sei certo che l’MKR1000 Certificati SSL è avvenuto correttamente e potrai usare questa procedura per tutti i siti e servizi che coinvolgoo il tuo progetto.

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/elettronica/mkr1000-certificati-ssl.html

2 commenti

    • Alessandro il 7 Ottobre 2020 alle 09:00
    • Rispondi

    Ciao, eseguo questi passaggi, ma se uso il mio sito non funziona.
    Ho un arduino UNO WiFi rev2.
    ho caricato sull’arduino il certificato di google e funziona.
    poi ho caricato anche il certificato del mio sito, hostato su aruba, e non funziona.
    Idea? Potrebbe essere una limitazione imposta da aruba?

    1. Ciao Alessandro,
      hai importato anche la catena di certificati che firmano il tuo certificato ?
      Probabilmente la CA che firma il tuo certificato non è tra quelle presenti di default nell’Arduino Uno WiFi

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.