Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MQTT-Bug with CA-Certificate #3425

Open
theo416 opened this issue Dec 7, 2024 · 71 comments
Open

MQTT-Bug with CA-Certificate #3425

theo416 opened this issue Dec 7, 2024 · 71 comments
Labels
bug Something isn't working Release16.0.0

Comments

@theo416
Copy link

theo416 commented Dec 7, 2024

The Problem

Bei der Angabe eines CA-Zertifikats im PEM-Format und anschließendem Neustart scheiterte die Verbindung zum MQTT-Broker.
Das X.509 CA-Zertifikat wurde mit openssl erstellt und von .crt in .pem umgewandelt, damit Konfiguration analog dem Konfigurationsbeispiel.
Die PKI funktioniert im restlichen Netzwerk für MQTT etc. problemlos!

Das Zertifikat wird laut Log erkannt.
MQTT-Verbindung kommt aber nicht zustande.

Der MQTT-Broker ist für TLS konfiguriert und wird auch schon damit verwendet.

Version

15.7.0

open Logfile
[0d00h00m00s] 2024-12-07T17:43:09 <INF> [MAIN] =================================================  
[0d00h00m00s] 2024-12-07T17:43:09 <INF> [MAIN] ==================== Start ======================  
[0d00h00m00s] 2024-12-07T17:43:09 <INF> [MAIN] =================================================  
[0d00h00m00s] 2024-12-07T17:43:09 <INF> [MAIN] PSRAM size: 8388608 byte (8MB / 64MBit)  
[0d00h00m00s] 2024-12-07T17:43:09 <INF> [MAIN] Total heap: 4380067 byte  
[0d00h00m04s] 2024-12-07T17:43:13 <INF> [MAIN] Camera info: PID: 0x26, VER: 0x42, MIDL: 0x7f, MIDH: 0xa2  
[0d00h00m04s] 2024-12-07T17:43:13 <INF> [SDCARD] Basic R/W check started...  
[0d00h00m04s] 2024-12-07T17:43:13 <INF> [SDCARD] Basic R/W check successful  
[0d00h00m04s] 2024-12-07T17:43:13 <INF> [SNTP] TimeServer: <ntp-server> 
[0d00h00m04s] 2024-12-07T17:43:13 <INF> [SNTP] Configuring NTP Client...  
[0d00h00m04s] 2024-12-07T18:43:13 <INF> [SNTP] Time zone set to CET-1CEST,M3.5.0,M10.5.0/3  
[0d00h00m04s] 2024-12-07T18:43:13 <INF> [SNTP] time zone: +0100 Delta to UTC: 3600 seconds  
[0d00h00m04s] 2024-12-07T18:43:13 <INF> [SNTP] Time is already set: 2024-12-07 18:43:13  
[0d00h00m04s] 2024-12-07T18:43:13 <INF> [MAIN] CPU frequency: 160 MHz  
[0d00h00m05s] 2024-12-07T18:43:14 <INF> [SDCARD] Folder/file presence check started...  
[0d00h00m05s] 2024-12-07T18:43:14 <INF> [SDCARD] Folder/file presence check successful  
[0d00h00m05s] 2024-12-07T18:43:14 <INF> [MAIN] Tag: 'v15.7.0', Release: v15.7.0 (Commit: 0d0b018+), Date/Time: 2024-02-17 00:15, Web UI: Release: v15.7.0 (Commit: 0d0b018+)  
[0d00h00m05s] 2024-12-07T18:43:14 <INF> [MAIN] Reset reason: Via esp_restart  
[0d00h00m05s] 2024-12-07T18:43:14 <INF> [WLANINI] SSID: <WLAN-SSID>
[0d00h00m05s] 2024-12-07T18:43:14 <INF> [WLANINI] Password: XXXXXXXX  
[0d00h00m05s] 2024-12-07T18:43:14 <INF> [WLANINI] Hostname: <Hostname>
[0d00h00m05s] 2024-12-07T18:43:14 <INF> [WLANINI] RSSIThreshold: -75  
[0d00h00m05s] 2024-12-07T18:43:14 <INF> [MAIN] WLAN config loaded, init WIFI...  
[0d00h00m05s] 2024-12-07T18:43:14 <INF> [WIFI] Automatic interface config --> Use DHCP service  
[0d00h00m05s] 2024-12-07T18:43:14 <INF> [WIFI] Set hostname to: <Hostname>  
[0d00h00m05s] 2024-12-07T18:43:14 <INF> [WIFI] Init successful  
[0d00h00m12s] 2024-12-07T18:43:21 <INF> [WIFI] Connected to: <WLAN-SSID>, RSSI: -76  
[0d00h00m14s] 2024-12-07T18:43:23 <INF> [WIFI] Assigned IP: <IP-Adresse> 
[0d00h00m25s] 2024-12-07T18:43:34 <INF> [MAIN] Device info: CPU cores: 2, Chip revision: 100  
[0d00h00m25s] 2024-12-07T18:43:34 <INF> [MAIN] SD card info: Name: 00000, Capacity: 14991MB, Free: 14966MB  
[0d00h00m27s] 2024-12-07T18:43:36 <INF> [MAIN] Initialization completed successfully  
[0d00h00m29s] 2024-12-07T18:43:38 <INF> [LOGFILE] Set log level to DEBUG  
[0d00h00m29s] 2024-12-07T18:43:38 <DBG> [MQTT] Digitizer interval is 5.0 minutes => setting MQTT LWT timeout to 12.5 minutes.  
[0d00h00m29s] 2024-12-07T18:43:38 <INF> [MQTT IF] using caCert: /config/certs/RootCA.pem  
[0d00h00m29s] 2024-12-07T18:43:38 <DBG> [MQTT IF] URI: mqtts://<mqtt-broker-fqdn>:8883, clientname: <Hostname>, user: <MQTT-User>, password: XXXXXXXX, maintopic: watermeter, last-will-topic: watermeter/connection, keepAlive: 750, RetainFlag: 1  
[0d00h00m29s] 2024-12-07T18:43:38 <INF> [MQTT IF] Init  
[0d00h00m29s] 2024-12-07T18:43:38 <INF> [MQTT IF] Client started, waiting for established connection...  
[0d00h00m29s] 2024-12-07T18:43:38 <INF> [MAINCTRL] Starting Flow...  
[0d00h00m29s] 2024-12-07T18:43:38 <DBG> [MAINCTRL] ----------------------------------------------------------------  
[0d00h00m29s] 2024-12-07T18:43:38 <INF> [MAINCTRL] Round #1 started  
[0d00h00m29s] 2024-12-07T18:43:38 <DBG> [FLOWCTRL] Status: Take Image (18:43:38)  
[0d00h00m29s] 2024-12-07T18:43:38 <DBG> [MQTT IF] Publish skipped. Client not initalized or not connected. (topic: watermeter/status)  
[0d00h00m29s] 2024-12-07T18:43:38 <DBG> [PSRAM] Init shared memory for step 'Take Image' (STBI buffers)  
[0d00h00m30s] 2024-12-07T18:43:39 <DBG> [OTA FILE] log_get_last_part_handler  
[0d00h00m33s] 2024-12-07T18:43:42 <DBG> [PSRAM] Allocated 18456 bytes in PSRAM for 'STBI'  
[0d00h00m33s] 2024-12-07T18:43:42 <DBG> [PSRAM] Freeing memory in PSRAM used for 'STBI'...  
[0d00h00m33s] 2024-12-07T18:43:42 <DBG> [PSRAM] Allocated 18456 bytes in PSRAM for 'STBI'  
[0d00h00m33s] 2024-12-07T18:43:42 <DBG> [PSRAM] Allocating memory (307215 bytes) for STBI (use shared memory in PSRAM)...  
[0d00h00m33s] 2024-12-07T18:43:42 <DBG> [PSRAM] Allocating memory (153615 bytes) for STBI (use shared memory in PSRAM)...  
[0d00h00m33s] 2024-12-07T18:43:42 <DBG> [PSRAM] Allocating memory (153615 bytes) for STBI (use shared memory in PSRAM)...  
[0d00h00m33s] 2024-12-07T18:43:42 <DBG> [PSRAM] Allocated 643 bytes in PSRAM for 'STBI'  
[0d00h00m33s] 2024-12-07T18:43:43 <DBG> [PSRAM] Allocated 643 bytes in PSRAM for 'STBI'  
[0d00h00m33s] 2024-12-07T18:43:43 <DBG> [PSRAM] Allocated 643 bytes in PSRAM for 'STBI'  
[0d00h00m33s] 2024-12-07T18:43:43 <DBG> [PSRAM] Allocating memory (921601 bytes) for STBI (use shared memory in PSRAM)...  
[0d00h00m34s] 2024-12-07T18:43:43 <DBG> [PSRAM] Part of shared memory used for STBI (PSRAM, part of shared memory) is free again  
[0d00h00m34s] 2024-12-07T18:43:43 <DBG> [PSRAM] Freeing memory in PSRAM used for 'STBI'...  
[0d00h00m34s] 2024-12-07T18:43:43 <DBG> [PSRAM] Part of shared memory used for STBI (PSRAM, part of shared memory) is free again  
[0d00h00m34s] 2024-12-07T18:43:43 <DBG> [PSRAM] Freeing memory in PSRAM used for 'STBI'...  
[0d00h00m34s] 2024-12-07T18:43:43 <DBG> [PSRAM] Part of shared memory used for STBI (PSRAM, part of shared memory) is free again  
[0d00h00m34s] 2024-12-07T18:43:43 <DBG> [PSRAM] Freeing memory in PSRAM used for 'STBI'...  
[0d00h00m34s] 2024-12-07T18:43:43 <DBG> [PSRAM] Freeing memory in PSRAM used for 'STBI'...  
[0d00h00m36s] 2024-12-07T18:43:45 <DBG> [C IMG BASIS] Not freeing (zwImage as there was never PSRAM allocated for it)  
[0d00h00m36s] 2024-12-07T18:43:45 <DBG> [PSRAM] Deinit shared memory for step 'Take Image' (STBI buffers)  
[0d00h00m36s] 2024-12-07T18:43:45 <DBG> [FLOWCTRL] Status: Aligning (18:43:45)  
[0d00h00m36s] 2024-12-07T18:43:45 <DBG> [MQTT IF] Publish skipped. Client not initalized or not connected. (topic: watermeter/status)  
[0d00h00m37s] 2024-12-07T18:43:46 <DBG> [PSRAM] Allocating tmpImage (921600 bytes, use shared memory in PSRAM)...  
[0d00h00m39s] 2024-12-07T18:43:48 <INF> [SNTP] Time is synced with NTP Server <ntp-server>: 2024-12-07 18:43:48  
[0d00h00m40s] 2024-12-07T18:43:49 <DBG> [PSRAM] Allocated 18456 bytes in PSRAM for 'STBI'  
[0d00h00m40s] 2024-12-07T18:43:49 <DBG> [PSRAM] Freeing memory in PSRAM used for 'STBI'...  
[0d00h00m40s] 2024-12-07T18:43:49 <DBG> [PSRAM] Allocated 18456 bytes in PSRAM for 'STBI'  
[0d00h00m40s] 2024-12-07T18:43:49 <DBG> [PSRAM] Allocated 2319 bytes in PSRAM for 'STBI'  
[0d00h00m40s] 2024-12-07T18:43:49 <DBG> [PSRAM] Allocated 591 bytes in PSRAM for 'STBI'  
[0d00h00m40s] 2024-12-07T18:43:49 <DBG> [PSRAM] Allocated 591 bytes in PSRAM for 'STBI'  
[0d00h00m40s] 2024-12-07T18:43:49 <DBG> [PSRAM] Allocated 43 bytes in PSRAM for 'STBI'  
[0d00h00m40s] 2024-12-07T18:43:49 <DBG> [PSRAM] Allocated 43 bytes in PSRAM for 'STBI'  
[0d00h00m40s] 2024-12-07T18:43:49 <DBG> [PSRAM] Allocated 43 bytes in PSRAM for 'STBI'  
[0d00h00m40s] 2024-12-07T18:43:49 <DBG> [PSRAM] Allocated 4201 bytes in PSRAM for 'STBI'  
[0d00h00m40s] 2024-12-07T18:43:49 <DBG> [PSRAM] Freeing memory in PSRAM used for 'STBI'...  
[0d00h00m40s] 2024-12-07T18:43:49 <DBG> [PSRAM] Freeing memory in PSRAM used for 'STBI'...  
[0d00h00m40s] 2024-12-07T18:43:49 <DBG> [PSRAM] Freeing memory in PSRAM used for 'STBI'...  
[0d00h00m40s] 2024-12-07T18:43:49 <DBG> [PSRAM] Freeing memory in PSRAM used for 'STBI'...  
[0d00h00m40s] 2024-12-07T18:43:49 <DBG> [PSRAM] Freeing memory in PSRAM used for 'STBI'...  
[0d00h00m40s] 2024-12-07T18:43:49 <DBG> [PSRAM] Freeing memory in PSRAM used for 'STBI'...  
[0d00h00m40s] 2024-12-07T18:43:49 <DBG> [PSRAM] Freeing memory in PSRAM used for 'STBI'...  
[0d00h00m44s] 2024-12-07T18:43:53 <DBG> [PSRAM] Freeing memory in PSRAM used for 'STBI'...  
[0d00h00m44s] 2024-12-07T18:43:53 <DBG> [PSRAM] Allocated 18456 bytes in PSRAM for 'STBI'  
[0d00h00m44s] 2024-12-07T18:43:53 <DBG> [PSRAM] Freeing memory in PSRAM used for 'STBI'...  
[0d00h00m44s] 2024-12-07T18:43:53 <DBG> [PSRAM] Allocated 18456 bytes in PSRAM for 'STBI'  
[0d00h00m44s] 2024-12-07T18:43:53 <DBG> [PSRAM] Allocated 2063 bytes in PSRAM for 'STBI'  
[0d00h00m44s] 2024-12-07T18:43:53 <DBG> [PSRAM] Allocated 527 bytes in PSRAM for 'STBI'  
[0d00h00m44s] 2024-12-07T18:43:53 <DBG> [PSRAM] Allocated 527 bytes in PSRAM for 'STBI'  
[0d00h00m44s] 2024-12-07T18:43:53 <DBG> [PSRAM] Allocated 66 bytes in PSRAM for 'STBI'  
[0d00h00m44s] 2024-12-07T18:43:53 <DBG> [PSRAM] Allocated 66 bytes in PSRAM for 'STBI'  
[0d00h00m44s] 2024-12-07T18:43:53 <DBG> [PSRAM] Allocated 66 bytes in PSRAM for 'STBI'  
[0d00h00m44s] 2024-12-07T18:43:53 <DBG> [PSRAM] Allocated 3970 bytes in PSRAM for 'STBI'  
[0d00h00m44s] 2024-12-07T18:43:53 <DBG> [PSRAM] Freeing memory in PSRAM used for 'STBI'...  
[0d00h00m44s] 2024-12-07T18:43:53 <DBG> [PSRAM] Freeing memory in PSRAM used for 'STBI'...  
[0d00h00m44s] 2024-12-07T18:43:53 <DBG> [PSRAM] Freeing memory in PSRAM used for 'STBI'...  
[0d00h00m44s] 2024-12-07T18:43:53 <DBG> [PSRAM] Freeing memory in PSRAM used for 'STBI'...  
[0d00h00m44s] 2024-12-07T18:43:53 <DBG> [PSRAM] Freeing memory in PSRAM used for 'STBI'...  
[0d00h00m44s] 2024-12-07T18:43:53 <DBG> [PSRAM] Freeing memory in PSRAM used for 'STBI'...  
[0d00h00m44s] 2024-12-07T18:43:53 <DBG> [PSRAM] Freeing memory in PSRAM used for 'STBI'...  
**[0d00h00m44s] 2024-12-07T18:43:53 <ERR> [MQTT IF] Other event id:**  
[0d00h00m44s] 2024-12-07T18:43:53 <WRN> [MQTT IF] Disconnected, trying to reconnect  
[0d00h00m46s] 2024-12-07T18:43:55 <DBG> [PSRAM] Freeing memory in PSRAM used for 'STBI'...  
[0d00h00m52s] 2024-12-07T18:44:01 <DBG> [PSRAM] Shared memory used for tmpImage (PSRAM, part of shared memory) is free again  
[0d00h00m52s] 2024-12-07T18:44:01 <DBG> [FLOWCTRL] Status: Digitalization of ROIs (18:44:01)  
[0d00h00m52s] 2024-12-07T18:44:01 <DBG> [MQTT IF] Publish skipped. Client not initalized or not connected. (topic: watermeter/status)  
[0d00h00m52s] 2024-12-07T18:44:01 <DBG> [CNN] doFlow after alignment  
[0d00h00m52s] 2024-12-07T18:44:01 <DBG> [PSRAM] Allocating Tensor Arena (819200 bytes, use shared memory in PSRAM)...  
[0d00h00m52s] 2024-12-07T18:44:01 <DBG> [TFLITE] CTfLiteClass::LoadModel  
[0d00h00m52s] 2024-12-07T18:44:01 <DBG> [TFLITE] CTfLiteClass::ReadFileToModel: /sdcard/config/dig-cont_0700_s3_q.tflite  
[0d00h00m52s] 2024-12-07T18:44:01 <DBG> [TFLITE] Loading Model /sdcard/config/dig-cont_0700_s3_q.tflite /size: 315504 bytes...  
[0d00h00m52s] 2024-12-07T18:44:01 <DBG> [PSRAM] Allocating Model memory (1363148 bytes, use shared memory in PSRAM)...  
[0d00h00m52s] 2024-12-07T18:44:01 <DBG> [TFLITE] CTfLiteClass::MakeAllocate  
[0d00h00m52s] 2024-12-07T18:44:01 <DBG> [CNN] Processing Number 'main'  
[0d00h00m52s] 2024-12-07T18:44:01 <DBG> [CNN] ROI #0 - TfLite  
[0d00h00m52s] 2024-12-07T18:44:01 <DBG> [CNN] CNN Type: DoubleHyprid10  
[0d00h00m55s] 2024-12-07T18:44:04 <DBG> [CNN] After Invoke  
[0d00h00m55s] 2024-12-07T18:44:04 <DBG> [CNN] ROI #1 - TfLite  
[0d00h00m55s] 2024-12-07T18:44:04 <DBG> [CNN] CNN Type: DoubleHyprid10  
[0d00h00m58s] 2024-12-07T18:44:07 <DBG> [CNN] After Invoke  
[0d00h00m58s] 2024-12-07T18:44:07 <DBG> [CNN] ROI #2 - TfLite  
[0d00h00m58s] 2024-12-07T18:44:07 <DBG> [CNN] CNN Type: DoubleHyprid10  
[0d00h01m00s] 2024-12-07T18:44:09 <DBG> [CNN] After Invoke  
[0d00h01m00s] 2024-12-07T18:44:09 <DBG> [CNN] ROI #3 - TfLite  
[0d00h01m00s] 2024-12-07T18:44:09 <DBG> [CNN] CNN Type: DoubleHyprid10  
[0d00h01m03s] 2024-12-07T18:44:12 <DBG> [CNN] After Invoke  
[0d00h01m03s] 2024-12-07T18:44:12 <DBG> [CNN] ROI #4 - TfLite  
[0d00h01m03s] 2024-12-07T18:44:12 <DBG> [CNN] CNN Type: DoubleHyprid10  
[0d00h01m06s] 2024-12-07T18:44:15 <DBG> [CNN] After Invoke  
[0d00h01m06s] 2024-12-07T18:44:15 <DBG> [CNN] ROI #5 - TfLite  
[0d00h01m06s] 2024-12-07T18:44:15 <DBG> [CNN] CNN Type: DoubleHyprid10  
**[0d00h01m07s] 2024-12-07T18:44:16 <ERR> [MQTT IF] Other event id:**  
[0d00h01m07s] 2024-12-07T18:44:16 <WRN> [MQTT IF] Disconnected, trying to reconnect  
[0d00h01m08s] 2024-12-07T18:44:17 <DBG> [CNN] After Invoke  
[0d00h01m08s] 2024-12-07T18:44:17 <DBG> [CNN] ROI #6 - TfLite  
[0d00h01m08s] 2024-12-07T18:44:17 <DBG> [CNN] CNN Type: DoubleHyprid10  
[0d00h01m11s] 2024-12-07T18:44:20 <DBG> [CNN] After Invoke  
[0d00h01m11s] 2024-12-07T18:44:20 <DBG> [CNN] ROI #7 - TfLite  
[0d00h01m11s] 2024-12-07T18:44:20 <DBG> [CNN] CNN Type: DoubleHyprid10  
[0d00h01m14s] 2024-12-07T18:44:23 <DBG> [CNN] After Invoke  
[0d00h01m14s] 2024-12-07T18:44:23 <DBG> [PSRAM] Shared memory used for Tensor Arena and model (PSRAM, part of shared memory) is free again  
[0d00h01m14s] 2024-12-07T18:44:23 <DBG> [FLOWCTRL] Status: Post-Processing (18:44:23)  
[0d00h01m14s] 2024-12-07T18:44:23 <DBG> [MQTT IF] Publish skipped. Client not initalized or not connected. (topic: watermeter/status)  
[0d00h01m14s] 2024-12-07T18:44:23 <DBG> [CNN] getReadout _analog=0, _extendedResolution=0, prev=-1  
[0d00h01m14s] 2024-12-07T18:44:23 <DBG> [CNN] getReadout(dig100) prev=0  
[0d00h01m14s] 2024-12-07T18:44:23 <DBG> [CNN] getReadout#PointerEvalHybridNew()= 1  
[0d00h01m14s] 2024-12-07T18:44:23 <DBG> [POSTPROC] handleAllowNegativeRate for device: main  
[0d00h01m14s] 2024-12-07T18:44:23 <INF> [POSTPROC] main: Raw: 000xx.xx, Value: xx.xxx, Status: no error  
[0d00h01m14s] 2024-12-07T18:44:23 <DBG> [FLOWCTRL] Status: Sending MQTT (18:44:23)  
[0d00h01m14s] 2024-12-07T18:44:23 <DBG> [MQTT IF] Publish skipped. Client not initalized or not connected. (topic: watermeter/status)  
[0d00h01m14s] 2024-12-07T18:44:23 <WRN> [MQTT SERVER] Unable to send Static Topics, we are not connected to the MQTT broker!  
[0d00h01m14s] 2024-12-07T18:44:23 <WRN> [MQTT SERVER] One or more MQTT topics failed to be published, will try sending them in the next round!  
[0d00h01m14s] 2024-12-07T18:44:23 <WRN> [MQTT SERVER] Unable to send System Topics, we are not connected to the MQTT broker!  
[0d00h01m14s] 2024-12-07T18:44:23 <WRN> [MQTT] One or more MQTT topics failed to be published!  
[0d00h01m14s] 2024-12-07T18:44:23 <DBG> [MQTT IF] Publish skipped. Client not initalized or not connected. (topic: watermeter/status)  
[0d00h01m14s] 2024-12-07T18:44:23 <INF> [MAINCTRL] Round #1 completed (45 seconds)  
[0d00h01m14s] 2024-12-07T18:44:23 <DBG> [MAINCTRL] CPU Temperature: 53°C  
[0d00h01m14s] 2024-12-07T18:44:23 <DBG> [MAINCTRL] WIFI Signal (RSSI): -81dBm  
[0d00h01m14s] 2024-12-07T18:44:23 <DBG> [WIFI] Roaming: Start scan of all channels for SSID <WLAN-SSID>  
[0d00h01m17s] 2024-12-07T18:44:26 <DBG> [WIFI] Roaming: Current AP BSSID=xx:xx:xx:xx:xx:xx  
[0d00h01m17s] 2024-12-07T18:44:26 <DBG> [WIFI] Roaming: Scan completed, APs found with configured SSID: 1  
[0d00h01m17s] 2024-12-07T18:44:26 <DBG> [WIFI] Roaming: 1: SSID=<WLAN-SSID>, BSSID=xx:xx:xx:xx:xx:xx, RSSI=-82, CH=6, AUTH=WPA2 PSK  
[0d00h01m17s] 2024-12-07T18:44:26 <DBG> [WIFI] Roaming: Scan completed, stay on current AP  
**[0d00h01m22s] 2024-12-07T18:44:31 <ERR> [MQTT IF] Other event id:**  
[0d00h01m22s] 2024-12-07T18:44:31 <WRN> [MQTT IF] Disconnected, trying to reconnect  
**[0d00h01m37s] 2024-12-07T18:44:46 <ERR> [MQTT IF] Other event id:**  
[0d00h01m37s] 2024-12-07T18:44:46 <WRN> [MQTT IF] Disconnected, trying to reconnect  
**[0d00h01m37s] 2024-12-07T18:44:46 <ERR> [MQTT IF] Disconnected, multiple reconnect attempts failed, still retrying...**  
**[0d00h01m52s] 2024-12-07T18:45:01 <ERR> [MQTT IF] Other event id:**  
[0d00h01m52s] 2024-12-07T18:45:01 <WRN> [MQTT IF] Disconnected, trying to reconnect  
**[0d00h02m07s] 2024-12-07T18:45:16 <ERR> [MQTT IF] Other event id:**  
[0d00h02m07s] 2024-12-07T18:45:16 <WRN> [MQTT IF] Disconnected, trying to reconnect  
[0d00h02m12s] 2024-12-07T18:45:21 <DBG> [OTA FILE] log_get_last_part_handler  
**[0d00h02m22s] 2024-12-07T18:45:31 <ERR> [MQTT IF] Other event id:**  
[0d00h02m22s] 2024-12-07T18:45:31 <WRN> [MQTT IF] Disconnected, trying to reconnect  
**[0d00h02m37s] 2024-12-07T18:45:46 <ERR> [MQTT IF] Other event id:**  
[0d00h02m37s] 2024-12-07T18:45:46 <WRN> [MQTT IF] Disconnected, trying to reconnect  
**[0d00h02m52s] 2024-12-07T18:46:01 <ERR> [MQTT IF] Other event id:**  
[0d00h02m52s] 2024-12-07T18:46:01 <WRN> [MQTT IF] Disconnected, trying to reconnect  
**[0d00h02m52s] 2024-12-07T18:46:01 <ERR> [MQTT IF] Disconnected, multiple reconnect attempts failed, still retrying...**  
**[0d00h03m07s] 2024-12-07T18:46:16 <ERR> [MQTT IF] Other event id:**  
[0d00h03m07s] 2024-12-07T18:46:16 <WRN> [MQTT IF] Disconnected, trying to reconnect  
**[0d00h03m22s] 2024-12-07T18:46:31 <ERR> [MQTT IF] Other event id:**  
[0d00h03m22s] 2024-12-07T18:46:31 <WRN> [MQTT IF] Disconnected, trying to reconnect  
**[0d00h03m37s] 2024-12-07T18:46:47 <ERR> [MQTT IF] Other event id:**  
[0d00h03m38s] 2024-12-07T18:46:47 <WRN> [MQTT IF] Disconnected, trying to reconnect  
**[0d00h03m53s] 2024-12-07T18:47:02 <ERR> [MQTT IF] Other event id:**  
[0d00h03m53s] 2024-12-07T18:47:02 <WRN> [MQTT IF] Disconnected, trying to reconnect  
**[0d00h04m08s] 2024-12-07T18:47:17 <ERR> [MQTT IF] Other event id:**  
[0d00h04m08s] 2024-12-07T18:47:17 <WRN> [MQTT IF] Disconnected, trying to reconnect  
**[0d00h04m08s] 2024-12-07T18:47:17 <ERR> [MQTT IF] Disconnected, multiple reconnect attempts failed, still retrying...**  
**[0d00h04m23s] 2024-12-07T18:47:32 <ERR> [MQTT IF] Other event id:**  
[0d00h04m23s] 2024-12-07T18:47:32 <WRN> [MQTT IF] Disconnected, trying to reconnect  
[0d00h04m28s] 2024-12-07T18:47:37 <DBG> [OTA FILE] download_get_handler  
**[0d00h04m38s] 2024-12-07T18:47:47 <ERR> [MQTT IF] Other event id:**  
[0d00h04m38s] 2024-12-07T18:47:47 <WRN> [MQTT IF] Disconnected, trying to reconnect  
**[0d00h05m00s] 2024-12-07T18:48:09 <ERR> [MQTT IF] Other event id:**  
[0d00h05m00s] 2024-12-07T18:48:09 <WRN> [MQTT IF] Disconnected, trying to reconnect  
[0d00h05m10s] 2024-12-07T18:48:19 <DBG> [OTA FILE] delete_post_handler  
[0d00h05m10s] 2024-12-07T18:48:19 <DBG> [OTA FILE] File deleted: /config/config.ini  
[0d00h05m10s] 2024-12-07T18:48:19 <DBG> [OTA FILE] upload_post_handler  
[0d00h05m10s] 2024-12-07T18:48:19 <DBG> [OTA FILE] File saved: /config/config.ini  
[0d00h05m14s] 2024-12-07T18:48:23 <DBG> [OTA] handler_reboot  
[0d00h05m14s] 2024-12-07T18:48:23 <INF> [OTA] !!! System will restart within 5 sec!!!  
[0d00h05m14s] 2024-12-07T18:48:23 <INF> [OTA] Reboot triggered by Software (5s)  
[0d00h05m14s] 2024-12-07T18:48:23 <WRN> [OTA] Reboot in 5sec  
**[0d00h05m15s] 2024-12-07T18:48:24 <ERR> [MQTT IF] Other event id:**  
[0d00h05m15s] 2024-12-07T18:48:24 <WRN> [MQTT IF] Disconnected, trying to reconnect  
[0d00h05m24s] 2024-12-07T18:48:33 <DBG> [MAIN SERVER] info_get_handler

Expected Behavior

Ich würde erwarten, dass der ESP mit dem konfigurierten Zertifikat den Server validiert und sich anschließend mit diesem verbindet.

Screenshots

No response

Additional Context

Untenstehend der Log-Auszug des mosquitto-Brokers. Dieser könnte interessant sein. Der erste Such-Match führte zu openssl #22690.

2024-12-07T18:45:16: New connection from <ip-address-blurred>:54088 on port 8883.
2024-12-07T18:45:16: OpenSSL Error[0]: error:0A000126:SSL routines::unexpected eof while reading
2024-12-07T18:45:16: Client <unknown> disconnected: Protocol error.
… wiederholt sich
@theo416 theo416 added the bug Something isn't working label Dec 7, 2024
@SybexX
Copy link
Collaborator

SybexX commented Dec 7, 2024

@theo416 vielleicht hilft dir das weiter: #3211

@theo416
Copy link
Author

theo416 commented Dec 7, 2024

@SybexX Danke für die schnelle Hilfe. Die Issues habe ich selbst gar nicht gefunden, sorry...

Mein Server hat tatsächlich nur >= TLS1.3 akzeptiert. Nachdem ich dies auf TLS 1.2 umgestellt habe, ging es aber leider immernoch nicht.
Was ich noch herausgelesen habe, könnte es auch die Key-Size sein, die zu hoch ist (bei mir auch 4096).

Der Issue wurde allerdings schon geschlossen. @LordGuilly wollte dies noch auf seinem alten Gerät nachsehen.

@SybexX
Copy link
Collaborator

SybexX commented Dec 7, 2024

@theo416 Ich persönlich nutze TLS nicht und habe es auch nicht ausprobiert, aber soweit ich weiß, sollten dafür folgende Einschränkungen gelten:

  • Der SSL/TLS-Server muss TLS 1.2 unterstützen.
  • Das Serverzertifikat muss über einen privaten RSA-Schlüssel (max. 2048 Bit) verfügen und das Zertifikat muss mit RSA- und SHA256-Hash signiert sein.

Möglicherweise gibt es noch weitere Einschränkungen, die mir aber nicht bekannt sind.

@theo416
Copy link
Author

theo416 commented Dec 7, 2024

@SybexX dann wird das wahrscheinlich mein Problem mit dem 4096 RSA-Schlüssel sein.
Ich werde die Verbindung also weiterhin über non-TLS laufen lassen.

Vielleicht würde der ESP hier auch an/über sein Hardwarelimit kommen. Kann das jemand bestätigen?
Wäre auch hilfreich, wenn diese Infos (Key-Typ, TLS-Version, Key-Size etc.) in der Hover-Hilfe angezeigt werden würden.

@SybexX
Copy link
Collaborator

SybexX commented Dec 7, 2024

@theo416 Ich habe mal in der konfig nachgeguckt "CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096", daher sollten 4096 Bits eigentlich auch funktionieren?

folgendes habe ich noch gefunden:
Der SSL/TLS sollte TLS 1.2 MFLN unterstützen, um den Puffer auf 1024 Byte zu begrenzen. Wenn MFLN nicht unterstützt wird, funktioniert es trotzdem gut, solange der Server keine Nachrichten über 1024 Byte sendet.

@theo416
Copy link
Author

theo416 commented Dec 7, 2024

@SybexX Oke interessant!

Ich habe gerade die Pakete mithilfe von Wireshark mitgeschnitten, um zu sehen, ob die Pakete < 1024 Byte sind (MFLN-Thematik). Dabei ist mir aber etwas anderes aufgefallen.
Folgenden Ablauf konnte ich erkennen:

  • Der ESP sendet ein TCP SYN an den Server → OK
  • Der Server bestätigt mit SYN+ACK → OK
  • Der ESP bestätigt mit einem ACK → OK, TCP-Handshake erfolgreich
  • 24ms darauf sendet der ESP ein FIN-Flag an den Server → Nicht OK; Er beendet die Verbindung
  • Der Server antwortet mit untenstehendem TLS-Fehler → OK, angemessene Reaktion
  • Der Server sendet ein ACK zum FIN des ESP → OK
  • Der ESP sendet zwei RST hinterher → Verbindung weg → OK
Internet Protocol Version 4, Src: <server-ip>, Dst: <esp32-ip>
Transmission Control Protocol, Src Port: 8883, Dst Port: 52205, Seq: 1, Ack: 2, Len: 7
Transport Layer Security
    TLSv1.2 Record Layer: Alert (Level: Fatal, Description: Decode Error)
        Content Type: Alert (21)
        Version: TLS 1.2 (0x0303)
        Length: 2
        Alert Message
            Level: Fatal (2)
            Description: Decode Error (50)

Stellt sich also die Frage, wieso der ESP hier ein FIN-Flag sendet?! Ich werde nicht schlau daraus.

@SybexX
Copy link
Collaborator

SybexX commented Dec 7, 2024

@theo416 Ich habe noch etwas Unstimmiges gefunden, weiß aber nicht, ob es die Fehlerursache ist, ich habe mich noch nicht so intensiv mit MQTT beschäftigt.
@jomjol @caco3 Kann dies die Fehlerursache sein?
Unbenannt

caco3 added a commit that referenced this issue Dec 8, 2024
@caco3
Copy link
Collaborator

caco3 commented Dec 8, 2024

Danke @SybexX und @theo416 fürs Untersuchen.
Die Schwierigkeit ist, dass offenbar @LordGuilly der Einzige ist, der das jemals (in einer älteren version) getestet hat. Von uns Devs. konnte das mangels Infrastruktur und Wissen niemand testen.

Wäre auch hilfreich, wenn diese Infos (Key-Typ, TLS-Version, Key-Size etc.) in der Hover-Hilfe angezeigt werden würden.

Das wäre auf jeden Fall sinnvoll, bedingt aber, dass wir es verstehen :)
Du kannst uns helfen, indem Du es in https://github.com/jomjol/AI-on-the-edge-device/blob/main/param-docs/parameter-pages/MQTT/CACert.md besser dokumentierst.

Der Buffer wurde vor 2 Jahren von @Slider0007 in b85e3b1#diff-6e8bbe681cd5657650e19160363d8373be48a263e692a7d15e075064e062c611R226 eingeführt. Mit der Migration zu ESP IDF 5.0.1 in 17ffd28#diff-6e8bbe681cd5657650e19160363d8373be48a263e692a7d15e075064e062c611R264 wurde er nur umbenannt.

Wir können CONFIG_MQTT_BUFFER_SIZE testweise mal auf 4096 erhöhen.
@theo416 Kannst Du mal den obersten Build von https://github.com/jomjol/AI-on-the-edge-device/actions?query=branch%3AIncreased-CONFIG_MQTT_BUFFER_SIZE ausprobieren? beachte, dass ich es selber nicht getestet habe!

@theo416
Copy link
Author

theo416 commented Dec 8, 2024

@caco3 Danke fürs Ändern der config.

Sobald wir das Problem behoben haben, werde ich die Hover-Hilfe auf jeden Fall (versuchen) anzupassen.

Ich habe gerade den Build Development-Branch: Increased-CONFIG_MQTT_BUFFER_SIZE (Commit: 8c5b77f+) ausprobiert. Es kommt aber genau das gleiche dabei raus.
Der Log, die TCP-Pakete und die Broker-Fehlernachricht sehen genau gleich aus!

Soweit ich das in der untenstehenden Codezeile sehen kann, überprüft der ESP den CN des Zertifikats gar nicht (was ein weiterer Grund für eine Verbindungsablehnung wäre).

mqtt_cfg.broker.verification.skip_cert_common_name_check = true;

Ich weiß nicht, wie wir den Fehler weiter eingrenzen könnten. Eventuell beim MQTT-Verbindungsaufbau mehr DEBUG-Nachichten ausgeben, bis wohin der Code überhaupt kommt?

@SybexX
Copy link
Collaborator

SybexX commented Dec 8, 2024

zu skip_cert_common_name_check steht in der esp-idf:
Überspringen Sie jegliche Validierung des CN-Felds des Serverzertifikats.
Dies verringert die Sicherheit von TLS und macht den MQTT-Client anfällig für MITM-Angriffe

@Slider0007
Copy link
Collaborator

Slider0007 commented Dec 8, 2024

Wir können CONFIG_MQTT_BUFFER_SIZE testweise mal auf 4096 erhöhen.
@theo416 Kannst Du mal den obersten Build von https://github.com/jomjol/AI-on-the-edge-device/actions?query=branch%3AIncreased-CONFIG_MQTT_BUFFER_SIZE ausprobieren? beachte, dass ich es selber nicht getestet habe!

@caco3: Nur das Ändern der sdkconfig hilft leider nicht, um hier was anderes zu testen, solange der Code nicht angepasst wird. Der Code schlägt die config. Ich persönlich habe TLS nur mit RSA2048 getestet. 4096 bisher nicht, daher kann ich nicht sagen, ob das überhaupt der limitierende Faktor ist. Nur die ESP Fehlermeldung hilft hier weiter. Auf der Console müssten ebenfalls zusätzliche Diagnose (inkl. Reject Reason) ausgegeben werden. @theo416 Daher wäre es hilfreich, die den Consolen Log zu sehen. (https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/error-codes.html)
Weiterer Debug könnte einkompliliert werden (Achtung LOGD):

Das X.509 CA-Zertifikat wurde mit openssl erstellt und von .crt in .pem umgewandelt,

@theo416: Wie/warum hast du gewandelt? Fileendung ist nicht wirklich relevant, nur Inhalt sollte Base64-ASCII-coded sein. Bitte prüfe, dass es am Ende eine Newline vorhanden ist. Auch wichtig: Only unencrypted and not password protected files are supported.

image

Soweit ich das in der untenstehenden Codezeile sehen kann, überprüft der ESP den CN des Zertifikats gar nicht (was ein weiterer Grund für eine Verbindungsablehnung wäre).

Normalerweise sollte die Verbindung deswegen nicht rejected werden. Außer du hast deinen Server sehr restritiv eingestellt. Ich weiß aber aus dem Stand nicht, ob dies überhaupt so konfiguriert werden könnte. Zwar nicht die sicherste Variante, aber dafür für den User einfacher zu handeln.

@theo416
Copy link
Author

theo416 commented Dec 8, 2024

@Slider0007 danke für deine Hilfe!
Ich habe das Zertifikat in .pem gewandelt, damit es genauso wie das Beispiel in der Hover-Hilfe konfiguriert ist, um Fehler zu vermeiden. Gewandelt habe ich es mittels openssl x509 -in RootCA.crt -out RootCA.pem -outform PEM. Ist mir dann auch aufgefallen, dass sich da am Dateiinhalt nichts ändert...
Das Zertifikat ist auch nicht passwortgeschützt. Newline am Ende existiert. Datei ist auch Base64-ASCII codiert.

Zu skip_cert_common_name_check: Wäre das nicht sinnvoller, hier eine Checkbox im Config-UI einzubauen? Stellt sich nur die Frage, wie sich dann das Programm verhalten würde.
Mein "MQTT Explorer" auf Windows verweigert die Verbindung, wenn das Zertifikat nicht stimmt. Erst wenn ich den Haken "Validate certificate" herausnehme, würde es funktionieren. Wäre dann aber für MITM-Angriffe wieder anfälliger.

Ich krame mal meinen TTL-Konverter heraus und melde mich dann mit dem Console-Log wieder bei euch.

@Slider0007
Copy link
Collaborator

Slider0007 commented Dec 8, 2024

den Haken "Validate certificate" herausnehme,

Wenn es da ohne Haken funktioniert, dann funktioniert es auch mit deaktiviertem Check, da genau das mit dem Flag ausgeschaltet wird. Es kann natürlich alles konfigurierbar gemacht werden. Man sieht aber auch jetzt schon, dass das die Mehrheit mit den aktuellen Einstellmöglichkeiten nicht versteht ;-) Könnte aber prinzipiell konfigurierbar gemacht werden.
Bezgl. Sicherheit (MITM attack) sehe ich das nicht so kritisch, da wir ja kein Atomkraftwerk betreiben ;-)

Ich krame mal meinen TTL-Konverter heraus und melde mich dann mit dem Console-Log wieder bei euch.

Das geht auch mit der Webconsole (Webinstaller)

@theo416
Copy link
Author

theo416 commented Dec 8, 2024

den Haken "Validate certificate" herausnehme,

Wenn es da ohne Haken funktioniert, dann funktioniert es auch mit deaktiviertem Check, da genau das mit dem Flag ausgeschaltet wird.

Das habe ich schon verstanden.
Wenn ich Validate certificate auf false (Aus) stelle, ist dass das gleiche wie skip_cert_common_name_check auf true zu stellen.
Diese Option gibt es auch bei sämtlichen anderen Programmen/Anwendungen und hat schon seinen Sinn.
Aber das ist hier jetzt zum Glück erstmal zweitranging 😜.

Hier der Output des Console-Logs:

I (29969) MQTT IF: using caCert: /config/certs/RootCA.pem
I (29989) MQTT IF: Init
I (30009) MQTT IF: Client started, waiting for established connection...
I (30039) MAINCTRL: Starting Flow...
E (30089) esp-tls-mbedtls: No server verification option set in esp_tls_cfg_t structure. Check esp_tls API reference
E (30089) esp-tls-mbedtls: Failed to set client configurations, returned [0x8017] (UNKNOWN ERROR)
E (30099) esp-tls: create_ssl_handle failed
E (30099) esp-tls: Failed to open new connection
E (30099) transport_base: Failed to open a new connection
E (30109) mqtt_client: Error transport connect
E (30109) MQTT IF: Other event id:
I (30119) MAINCTRL: Round #1 started
E (30129) MQTT IF: Other event id:0
W (30129) MQTT IF: Disconnected, trying to reconnect

Das sieht doch ganz interessant aus!

@Slider0007
Copy link
Collaborator

Slider0007 commented Dec 8, 2024

@theo416

Das ist interessant. Das sieht nach Fehlkonfiguration im ESP aus.
Vielleicht ist das mit der genutzen ESP-IDF Version 5.3.1 inzwischen anderst geregelt. Bisher war dies zumindest nicht notwendig. Ich persönlich nutze noch die ESP-IDF 5.2.1 und mit dieser Version muss dies (noch) nicht in der sdkconfig aktiviert werden.

Du kannst diesen Testbuild (https://github.com/jomjol/AI-on-the-edge-device/actions?query=branch%3AIncreased-CONFIG_MQTT_BUFFER_SIZE) testen und den Log posten. Ich habe da die entsprechenden Flags gesetzt und den Puffer wieder auf Originalgröße gesetzt.

@theo416
Copy link
Author

theo416 commented Dec 8, 2024

@Slider0007

Das sieht sehr gut aus! Mit deinem neuen Testbuild Development-Branch: Increased-CONFIG_MQTT_BUFFER_SIZE (Commit: dfdeac8+) bekomme ich folgende Ausgabe:

I (13949) MQTT IF: using caCert: /config/certs/RootCA.pem
I (13969) MQTT IF: Init
I (13979) MQTT IF: Client started, waiting for established connection...
I (13989) MAINCTRL: Starting Flow...
I (14029) MAINCTRL: Round #1 started
I (14729) MQTT IF: Connected to broker

Die Verbindung zum Broker steht!

2024-12-08T19:33:59: New connection from <esp-ip>:64467 on port 8883.
2024-12-08T19:34:00: New client connected from <esp-ip>:64467 as <Hostname> (p2, c1, k750, u'<MQTT-User>').

@Slider0007
Copy link
Collaborator

Slider0007 commented Dec 8, 2024

@theo416
Danke fürs Testen.

@caco3
Zur Info. Ich hatte der Einfachheit halber deinen Branch gekapert. Es scheinen zwei Flags zu fehlen, um unsichere TLS Verbindungen wieder zu unterstützen. Dies ist aktuell (wie bisher auch) weiterhin hard codiert.

@caco3
Copy link
Collaborator

caco3 commented Dec 9, 2024

Ich hatte der Einfachheit halber deinen Branch gekapert.

Super! Danke für euren Einsatz!

Mir ist nicht klar, wieso das eine unsichere TSL-Verbindung bedingt, das Zertifikat ist doch gültig! Oder ist das wie bei selbst-signierten SSL-Zertifikaten?
Gibt es ein Szenario wo das insecure und skip nicht benötigt werden? Sprich, ist es nötig, dass wir dazu Parameter einführen? Oder braucht das sowieso jeder?

Ich habe mal einen PR dafür angelegt: #3427

@Slider0007
Copy link
Collaborator

Slider0007 commented Dec 9, 2024

Ich würde das so interpretieren, dass das Flag CONFIG_ESP_TLS_INSECURE eine Art Master-Flag ist, um dann mit weiteren Flags teils unsichere Teilaspekte aktivieren zu können, wie z.B. die Deaktivierung der Server Verifikation (Schutz gegen MITM Attacken). Dies ist das einzige Umstand, welcher "unsicher" ist. Es wird nur das Zertifikat verifiziert (das Zerifikat muss gültig sein), aber nicht der Ursprung des Zerifikats. Somit ist die Verbindung potentiell unsicher, weil nicht klar ist, wo das Zerifikat her kommt. Daher meist interessant, wenn der Endpoint im Internet liegt.

siehe Beschreibung hier: https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/kconfig.html#config-esp-tls-insecure und https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/kconfig.html#config-esp-tls-skip-server-cert-verify

Es könnte sein, dass das zweite Flag CONFIG_ESP_TLS_SKIP_SERVER_CERT_VERIFY in der sdkconfig nicht zwingend gesetzt werden muss, da dies bereits in Software passiert durch Setzen von

mqtt_cfg.broker.verification.skip_cert_common_name_check = true;

Die Server Verifikation könnte der Vollständigkeit halber natürlich auch konfigurierbar gemacht werden, ist aber dann eine weitere Konfigurationshürde / Fallstrick. Es sollte von den betreuen Devs eben auch verstanden werden können, ansonsten tut man sich keinen Gefallen. Ich persönlich würde es so lassen, da die meisten Ihr Zerifikat sowieso selbst generieren und wissen wo es herkommt. Für den Fall, dass einer die Verbindung kaperen sollte, weiß dieser eben einen Zählerstand ;-)

@SybexX
Copy link
Collaborator

SybexX commented Dec 9, 2024

@Slider0007 @theo416 wie erstellt ihr die Zertifikate, bei mir will es leider nicht funktionieren^^
meine Zertifikate habe ich nach folgender Anleitung erstellt: https://mosquitto.org/man/mosquitto-tls-7.html

@theo416
Copy link
Author

theo416 commented Dec 9, 2024

@SybexX Ich habe meine PKI so aufgebaut:

Dazu hier aufklappen

CA-Zertifikat erstellen

mkdir CA

Privaten Schlüssel erzeugen

openssl genrsa -des3 -out CA/RootCA.key

PEM pass Phrase vergeben, merken und geheim halten! Sehr sehr wichtig

Öffentlichen Schlüssel dazu erzeugen

openssl req -new -x509 -days <Gültigkeitsdauer in Tagen> -key CA/RootCA.key -out CA/RootCA.crt

Daten ausfüllen (müssen nicht unbedingt alle sein)
Common Name wird später immer als "friendly Name" angezeigt

Server-Zertifikat erstellen

mkdir Server-Certs

Privaten Schlüssel erzeugen

openssl genrsa -out Server-Certs/Server_mosquitto.key 4096

Config-File anlegen

Diesen Weg habe ich gewählt, damit ich mehrere DNS-Adressen etc. angeben kann (mit und ohne Domain...)

nano Server-Certs/Server_mosquitto.conf
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no

[req_distinguished_name]
C = DE
ST = <Bundesland>
O = <Firmenname ö.ä.>
CN = <friendly Server-Name>

[v3_req]
keyUsage = digitalSignature
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1 = mqtt-srv.org.lan
DNS.2 = mqtt-srv
DNS.3 = <Server-IP>
<Andere CNAME's etc.>

Certificate signing request anlegen

openssl req -new -key Server-Certs/Server_mosquitto.key -out Server-Certs/Server_mosquitto.csr -config Server-Certs/Server_mosquitto.conf

Zertifikat mit CA signieren

openssl x509 -req -sha256 -days <Gültigkeitsdauer in Tagen> \
  -in Server-Certs/Server_mosquitto.csr \
  -CA CA/RootCA.crt \
  -CAkey CA/RootCA.key \
  -CAcreateserial \
  -out Server-Certs/Server_mosquitto.crt \
  -extfile Server-Certs/Server_mosquitto.conf -extensions v3_req

Zertifikat auf MQTT-Broker laden

Die Dateien Server-Certs/Server_mosquitto.key und Server-Certs/Server_mosquitto.crt auf den Broker hochladen.

Zertifikat in Config aktivieren

nano /etc/mosquitto/conf.d/ssl.conf
listener 8883

cafile /etc/mosquitto/ca_certificates/RootCA.crt
keyfile /etc/mosquitto/certs/Server_mosquitto.key
certfile /etc/mosquitto/certs/Server_mosquitto.crt
tls_version tlsv1.2

@caco3 @Slider0007 Ich schließe mich da @Slider0007 im ersten Teil an.
Den Parameter skip_cert_common_name_check in das Config-File aufzunehmen wäre aber natürlich klasse.
Ich kenne sämtliche andere gebräuchliche Anwendungen (da fallen mir so einige spontan ein), bei denen man hier den Flag setzen kann.

Hier ein kurzer Auszug aus ESP-IDF:
grafik

Was halten die anderen Devs davon? Die Hover-Hilfe könnte ich dazu auch erstellen, wenn ihr mir kurz erklärt, wie :)

@caco3 caco3 mentioned this issue Dec 23, 2024
4 tasks
@caco3
Copy link
Collaborator

caco3 commented Dec 23, 2024

Ja, ich denke, einen zusätzlichen Parameter dafür wäre sinnvoll.

@theo416 Für den zusätzlichen Parameter musst Du

@SybexX
Copy link
Collaborator

SybexX commented Dec 24, 2024

@theo416 Ich habe deine Änderungen(patch-1, patch-2, patch-3, patch-4) übernommen und alles, was noch nötig war, in einen Branch gepackt, es aber noch nicht getestet.
https://github.com/jomjol/AI-on-the-edge-device/tree/mqtt-add-ValidateServerCert-Parameter
https://github.com/jomjol/AI-on-the-edge-device/actions/runs/12476447885

@theo416
Copy link
Author

theo416 commented Dec 24, 2024

@SybexX Danke fürs schnelle Ändern

Ein paar Dinge sind mir noch aufgefallen:

  • Der Parameter ist noch ausgegraut.
  • Meine Backslashes vom Zeilenumbruch in der Hilfe sind noch störend denke ich
  • Der Parameter ValidateServerCert muss invertiert auf das Flag mqtt_cfg.broker.verification.skip_cert_common_name_check wirken. ValidateServerCert=true → skip_cert_common_name_check=false

grafik

@SybexX
Copy link
Collaborator

SybexX commented Dec 24, 2024

https://github.com/jomjol/AI-on-the-edge-device/actions/runs/12480968919

Es ist ausgegraut, wenn der Parameter in der config.ini auskommentiert ist (unbenutzter Parameter) ";ValidateServerCert = true"
Für ein Zeilenumbruch mußt du ein <br> verwenden.

@theo416
Copy link
Author

theo416 commented Dec 24, 2024

Ich habe die letzte Firmware (Commit: 4d74d0c+) getestet. Die Konfigurationsseite lädt nicht mehr. Nur der oberste Teil erscheint. Der Rest ist weiß. Habe schon neu gestartet etc.
Es trat aber auch kein HTTP-Fehler auf!

In der config.ini ist der Parameter noch nicht eingetragen.

grafik

Auch das manuelle Hinzufügen + Reboot des Parameters brachte bei mir nichts.

@theo416
Copy link
Author

theo416 commented Dec 28, 2024

Aha, es hat sich etwas geändert:

ValidateServerCert = true & false

I (30592) MQTT IF: using caCert: /config/certs/rootCA.pem
I (30632) MQTT IF: Init
I (30662) MQTT IF: Client started, waiting for established connection...
I (30692) MAINCTRL: Starting Flow...
I (30732) MAINCTRL: Round #1 started
E (32602) esp-tls-mbedtls: global_cacert is NULL                                                 <-------------------
E (32602) esp-tls-mbedtls: Failed to set client configurations, returned [0x0103] (UNKNOWN ERROR)
E (32602) esp-tls: create_ssl_handle failed
E (32612) esp-tls: Failed to open new connection
E (32612) transport_base: Failed to open a new connection
E (32622) mqtt_client: Error transport connect
E (32622) MQTT IF: Other event id:
E (32642) MQTT IF: Other event id:0
W (32642) MQTT IF: Disconnected, trying to reconnect

Siehe Pfeil.

@SybexX
Copy link
Collaborator

SybexX commented Dec 28, 2024

@theo416
Copy link
Author

theo416 commented Dec 28, 2024

Jetzt verbindet er sich erfolgreich mit dem MQTT-Broker, aber akzeptiert auch den Server mit dem "fake"-Zertifikat...
ValidateServerCert wieder true und false getestet :)

@SybexX
Copy link
Collaborator

SybexX commented Jan 2, 2025

Da beim Aktivieren der Überprüfung keine Verbindung zustande kommt, würde ich sagen, dass bei der Erstellung des Zertifikats etwas nicht stimmt bzw. der ESP etwas anderes erwartet oder es ein bug diesbezüglich in der esp-idf gibt.
Wenn man mit diesem Zertifikatstyp arbeiten möchten, muß man die Überprüfung deaktivieren und beim Herstellen der Verbindung das entsprechende Flag (event->error_handle->esp_tls_cert_verify_flags) überprüfen und bei Nichtübereinstimmung des Zertifikats die Verbindung trennen.

@theo416
Copy link
Author

theo416 commented Jan 4, 2025

Wollt ihr das umsetzen? Ansonsten belassen wir es beim Alten.
Dann wäre aber auch der Parameter Root CA Certificate file überflüssig, da das Zertifikat sowieso nicht geprüft wird oder?

@SybexX
Copy link
Collaborator

SybexX commented Jan 4, 2025

ich habe da noch was gefunden:

            const char *common_name;         /*!< Pointer to the string containing server certificate common name.
                                                               If non-NULL, server certificate CN must match this name,
                                                               If NULL, server certificate CN must match hostname.
                                                               This is ignored if skip_cert_common_name_check=true.

in unserem Fall ist "If NULL, server certificate CN must match hostname." zutreffend, da common_name nirgends gesetzt wird.
Welchen CN verwendest du?

@theo416
Copy link
Author

theo416 commented Jan 4, 2025

So sieht meine Konfigurationsdatei für das Server Zertifikat aus (Servername ist abgeändert).

Der CN enthält nur eine Beschreibung des Servers.
Der Rest wurde durch die Alt-Names konfiguriert.

[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no

[req_distinguished_name]
C = DE
ST = <Bundesland>
O = <Wert>
CN = Mqtt-Broker

[v3_req]
keyUsage = digitalSignature
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1 = srv.home.lan
DNS.2 = srv
DNS.3 = mqtt.home.lan (CNAME)
DNS.4 = mqtt
IP.1 = 10.1.1.10

Wahrscheinlich prüft der ESP wirklich nur den CN und nicht die Alt-Names oder?

Sämtliche MQTT TLS-Clients kommen mit dieser Konfiguration zurecht. Diese verbinden sich mithilfe des Hostname unter DNS.3

@SybexX
Copy link
Collaborator

SybexX commented Jan 4, 2025

Wahrscheinlich prüft der ESP wirklich nur den CN und nicht die Alt-Names oder?

davon gehe ich auch aus und sämtliche Beispiele die ich im internet gefunden habe, hatten immer

CONFIG_ESP_TLS_INSECURE=y
CONFIG_ESP_TLS_SKIP_SERVER_CERT_VERIFY=y 

mqtt_cfg.broker.verification.skip_cert_common_name_check = true.

und dann findet ja überhaupt keine Überprüfung statt^^

@theo416
Copy link
Author

theo416 commented Jan 4, 2025

Tut mir leid, dass ich das nicht schon früher erwähnt habe...

Ich habe über das Thema nicht so richtig viel gefunden, nur diesen mbedtls Issue. Da ging es aber nur darum, dass in der Zertifikats-Konfiguration unter den alt_names IP.x = nicht erkannt wurde und durch DNS.x = ersetzt werden musste.
Was ich sonst so herausgelesen habe, hat da die Verbindung mit den subjectAltName funktioniert.

Korrektur zu meiner Zertifikatskonfiguration: Ich habe gerade DNS.5 = 10.1.1.10 geändert auf IP.1 = 10.1.1.10. So ist es korrekt (Quelle). Bringt uns aber in unserem Fall nicht weiter...

Aber dann werden/müssen wir es wohl bei der Verbindung ohne Überprüfung belassen.

@SybexX
Copy link
Collaborator

SybexX commented Jan 4, 2025

wenn ich es im esp-idf code richtig verfolgt habe, muß MQTT_ENABLE_SSL aktiviert werden um mqtt_cfg.broker.verification.skip_cert_common_name_check wirksam zu machen und es hat nichts mit CONFIG_ESP_TLS_SKIP_SERVER_CERT_VERIFY=y zu tun.
Und wenn ich es richtig verstanden habe, sind clientCert + clientKey für MQTTS(SSL) zuständig, daher dürfte es auch nichts mit caCert zu tun haben.

    if (cfg->skip_cert_common_name_check) {
#if defined(MQTT_SUPPORTED_FEATURE_SKIP_CRT_CMN_NAME_CHECK) && MQTT_ENABLE_SSL
        esp_transport_ssl_skip_common_name_check(ssl);
#else
        ESP_LOGE(TAG, "Skip certificate common name check is not available in IDF version %s", IDF_VER);
        goto esp_mqtt_set_transport_failed;
#endif
    }

CONFIG_ESP_TLS_SKIP_SERVER_CERT_VERIFY hat Auswirkung auf "esp_tls_cfg.common_name"

/**
 * @brief      ESP-TLS configuration parameters
 *
 * @note       Note about format of certificates:
 *             - This structure includes certificates of a Certificate Authority, of client or server as well
 *             as private keys, which may be of PEM or DER format. In case of PEM format, the buffer must be
 *             NULL terminated (with NULL character included in certificate size).
 *             - Certificate Authority's certificate may be a chain of certificates in case of PEM format,
 *             but could be only one certificate in case of DER format
 *             - Variables names of certificates and private key buffers and sizes are defined as unions providing
 *             backward compatibility for legacy *_pem_buf and *_pem_bytes names which suggested only PEM format
 *             was supported. It is encouraged to use generic names such as cacert_buf and cacert_bytes.
 */
typedef struct esp_tls_cfg {
    const char **alpn_protos;               /*!< Application protocols required for HTTP2.
                                                 If HTTP2/ALPN support is required, a list
                                                 of protocols that should be negotiated.
                                                 The format is length followed by protocol
                                                 name.
                                                 For the most common cases the following is ok:
                                                 const char **alpn_protos = { "h2", NULL };
                                                 - where 'h2' is the protocol name */

    union {
    const unsigned char *cacert_buf;        /*!< Certificate Authority's certificate in a buffer.
                                                 Format may be PEM or DER, depending on mbedtls-support
                                                 This buffer should be NULL terminated in case of PEM */
    const unsigned char *cacert_pem_buf;    /*!< CA certificate buffer legacy name */
    };

    union {
    unsigned int cacert_bytes;              /*!< Size of Certificate Authority certificate
                                                 pointed to by cacert_buf
                                                 (including NULL-terminator in case of PEM format) */
    unsigned int cacert_pem_bytes;          /*!< Size of Certificate Authority certificate legacy name */
    };

    union {
    const unsigned char *clientcert_buf;    /*!< Client certificate in a buffer
                                                 Format may be PEM or DER, depending on mbedtls-support
                                                 This buffer should be NULL terminated in case of PEM */
    const unsigned char *clientcert_pem_buf;     /*!< Client certificate legacy name */
    };

    union {
    unsigned int clientcert_bytes;          /*!< Size of client certificate pointed to by
                                                 clientcert_pem_buf
                                                 (including NULL-terminator in case of PEM format) */
    unsigned int clientcert_pem_bytes;      /*!< Size of client certificate legacy name */
    };

    union {
    const unsigned char *clientkey_buf;     /*!< Client key in a buffer
                                                 Format may be PEM or DER, depending on mbedtls-support
                                                 This buffer should be NULL terminated in case of PEM */
    const unsigned char *clientkey_pem_buf; /*!< Client key legacy name */
    };

    union {
    unsigned int clientkey_bytes;           /*!< Size of client key pointed to by
                                                 clientkey_pem_buf
                                                 (including NULL-terminator in case of PEM format) */
    unsigned int clientkey_pem_bytes;       /*!< Size of client key legacy name */
    };

    const unsigned char *clientkey_password;/*!< Client key decryption password string */

    unsigned int clientkey_password_len;    /*!< String length of the password pointed to by
                                                 clientkey_password */

    bool use_ecdsa_peripheral;              /*!< Use the ECDSA peripheral for the private key operations */

    uint8_t ecdsa_key_efuse_blk;            /*!< The efuse block where the ECDSA key is stored */

    bool non_block;                         /*!< Configure non-blocking mode. If set to true the
                                                 underneath socket will be configured in non
                                                 blocking mode after tls session is established */

    bool use_secure_element;                /*!< Enable this option to use secure element or
                                                 atecc608a chip */

    int timeout_ms;                         /*!< Network timeout in milliseconds.
                                                 Note: If this value is not set, by default the timeout is
                                                 set to 10 seconds. If you wish that the session should wait
                                                 indefinitely then please use a larger value e.g., INT32_MAX */

    bool use_global_ca_store;               /*!< Use a global ca_store for all the connections in which
                                                 this bool is set. */

    const char *common_name;                /*!< If non-NULL, server certificate CN must match this name.
                                                 If NULL, server certificate CN must match hostname. */

    bool skip_common_name;                  /*!< Skip any validation of server certificate CN field */

    tls_keep_alive_cfg_t *keep_alive_cfg;   /*!< Enable TCP keep-alive timeout for SSL connection */

    const psk_hint_key_t* psk_hint_key;     /*!< Pointer to PSK hint and key. if not NULL (and certificates are NULL)
                                                 then PSK authentication is enabled with configured setup.
                                                 Important note: the pointer must be valid for connection */

    esp_err_t (*crt_bundle_attach)(void *conf);
                                            /*!< Function pointer to esp_crt_bundle_attach. Enables the use of certification
                                                 bundle for server verification, must be enabled in menuconfig */

    void *ds_data;                          /*!< Pointer for digital signature peripheral context */
    bool is_plain_tcp;                      /*!< Use non-TLS connection: When set to true, the esp-tls uses
                                                 plain TCP transport rather then TLS/SSL connection.
                                                 Note, that it is possible to connect using a plain tcp transport
                                                 directly with esp_tls_plain_tcp_connect() API */

    struct ifreq *if_name;                  /*!< The name of interface for data to go through. Use the default interface without setting */

#ifdef CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS
    esp_tls_client_session_t *client_session; /*! Pointer for the client session ticket context. */
#endif /* CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS */

    esp_tls_addr_family_t addr_family;      /*!< The address family to use when connecting to a host. */
    const int *ciphersuites_list;           /*!< Pointer to a zero-terminated array of IANA identifiers of TLS ciphersuites.
                                                Please check the list validity by esp_tls_get_ciphersuites_list() API */
    esp_tls_proto_ver_t tls_version;        /*!< TLS protocol version of the connection, e.g., TLS 1.2, TLS 1.3 (default - no preference) */
} esp_tls_cfg_t;

@theo416
Copy link
Author

theo416 commented Jan 12, 2025

Das bedeutet für uns jetzt folgendes?
Nur Zertifikate mit korrektem CN funktionieren?

@SybexX
Copy link
Collaborator

SybexX commented Jan 21, 2025

@theo416 ein neuer Versuch: https://github.com/jomjol/AI-on-the-edge-device/actions/runs/12944046286/artifacts/2479055357

Da ich bis jetzt irgendwie es immer noch nicht mit den Zertifikaten hinbekommen habe, auch nach deiner Anleitung funktioniert es leider nicht, kann ich die Änderungen nicht testen. Ich weiß nicht was da schief läuft, vieleicht liegt es auch am Iobroker selber, wer weiß^^

@SybexX
Copy link
Collaborator

SybexX commented Jan 21, 2025

so ich habe jetzt einen test-broker auf mein linux pc erstellt und getestet, mein Resultat:

  • wenn CONFIG_ESP_TLS_INSECURE=y nicht gesetzt wird ist CONFIG_ESP_TLS_SKIP_SERVER_CERT_VERIFY=y ohne Funktion
  • wenn CONFIG_ESP_TLS_INSECURE=y und CONFIG_ESP_TLS_SKIP_SERVER_CERT_VERIFY=y gesetzt sind, kann ich jedes Zertifikat(sogar ein völlig leeres) auf die SD vom ESP32 packen und die Verbindung kommt trotzdem zustande ^^
  • wenn CONFIG_ESP_TLS_INSECURE=y und CONFIG_ESP_TLS_SKIP_SERVER_CERT_VERIFY=y nicht gesetzt sind, kommt eine Fehlermeldung, dass tls nicht konfiguriert ist und es kommt keine Verbindung zustande ^^

Image

@theo416
Copy link
Author

theo416 commented Jan 22, 2025

Das ist echt komisch...

Soll ich deinen Run von obentrotzdem noch testen?

@SybexX
Copy link
Collaborator

SybexX commented Jan 23, 2025

@theo416 Ich habe jetzt den Fehler in der Firmware gefunden, jetzt muss ich nur noch einen Weg finden, ihn zu fixen.^^

@SybexX
Copy link
Collaborator

SybexX commented Jan 24, 2025

@theo416 https://github.com/jomjol/AI-on-the-edge-device/actions/runs/12944046286/artifacts/2479055357

bereits von mir getestet:

  • falsches Ca-Zertifikat >>>>> keine Verbindung möglich
  • leeres Ca-Zertifikat >>>>> keine Verbindung möglich
  • richtiges Ca-Zertifikat + falscher CN + skip_cert_common_name_check = false >>>>> keine Verbindung möglich
  • richtiges Ca-Zertifikat + falscher CN + skip_cert_common_name_check = true >>>>> Verbindung möglich

jetzt fehlt noch:

  • richtiges Ca-Zertifikat + richtiger CN + skip_cert_common_name_check = false
  • abgelaufenes Ca-Zertifikat
  • SSL Verbindung (ca.crt + client.crt + client.key)
  • und noch weitere, die dir eventuell einfallen

Habe das Ca-Zertifikat immer nur beim ESP32 getauscht, geht schneller als es beim Broker zu machen^^
Ich gehe aber mal von aus, dass sich am Verhalten des ESPs nichts ändert, wenn man das Ca-Zertifikat beim Broker tauscht.

Ein Problem war mitunter, dass der Dateipfad nicht passte. Da hat immer "/sdcard" davor gefehlt(CACert = /config/certs/RootCA.crt mußte man auf CACert = /sdcard/config/certs/RootCA.crt ändern) und dadurch konnte kein Zertifikat geladen werden. Ich habe das jetzt nur provisorisch gefixt, indem ich beim lesen des Parameters "/sdcard" hinzufüge. Wenn ich zeit habe, wollte ich eine Überprüfung hinzufügen, damit man beide Varianten nutzen kann.

@caco3
Copy link
Collaborator

caco3 commented Jan 24, 2025

Cool!

Ein Problem war mitunter, dass der Dateipfad nicht passte.

Alle anderen Pfadangaben in der config sind relative zu /scdard, z.B. /log/source. Daher wäre es hier konsistent, wenn man /config/certs/RootCA.crt angeben müsste. Das steht ja auch schon so in der Hilfe.
Meiner Meinung nach muss die SW keine andere Varianten automatisch testen.

@SybexX
Copy link
Collaborator

SybexX commented Jan 24, 2025

Ich habe einige interessante Informationen über alt_names gefunden: https://www.emqx.com/en/blog/emqx-server-ssl-tls-secure-connection-configuration-guide

Image

@theo416
Copy link
Author

theo416 commented Jan 24, 2025

@SybexX Perfekt. Dann teile ich hier mal meine weiteren Ergebnisse.
Beachte, dass ich hier wieder meine Alt_Names verwende, und nicht direkt das CN-Feld!

CA-Cert Alt-Name (Serverseite) ValidateServerCert Verbindung aufgebaut Grund
1 richtig richtig true Ja Zertifikat wird geprüft → stimmt
2 richtig richtig false Ja Zertifikat wird nicht geprüft
3 richtig falsch (Fake-Server) true Nein Zertifikat wird geprüft und abgelehnt → OK → siehe Log unten
4 richtig falsch (Fake-Server) false Ja Zertifikat wird nicht geprüft → Potentiell MITM
5 richtig abgelaufen true Ja Fehler! Verbindung aufgebaut, obwohl Server-Cert abgelaufen und Validierung aktiv. MQTT-Explorer zeigt "expired" und lehnt ab.
6 richtig abgelaufen false Ja Sollte passen, da Zertifikat nicht überprüft wird
7 abgelaufen richtig true Ja Fehler! Verbindung wird aufgebaut, obwohl CA-Cert abgelaufen.
8 abgelaufen richtig false Ja Könnte passen, da Zertifikat nicht überprüft wird
9 abgelaufen falsch (Fake-Server) true Nein Zertifikat wird geprüft und abgelehnt → OK → siehe Log unten
10 abgelaufen falsch (Fake-Server) false Ja Könnte passen, da Zertifikat nicht überprüft wird
11 abgelaufen abgelaufen true Ja Fehler! Verbindung wird aufgebaut, obwohl beide Certs abgelaufen!
12 abgelaufen abgelaufen false Ja Verbindung wird aufgebaut
13 leer richtig true Nein CA-Cert parse-Fehler → siehe Log unten
14 leer richtig false Nein siehe 13 (gleiche Meldung)

SSL-Verbindung:

CA-Cert client.crt & client.key Alt-Name ValidateServerCert Verbindung aufgebaut Grund
50 richtig richtig richtig true In Bearbeitung
51 richtig richtig richtig false In Bearbeitung
52 richtig richtig falsch (Fake-Server) true In Bearbeitung
53 richtig richtig falsch (Fake-Server) false In Bearbeitung
54 richtig falsch richtig true In Bearbeitung
55 richtig falsch richtig false In Bearbeitung
56 richtig falsch falsch (Fake-Server) true In Bearbeitung
57 richtig falsch falsch (Fake-Server) false In Bearbeitung
58 abgelaufen richtig richtig true In Bearbeitung
59 abgelaufen richtig richtig false In Bearbeitung

Dabei ist skip_cert_common_name_check = !ValidateServerCert

Zur Zeile 3:

E (16152) esp-tls-mbedtls: mbedtls_ssl_handshake returned -0x2700
I (16152) esp-tls-mbedtls: Failed to verify peer certificate!
E (16152) esp-tls: Failed to open new connection
E (16152) transport_base: Failed to open a new connection
E (16162) mqtt_client: Error transport connect
E (16162) MQTT IF: Other event id:
E (16182) MQTT IF: Other event id:0
W (16182) MQTT IF: Disconnected, trying to reconnect

Zu Zeile 9:

E (110862) esp-tls-mbedtls: mbedtls_ssl_handshake returned -0x2700
I (110862) esp-tls-mbedtls: Failed to verify peer certificate!
E (110862) esp-tls: Failed to open new connection
E (110862) transport_base: Failed to open a new connection
E (110872) mqtt_client: Error transport connect

Zu Zeile 13:

E (30062) esp-tls-mbedtls: mbedtls_x509_crt_parse of CA cert returned -0x1100
E (30062) esp-tls-mbedtls: Failed to set client configurations, returned [0x8015] (UNKNOWN ERROR)
E (30062) esp-tls: create_ssl_handle failed
E (30072) esp-tls: Failed to open new connection
E (30072) transport_base: Failed to open a new connection
E (30082) mqtt_client: Error transport connect

Gib mir für die restlichen Einträge noch etwas Zeit. Ich muss es erst schaffen, ein abgelaufenes CA-Cert zu erstellen, sowie die Client-Zertifikate zu erstellen...

Ich habe einige interessante Informationen über alt_names gefunden: https://www.emqx.com/en/blog/emqx-server-ssl-tls-secure-connection-configuration-guide

Genau das habe ich hier gemacht. Der Artikel ist dennoch schön übersichtlich! Danke dafür.

@SybexX
Copy link
Collaborator

SybexX commented Jan 24, 2025

Genau das habe ich #3425 (comment) gemacht. Der Artikel ist dennoch schön übersichtlich! Danke dafür.

ja schon, du hast aber auch die IPs unter DNS. eingetragen und ich weiß nicht ob es zum Fehler beim ESP führt bzw. ob sie dann vom ESP richtig berücksichtigt werden.

DNS.1 = srv.home.lan
DNS.2 = srv
DNS.3 = mqtt.home.lan (CNAME)
DNS.4 = mqtt
DNS.5 = 10.1.1.10

@theo416
Copy link
Author

theo416 commented Jan 24, 2025

Das habe ich hier berichtigt. Sollte also auch kein Problem mehr sein!

Korrektur zu meiner Zertifikatskonfiguration: Ich habe gerade DNS.5 = 10.1.1.10 geändert auf IP.1 = 10.1.1.10. So ist es korrekt (Quelle). Bringt uns aber in unserem Fall nicht weiter...

@SybexX
Copy link
Collaborator

SybexX commented Jan 24, 2025

habe ich voll übersehen^^

@SybexX
Copy link
Collaborator

SybexX commented Jan 24, 2025

@theo416 zu alt_name habe ich jetzt folgendes in der espidf gefunden:

.platformio\packages\framework-espidf\components\mbedtls\mbedtls\library\x509.c (ab Zeile 1289)

/*
 * SubjectAltName ::= GeneralNames
 *
 * GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName
 *
 * GeneralName ::= CHOICE {
 *      otherName                       [0]     OtherName,
 *      rfc822Name                      [1]     IA5String,
 *      dNSName                         [2]     IA5String,
 *      x400Address                     [3]     ORAddress,
 *      directoryName                   [4]     Name,
 *      ediPartyName                    [5]     EDIPartyName,
 *      uniformResourceIdentifier       [6]     IA5String,
 *      iPAddress                       [7]     OCTET STRING,
 *      registeredID                    [8]     OBJECT IDENTIFIER }
 *
 * OtherName ::= SEQUENCE {
 *      type-id    OBJECT IDENTIFIER,
 *      value      [0] EXPLICIT ANY DEFINED BY type-id }
 *
 * EDIPartyName ::= SEQUENCE {
 *      nameAssigner            [0]     DirectoryString OPTIONAL,
 *      partyName               [1]     DirectoryString }
 *
 * We list all types, but use the following GeneralName types from RFC 5280:
 * "dnsName", "uniformResourceIdentifier" and "hardware_module_name"
 * of type "otherName", as defined in RFC 4108.
 */

jedoch scheint eine IP als alt_name zu funktionieren(da dies im Code implementiert ist), vorausgesetzt der CN ist keine IP oder Domain.

@SybexX
Copy link
Collaborator

SybexX commented Jan 25, 2025

Gib mir für die restlichen Einträge noch etwas Zeit. Ich muss es erst schaffen, ein abgelaufenes CA-Cert zu erstellen, sowie die Client-Zertifikate zu erstellen...

Weißt du von wo openssl das aktuelle Datum bezieht? Sonst könnte man doch probieren, das System-Datum vom PC um ein Jahr zurücksetzen und dann die Zertifikate mit einer kürzeren Laufzeit zu erstellen.

@theo416
Copy link
Author

theo416 commented Jan 25, 2025

Weißt du von wo openssl das aktuelle Datum bezieht? Sonst könnte man doch probieren, das System-Datum vom PC um ein Jahr zurücksetzen und dann die Zertifikate mit einer kürzeren Laufzeit zu erstellen.

Ja ,die System-Uhr wird verwendet. Das würde mittels fake-time unter Linux funktionieren:

faketime '2025-01-25 08:00:00' /bin/bash -c 'openssl ...'

Wenn ich heute Zeit und Lust finde, werde ich das noch umsetzen. Ansonsten habe ich gestern ein paar Zertifikate erstellt (CA + Server), die heute und morgen 22:00 Uhr ablaufen.

@theo416
Copy link
Author

theo416 commented Jan 25, 2025

So, habe nun sämtliche Varianten der oberen Tabelle mithilfe von faketime ausprobiert und dokumentiert.

Zusammenfassend lässt sich sagen:

  • Zertifikate werden nur beim Boot bzw. Server-Verbindung geprüft → läuft ein Zertifikat zwischen drin ab, bleibt die Verbindung bis zum nächsten MQTT-Disconnect bestehen → ist denke ich normal
  • Das CA-Zertifikat wird immer als erstes geprüft. Tritt hier ein Fehler auf, wird das Server-Cert gar nicht weiter angeschaut. Erst danach wird das Server-Zertifikat geprüft
  • Es wird nicht geprüft, ob das CA-Zertifikat abgelaufen ist (Zeile 7)
  • Es wird nicht geprüft, ob das Server-Cert abgelaufen ist (Zeile 5)

@SybexX
Copy link
Collaborator

SybexX commented Jan 25, 2025

@theo416 CONFIG_MBEDTLS_HAVE_TIME_DATE war nicht aktiviert, jetzt sollte es gehen.
https://github.com/jomjol/AI-on-the-edge-device/actions/runs/12966529760/artifacts/2485320559

@theo416
Copy link
Author

theo416 commented Jan 25, 2025

@SybexX Bei Konfiguration Zeile 7 + neuem Build mit aktiviertem CONFIG_MBEDTLS_HAVE_TIME_DATE bekomme ich in der Konsole:

E (14202) esp-tls-mbedtls: No server verification option set in esp_tls_cfg_t structure. Check esp_tls API reference
E (14202) esp-tls-mbedtls: Failed to set client configurations, returned [0x8017] (UNKNOWN ERROR)
E (14212) esp-tls: create_ssl_handle failed
E (14212) esp-tls: Failed to open new connection
E (14222) transport_base: Failed to open a new connection
E (14232) mqtt_client: Error transport connect

EDIT: Moment, CA falsch geschrieben

@theo416
Copy link
Author

theo416 commented Jan 25, 2025

@SybexX So, jetzt siehts gut aus.

Daraus ergibt sich eine neue Tabelle für den neuen Build:

CA-Cert Alt-Name (Server-Cert) ValidateServerCert Verbindung aufgebaut Grund
1 richtig richtig true Ja Zertifikat wird geprüft → stimmt
2 richtig richtig false Ja Zertifikat wird nicht geprüft
3 richtig falsch (Fake-Server) true Nein Zertifikat wird geprüft und abgelehnt → OK
4 richtig falsch (Fake-Server) false Ja Zertifikat wird nicht geprüft → Potentiell MITM → aber i.O., da ValidateServerCert=false
5 - 6 richtig abgelaufen * Nein Server-Cert ist abgelaufen → Verbindung abgelehnt. ValidateServerCert irrelevant
7 - 12 abgelaufen * * Nein CA-Cert ist abgelaufen → Verbindung abgelehnt. Server-Cert und ValidateServerCert irrelevant
13 - 14 leer * * Nein CA-Cert parse-Fehler

Daraus ergibt sich folgende Prüfreihenfolge:

Schritt Wenn CONFIG_MBEDTLS_HAVE_TIME_DATE Wenn ValidateServerCert
1 CA-Cert leer * *
2 CA-Cert abgelaufen true *
3 Server-Cert abgelaufen true *
4 Server-Cert CN bzw. alt_names Prüfung * true

Schlägt einer dieser Schritte fehl, werden die nachfolgenden Schritte nicht mehr ausgeführt und die Verbindung abgelehnt.

Alle meine Tests waren jetzt erfolgreich. Ist nurnoch die Frage, ob man abgelaufene Zertifikate von Haus aus ablehnt oder wieder einen Parameter einbaut. Normalerweise sollte man gar keine abgelaufenen Zertifikate zulassen können, oder?

EDIT: Normale Verbindungen ohne TLS funktionieren weiterhin

@SybexX
Copy link
Collaborator

SybexX commented Jan 25, 2025

Alle meine Tests waren jetzt erfolgreich. Ist nurnoch die Frage, ob man abgelaufene Zertifikate von Haus aus ablehnt oder wieder einen Parameter einbaut. Normalerweise sollte man gar keine abgelaufenen Zertifikate zulassen können, oder?

@theo416 Um dafür ein Parameter einzubauen, ist ein sehr großer Zeitaufwand nötig, da es seitens espidf dafür keiner vorgesehen ist. Daher würde ich sagen, belassen wir es erstmal dabei. @caco3 @jomjol was sagt ihr dazu?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working Release16.0.0
Projects
None yet
Development

No branches or pull requests

4 participants