Cuando un servidor utiliza SSL/TLS, no solo encripta la comunicación para que nadie la lea, también debe demostrar quién es. Si tu ESP32 se conecta a broker.aws.com, ¿cómo sabe que realmente es Amazon y no la computadora del hacker que interceptó el router y falsificó la ruta?
Para esto existen los Certificados de Autoridad Raíz (Root CA). Son llaves maestras públicas emitidas por empresas de confianza mundial (como Starfield, DigiCert o Amazon Root CA 1). Si tú le "enseñas" a tu ESP32 cómo luce la firma de Amazon, cuando el ESP32 se conecte, le exigirá al servidor que le muestre su pasaporte digital. Si el pasaporte está firmado por la CA de Amazon, el ESP32 confía y establece el canal encriptado. Si el hacker intenta falsificar el pasaporte, la matemática fallará y el ESP32 abortará la conexión.
Procesar certificados TLS requiere multiplicaciones de matrices y números primos de 2048 bits (Algoritmo RSA/AES). Si el STM32 hiciera esto, se quedaría bloqueado por segundos y la Tarea de Metrología crashearía. Afortunadamente, el ESP32 tiene aceleración criptográfica por hardware (MbedTLS). El ESP32 se "come" todo el problema, y tu STM32 seguirá comunicándose con él en texto plano por UART, mientras el ESP32 encripta y desencripta todo lo que entra y sale por el aire.
Paso 0 (Hardware Preparación): Descarga el certificado `AmazonRootCA1.pem`. Utiliza la herramienta oficial ESP-AT Flash Download Tool de Espressif en tu PC para inyectar este archivo dentro de la partición de memoria Flash del ESP32 dedicada a los "PKI" (Public Key Infrastructure). El certificado quedará asignado al Índice 0 dentro del chip.
Ejercicio 1 (Software): Modificaremos nuestra Máquina de Estados del STM32 (Día 204). Antes de conectarnos por TCP/MQTT, enviaremos la instrucción para que el ESP32 habilite el esquema TLS (Scheme 3) utilizando el certificado que le quemamos en el Índice 0, y cambiaremos el puerto estándar 1883 por el puerto seguro 8883.
/**
* @file mqtt_ssl_config.c
* @brief Configuración de Seguridad TLS y Validación de Certificado (CA) en ESP-AT
*/
#include "stm32f401xe.h"
#include "cmsis_os2.h"
#include <stdio.h>
// =======================================================
// CRÍTICO: REQUISITO DE RELOJ PARA TLS
// =======================================================
// Para que un certificado digital sea válido, el ESP32 NECESITA saber qué día es hoy,
// ya que los certificados tienen fecha de expiración.
// Por eso, la rutina NTP (Día 206) DEBE ejecutarse antes de intentar la conexión MQTT TLS.
// Asegúrate de enviar: AT+CIPSNTPCFG=1,-6,"pool.ntp.org"
// =======================================================
// CONFIGURACIÓN DE CONEXIÓN MQTT SEGURA
// =======================================================
/**
* @brief Configura las credenciales MQTT y el esquema de cifrado SSL/TLS
* @retval bool: true si el ESP32 aceptó la configuración de seguridad
*/
bool Configurar_Seguridad_MQTT(void) {
char comando_cfg[256];
UART_Enviar_String("[TLS] Configurando Motor Criptográfico MbedTLS...\r\n");
// SINTAXIS: AT+MQTTUSERCFG=<LinkID>,<scheme>,"<client_id>","<username>","<password>",<cert_key_id>,<CA_id>,"<path>"
// Parámetros Clave:
// <scheme> = 3 (Esto significa: Usar TLS y verificar rigurosamente el certificado del servidor).
// <CA_id> = 0 (Le dice al ESP32 que use el archivo AmazonRootCA1.bin que quemamos en la memoria Flash).
int len = snprintf(comando_cfg, sizeof(comando_cfg),
"AT+MQTTUSERCFG=0,3,\"%s\",\"usuario_aws\",\"pass_secreto\",0,0,\"\"\r\n",
DEVICE_ID);
// Enviamos la instrucción. (Esto solo configura variables internas en el ESP32, no conecta a internet aún)
if (AT_Enviar_Comando(comando_cfg, 2000)) {
UART_Enviar_String("[TLS] Esquema TLS Nivel 3 y CA Root configurados.\r\n");
return true;
}
return false;
}
/**
* @brief Inicia el Handshake TLS y abre el túnel seguro hacia AWS
*/
bool Abrir_Tunel_MQTT_Seguro(void) {
// AWS IoT Core Endpoint de tu cuenta (Ejemplo)
const char* AWS_ENDPOINT = "a3xxxxxxxxxxxx-ats.iot.us-east-1.amazonaws.com";
// PUERTO: El puerto inseguro de MQTT es 1883. El puerto seguro (MQTTS) es SIEMPRE 8883.
const int PUERTO_TLS = 8883;
char comando_conn[256];
snprintf(comando_conn, sizeof(comando_conn),
"AT+MQTTCONN=0,\"%s\",%d,1\r\n",
AWS_ENDPOINT, PUERTO_TLS);
UART_Enviar_String("[TLS] Iniciando Handshake Matemático (Esto tomará varios segundos)...\r\n");
// ADVERTENCIA: El Handshake TLS 1.2 requiere múltiples viajes de ida y vuelta a la nube,
// y el ESP32 hará cálculos pesados de llaves asimétricas RSA-2048.
// Le daremos un TIMEOUT de 15,000 milisegundos (15 segundos) para no abortar prematuramente.
if (AT_Enviar_Comando(comando_conn, 15000)) {
UART_Enviar_String("[TLS] ¡CONEXIÓN ESTABLECIDA! Túnel Encriptado Operativo.\r\n");
return true;
} else {
UART_Enviar_String("[TLS] ERROR FATAL: El Certificado fue rechazado o falló la conexión.\r\n");
return false;
}
}
// =======================================================
// INTEGRACIÓN EN LA FSM (Fragmento)
// =======================================================
/*
void Thread_WiFi_Modem(void *argument) {
for(;;) {
switch(estado_actual) {
case ESTADO_WIFI_CONECTAR:
// ... (Conectar a la red del router) ...
// Obligatorio obtener la hora de internet primero (NTP)
Sincronizar_Hora_NTP();
estado_actual = ESTADO_MQTT_CONFIG_TLS;
break;
case ESTADO_MQTT_CONFIG_TLS:
if (Configurar_Seguridad_MQTT()) {
if (Abrir_Tunel_MQTT_Seguro()) {
// Suscribirnos a comandos remotos (Día 214)
AT_Enviar_Comando("AT+MQTTSUB=0,\"gas_corp/+/control/#\",1\r\n", 3000);
estado_actual = ESTADO_IDLE_READY; // ¡Listos para la telemetría!
}
}
if (estado_actual != ESTADO_IDLE_READY) {
estado_actual = ESTADO_WIFI_HARD_RESET; // Error de seguridad, reiniciar todo.
}
break;
}
}
}
*/
Objetivo del día: Cumplimiento de Ciberseguridad Financiera (Protección contra Man-in-the-Middle y Eavesdropping).
Las redes WiFi de las estaciones de servicio son lugares hostiles. Muchas veces la contraseña está pegada en la oficina, visible para cualquiera. Si tu Despachador de Gas LP transmite la telemetría y los cierres de turno sin encriptación (Puerto 1883), cualquier persona en el rango de la señal con el software Wireshark puede interceptar cuántos litros de gas y dinero hay en tu tanque, exponiendo la estación a auditorías comprometidas, espionaje corporativo y ataques de inyección de comandos.
Al implementar **SSL/TLS mediante un Certificado de Autoridad (Root CA)**, has aislado cibernéticamente a la máquina. Cuando configuras el esquema criptográfico en 3 (`
AT+MQTTUSERCFG) y el ESP32 se encarga del resto mediante su motor interno MbedTLS.