M5StickCPlus MQTT with TLS (using Self Signed CA Cert) Error

Hi, I am trying to establish a connection to my own hosted mqtt broker on my pc with self signed CA certificate. On the MQTT Explorer, I am able to establish a proper connection using my self signed CA cert with no client cert/key required. However, I am facing issue with establishing a connection to my mqtt broker on my M5StickCPlus. Specifically, on my broker, I am seeing this errors after flashing into my m5stickcplus.


Error Code:
1742760036: OpenSSL Error[0]: error:14094412:SSL routines:ssl3_read_bytes:sslv3 alert bad certificate

1742760036: Client disconnected: protocol error.

I have extracted out my CA cert using notepad in this following format in the Arduino IDE:

const char* mqtt_ca_cert = \
     "-----BEGIN CERTIFICATE-----\n" \
     "MIIECzCCAvOgAwIBAgIUPQNkC+bKMQYbUBZUdLeOeD3aV94wDQYJKoZIhvcNAQEL\n" \
     "BQAwgZQxCzAJBgNVBAYTAlNHMRIwEAYDVQQIDAlTaW5nYXBvcmUxEjAQBgNVBAcM\n" \
     "CVNpbmdhcG9yZTESMBAGA1UECgwJSW9UX0dycDM1MQ0wCwYDVQQLDARURVNUMRUw\n" \
     "EwYDVQQDDAwxOTIuMTY4LjEuMTAxIzAhBgkqhkiG9w0BCQEWFHl1aGVuZzA1MDhA\n" \
     "Z21haWwuY29tMB4XDTI1MDMyMzE3MjU1NVoXDTMwMDMyMzE3MjU1NVowgZQxCzAJ\n" \
     "BgNVBAYTAlNHMRIwEAYDVQQIDAlTaW5nYXBvcmUxEjAQBgNVBAcMCVNpbmdhcG9y\n" \
     "ZTESMBAGA1UECgwJSW9UX0dycDM1MQ0wCwYDVQQLDARURVNUMRUwEwYDVQQDDAwx\n" \
     "OTIuMTY4LjEuMTAxIzAhBgkqhkiG9w0BCQEWFHl1aGVuZzA1MDhAZ21haWwuY29t\n" \
     "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw23R7sfqpOKwz6sFA1PV\n" \
     "ikPvUY3oiqHnn+1ygoSVw4T1YDkJr1KGgc3lwzjMjyyw5jf5x+rUXMxuETFHrryh\n" \
     "iY7sDaYvWl/bu1Rj8naPHEz4OHopGxJPm042XOZQDkU3fyWmUggFPEawkWcxiDeJ\n" \
     "UkuHmtdt92pUzrq+bILs2QThNm6ujZ+PS6EdfAVzC9sXHvt9h6tMlexhkRbkXCb4\n" \
     "F31cjVhtOQgBiMOmv9Gt5/QpgQAZmncqxxkG/GO5+hGDXwhAtUPN7crEkWTu4pQ1\n" \
     "oT4EAOMr+askrj63rggIz63Vn0avG5sALJ3S0XJU5JV5+4kCv/BDzqDM0AhMCobw\n" \
     "OQIDAQABo1MwUTAdBgNVHQ4EFgQUKtnIc9Ppd2youGZwZTgEbeTIzrIwHwYDVR0j\n" \
     "BBgwFoAUKtnIc9Ppd2youGZwZTgEbeTIzrIwDwYDVR0TAQH/BAUwAwEB/zANBgkq\n" \
     "hkiG9w0BAQsFAAOCAQEAdLV1DkuFfkk+WRFBbjYosY6frRdIZB4hZ5utLnLGjaIV\n" \
     "M3Kto2gteGjm3BGUE+jiHXwLTOkHnzy7CvkkpGNRORoWeHJOMeq82Ef2yMh1eDoW\n" \
     "/LJv9KBd1nqN1bHRCdoxheSOhPpt6NtD4QgXV6eSU/Hl0GJFGJLqte9/EwjScKsF\n" \
     "qDXb1geV763xIuuCPPuyQfDf+bZ26+09ylR+ZmL9zCfVi82rtr/ji4AqNoJCzw2+\n" \
     "noP5be9H87JqzoDZFMxo9Jipka1cJ5cwhFwWZ0SxfxEp5reQGdrErhM8wnQsGB/4\n" \
     "nUI5PtjgNq8bPvvFXAVh2Uk4pyxqWqrg82qD3FHrxg==\n" \
     "-----END CERTIFICATE-----\n";

This is my existing project code:

#include "M5StickCPlus.h"
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include "secrets.h"

#define IR_SENSOR_PIN 26  // Define IR sensor pin

// Use WiFiClientSecure for TLS/SSL
WiFiClientSecure espClient;
PubSubClient client(espClient);

char msg[50];
int lastSensorValue = -1;  // Stores the last sensor reading

void setupWifi();
void callback(char* topic, byte* payload, unsigned int length);
void reConnect();

void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(115200);
  delay(100);
  
  M5.begin();
  M5.Lcd.setRotation(3);
  pinMode(IR_SENSOR_PIN, INPUT_PULLUP);

  setupWifi();

  // espClient.setInsecure();

  // Set the CA certificate for TLS/SSL
  espClient.setCACert(mqtt_ca_cert);

  Serial.println("\nStarting connection to server...");

  // Set the MQTT server to use the secure port 8883
  client.setServer(mqtt_server, 8883);
  client.setCallback(callback);

  M5.Lcd.println("Node B (Bedroom) Ready");
}

void loop() {
  if (!client.connected()) {
    reConnect();
  }
  client.loop();

  // Read IR sensor value
  int sensorValue = digitalRead(IR_SENSOR_PIN) ? 0 : 1;

  // Only publish if sensor value has changed
  if (sensorValue != lastSensorValue) {
    snprintf(msg, sizeof(msg), "%d", sensorValue);
    client.publish(topicBedroom, msg);

    // Display IR sensor value on LCD
    M5.Lcd.fillScreen(BLACK);
    M5.Lcd.setCursor(0, 0);
    M5.Lcd.print("Bedroom's Door IR Sensor: ");
    M5.Lcd.println(sensorValue);

    lastSensorValue = sensorValue;  // Update last sensor value
  }

  delay(100);  // Small delay to prevent excessive polling
}

// Wi-Fi Setup Function
void setupWifi() {
  delay(10);
  M5.Lcd.printf("Connecting to %s", WIFI_SSID);
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    M5.Lcd.print(".");
  }
  M5.Lcd.println("\nConnected");
}

// MQTT Callback Function
void callback(char* topic, byte* payload, unsigned int length) {
  String received = "";
  for (int i = 0; i < length; i++) {
    received += (char)payload[i];
  }

  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.print("Received MQTT Msg\nTopic: ");
  M5.Lcd.println(topic);
  M5.Lcd.print("Message: ");
  M5.Lcd.println(received);
}

// Reconnects to MQTT if disconnected
void reConnect() {
  while (!client.connected()) {
    M5.Lcd.print("Attempting MQTT connection...");
    String clientId = "Sensor1-" + String(random(0xffff), HEX);
    if (client.connect(clientId.c_str())) {
      M5.Lcd.println("\nConnected");
      client.subscribe("home/bedroom/door/cmd");  // Subscribe to command topic
    } else {
      M5.Lcd.print("Failed, rc=");
      M5.Lcd.println(client.state());
      delay(5000);
    }
  }
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.