Lire un site HTTPS

Bonjour,

J’ai une carte UNO R4 Wifi.
Je lis une page web sur mon serveur en HTTPS.
Jusque là, pas de problème.

Je voudrais remplacé cette carte par une R4 minima + Shield W5100.
Je butte sur le problème avec le SSL. Mon serveur me renvoie l’information qu’il refuse le HTTP et demande du HTTPS.
Avec le wifi, on remplace le WiFiClient client; et le port 80 par WiFiSSLClient client; avec le port 443.
Avec le shield, cela n’a pas l’air aussi simple.
J’ai réussi en utilisant la bibliothèque SSLClient mais il faut compiler avec le certificat SSL du site.
Le seul problème (sauf erreur), lors de la mise à jour du certificat, il faut le recoder et recharger le programme.

Il y a pas plus simple ?

D’avance merci

Avec une UNO R4 WiFi, la gestion du TLS est intégrée au module WiFi (la gestion du TLS est assurée par le module ESP32-S3 et sa pile réseau, et que la vérification des certificats n’est pas équivalente à celle d’un navigateur) ce qui permet d’établir une connexion HTTPS sans gérer explicitement les certificats côté application, la vérification est soit simplifiée soit partiellement désactivée selon la configuration si je me souviens bien (je n’ai pas cette carte).

Avec un shield W5100, la situation est différente car le W5100 ne gère que TCP/IP et ne possède aucune capacité matérielle ou logicielle pour le SSL/TLS. ➜ la couche TLS doit donc être implémentée en logiciel sur le microcontrôleur, ce qui impose l’usage de bibliothèques comme SSLClient ou BearSSL portées sur Arduino.

Il faut regarder dans la bibliothèque que vous utilisez s’il y a un mode dégradé sans vérification du certificat.

merci pour cette réponse rapide ! Avec BearSSL j’ai un problème lors de la compilation du code :

c :/users/xxxx/appdata/local/arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/../lib/gcc/arm-none-eabi/7.2.1/../../../../arm-none-eabi/bin/ld.exe: section .stack_dummy VMA [20007b00,20007eff] overlaps section .heap VMA [20005cc8,20007cc7]
collect2.exe: error: ld returned 1 exit status
exit status 1

Compilation error: exit status 1

Le linker signale que la section .stack_dummy chevauche la section .heap, ce qui signifie que la pile et le tas se superposent. C'est dû au fait que BearSSL réserve des buffers statiques importants pour TLS.

Peut-être en réduisant la taille des buffers dans la bibliothèque ça pourrait passer.

(votre R4 minima n'a que 32Ko de RAM et chacun de ces buffer fait déjà plus de 16Ko)

essayez avec des buffers de 4K

#define BR_SSL_BUFSIZE_INPUT  (4096 + 325)
#define BR_SSL_BUFSIZE_OUTPUT (4096 + 85)

après je n'ai pas regardé si on peut lui dire ne de pas vérifier les certificats

j’ai pas trouvé d’exemple de programme avec bearSSL et ethernet.

J’ai fais un petit code le plus simple possible pour test :

#include <SPI.h>
#include <Ethernet.h>
#include <ArduinoBearSSL.h>
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0E, 0xA5, 0x7E };
IPAddress ip(192,168,1,88);
EthernetClient client;
BearSSLClient sslClient(client);

char server[] = "www.google.com";  

void setup() {
  Serial.begin(9600);
  
  Ethernet.begin(mac);
  delay(1000);
  
  Serial.print("Assigned IP ");
  Serial.println(Ethernet.localIP());

  Serial.println("Starting connection to server...");
  if (sslClient.connect(server, 443)) {
    Serial.println("connected to server");
    sslClient.println("GET /search?q=arduino HTTP/1.1");
    sslClient.println("Host: www.google.com");
    sslClient.println("Connection: close");
    sslClient.println();
  }else{Serial.println("connection denied");}
 }

void loop() {
  while (sslClient.available()) {
    char c = sslClient.read();
    Serial.write(c);
  }

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

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


}

Pas de connection

Par contre dans les exemples j’ai vus deux lignes :
dans les paramètres :

unsigned long getTime() {
return WiFi.getTime();
}

et avant la connection :

ArduinoBearSSL.onGetTime(getTime);

Apparement une gestion du temps pour une validation de la date du certificat ?

OK j'ai peut-être dit une bêtise et il faudrait peut être regarder du côté de SSLClient ou EthernetWebServer_SSL - un truc prévu pour s'interfacer avec la bibliothèque Ethernet.