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);
}
}
}
