🛠 HTTPS : client TLS et certificats de confiance
Objetivos
Pasar de HTTP en claro a HTTPS: cifrar la sesión TLS del cliente con una autoridad de certificación de confianza almacenada en la memoria flash, verificar la cadena del servidor y comprender el papel del acelerador de hardware SHA-256 y del TRNG del RP2350. Este es el componente de seguridad de cualquier dispositivo conectado en la Pico 2 W.
Material
- Pico 2 W conectada al Wi-Fi
- pico-sdk con pico_cyw43_arch_lwip_threadbackground (lwIP + mbedTLS)
- Paquete de certificados raíz (ISRG Root X1, Let's Encrypt...) para incluir
Código completo
// main.c - inspire de pico-examples pico_w/wifi/tls_client
#include "pico/stdlib.h"
#include "pico/cyw43_arch.h"
#include "mbedtls/platform.h"
#include "mbedtls/net_sockets.h"
#include "mbedtls/ssl.h"
extern const uint8_t ca_cert_pem_start[]; // bundle CA compile en flash
extern const uint8_t ca_cert_pem_end[];
int main(void) {
stdio_init_all;
if (cyw43_arch_init) { return 1; }
cyw43_arch_enable_sta_mode;
if (cyw43_arch_wifi_connect_timeout_ms(
"mon_ssid", "mon_mot_de_passe", CYW43_AUTH_WPA2_AES_PSK, 30000)) {
return 1;
}
mbedtls_ssl_context ssl; mbedtls_ssl_init(&ssl);
mbedtls_ssl_config cfg; mbedtls_ssl_config_init(&cfg);
mbedtls_x509_crt ca; mbedtls_x509_crt_init(&ca);
// 1) mbedtls_x509_crt_parse(&ca, ca_cert_pem_start, taille)
// 2) mbedtls_ssl_config_defaults + conf_ca_chain(&cfg, &ca, NULL)
// 3) mbedtls_ssl_set_hostname(&ssl, "api.exemple.fr")
// 4) handshake puis mbedtls_ssl_write/read sur le port 443
printf("TLS en place\n");
while (true) { sleep_ms(1000); }
}
En MicroPython: ssl.wrap_socket(s, server_hostname=hote) con la CA pasada en ca=.
Verificación esperada
El handshake se completa en el puerto 443 y la solicitud recibe una respuesta 200; con una CA ausente o un nombre de host incorrecto, mbedtls_ssl_handshake devuelve -0x2700 (certificado no confiable) en lugar de 0.
Errores frecuentes
- Olvidar mbedtls_ssl_set_hostname: la verificación del nombre falla incluso con un certificado válido.
- Incluir un paquete de CA demasiado grande: la memoria flash es de 4 MB, pero la RAM de 520 KB limita el número de CAs cargadas en memoria.
- Confundir la CA raíz con el certificado intermedio: solo se debe proporcionar la raíz.
- Fecha del sistema incorrecta: sin NTP, los certificados parecerán fuera de validez; sincroniza la hora primero.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython