パブリックIPとSSLを使用してESP32をMQTTサーバーに接続するにはどうすればよいですか?

Maud.D

私はESP32とMQTTサーバーを使用して気象ステーションを作成しています。ローカルネットワークの外でも問題なくesp32をサーバーに接続でき、メッセージを送受信できました。そこで、SSLとその証明書を使用してセキュリティを追加することにしましたが、突然、何も機能しなくなりました。

少し検索した後、問題を絞り込みました。esp32がローカルネットワークにある場合、SSLとその証明書は魅力のように機能します。つまり、証明書に問題がなく、サーバー構成にも問題がないことは明らかです。しかし、ネットワークの外部から試行すると、エラーが発生するのは証明書です。より具体的には、それは発生します:

sslv3 alert bad certificate mqtt

これは、少なくともサーバーにアクセスできることを意味しますが、サーバーに接続できません。問題にさらに不可解な要素を追加するために、私はMQTTエクスプローラーを使用して、SSLとまったく同じ証明書を使用して、ネットワーク外のコンピューターでサーバーに接続しようとしましたが、かゆみはありません。

サーバーにmosquittoを使用しています。私の設定ファイルは:

listener 8883
require_certificate true
allow_anonymous true       ## this one is here for debug purpose. Taking it out doesn't change anything. 
certfile C:\Users\username\Documents\Arduino\MQTT\MQTT SSL\broker\broker.crt
keyfile C:\Users\username\Documents\Arduino\MQTT\MQTT SSL\broker\broker.key
cafile C:\Users\username\Documents\Arduino\MQTT\MQTT SSL\ca\ca.crt

また、ESP32の場合、この簡略化されたコードで問題を再現できます。これは、そのリンク(https://iotdesignpro.com/projects/how-to-connect-esp32-mqtt-broker)に記載されているコードに一部由来しています

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>

const char* ssid = "mySsid";
const char* password = "myPassword";
const char* mqtt_server = "publicIp";
#define mqtt_port 8883
// I don t really need those two next lines for now, but I intend to use them later
#define MQTT_USER "eapcfltj"
#define MQTT_PASSWORD "3EjMIy89qzVn"
#define MQTT_SERIAL_PUBLISH_CH "/icircuit/ESP32/serialdata/tx"
#define MQTT_SERIAL_RECEIVER_CH "/icircuit/ESP32/serialdata/rx"

const char AWS_PUBLIC_CERT[] = ("-----BEGIN CERTIFICATE-----\n\
...
-----END CERTIFICATE-----\n");


//client.crt
const char AWS_DEVICE_CERT[] = ("-----BEGIN CERTIFICATE-----\n\
...
-----END CERTIFICATE-----\n");


//client.key
const char AWS_PRIVATE_KEY[] = ("-----BEGIN RSA PRIVATE KEY-----\n\
...
-----END RSA PRIVATE KEY-----\n");


WiFiClientSecure wifiClient;
PubSubClient client(wifiClient);

void setup_wifi() {
    delay(10);
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }
    randomSeed(micros());
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
}

void callback(char* topic, byte *payload, unsigned int length) {
    Serial.println("-------new message from broker-----");
    Serial.print("channel:");
    Serial.println(topic);
    Serial.print("data:");  
    Serial.write(payload, length);
    Serial.println();
}

void reconnect() {
  // Loop until we're reconnected
  wifiClient.setCACert(AWS_PUBLIC_CERT);
  wifiClient.setCertificate(AWS_DEVICE_CERT);
  wifiClient.setPrivateKey(AWS_PRIVATE_KEY);
  
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP32Client-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str(),MQTT_USER,MQTT_PASSWORD)) {
      Serial.println("connected");
      client.subscribe(MQTT_SERIAL_RECEIVER_CH);
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  Serial.setTimeout(500);// Set time out for 
  setup_wifi();
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);
  reconnect();
}

void loop() {
   client.loop();
   if (Serial.available() > 0) {
     char mun[501];
     memset(mun,0, 501);
     Serial.readBytesUntil( '\n',mun,500);
     if (!client.connected()) {
        reconnect();
     }
     client.publish(MQTT_SERIAL_PUBLISH_CH, mun);
   }
 }

そう。ローカルネットワークの外部からサーバーにアクセスするには、ボックスにポートフォワーディングを追加する必要があったため、ボックスが私の主な容疑者です。何が起こっているのか正確にはわかりませんが、データが失われたか、証明書がハードコーディングされているという事実に起因するものが疑われます。たとえば、「\ n」がインターネットボックスまたは別の要素によって正しく解釈されていない可能性がありますか?知りません。私はそれ以上私を助けるものを見つけることができなかったので、本当に私はその問題についてどんな助けも使うことができました。esp32をサーバーに接続するにはどうすればよいですか?

悪い英語をお詫びします、そしてあなたの助けに前もって感謝します!

タルモ

SSL証明書は、特定の名前またはIPに発行されます。接続するとき、証明書のフィールド(CNまたはSAN)は、ターゲットホストの名前またはIPと一致する必要があります。「192.168.0.2」や「mqtt.local」などの内部LANのアドレスに証明書を発行した可能性があります。証明書とホスト名が一致するため、LAN内のSSL接続では正常に機能します。インターネットからパブリックIPに接続しようとした場合、または「myhome.dyndns.org」などの場合、証明書のフィールドと一致しません。SSL接続が拒否されました。証明書には、これらの公開アドレスを含める必要があります。MQTTエクスプローラーはこれらのエラーを無視し、ESPは無視しません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

IPのみを使用してサーバーに接続するにはどうすればよいですか?

分類Dev

パブリックIPなしで自宅のUbuntuサーバーにSSHでリモート接続するにはどうすればよいですか?

分類Dev

自己署名証明書を使用してAndroid(pahoクライアント)のMqttサーバーに接続するにはどうすればよいですか?

分類Dev

UnboundID SDKを使用してSSLサーバー証明書を使用してLDAPサーバーに接続するにはどうすればよいですか?

分類Dev

ケーブルを使用してESP32からRaspberrypiに信号を送信するにはどうすればよいですか?

分類Dev

パブリックIPとローカルIPを使用してリモートコンピューターに接続するにはどうすればよいですか?

分類Dev

接続トークンを使用してAzureサブスクリプションに接続するにはどうすればよいですか?

分類Dev

Javaを使用してMySQLWebサーバーに接続するにはどうすればよいですか?

分類Dev

LibreOffice Baseを使用してPostgreSQLサーバーに接続するにはどうすればよいですか?

分類Dev

SIGALRMを使用してサーバー接続を中止するにはどうすればよいですか?

分類Dev

SIGALRMを使用してサーバー接続を中止するにはどうすればよいですか?

分類Dev

パブリックIPを使用してサーバーに接続できないのはなぜですか?

分類Dev

ブローカーとしてmosquittoを介してWebsocket経由でMQTTを使用しているときに、接続を特定のオリジンのセットに制限するにはどうすればよいですか?

分類Dev

KubernetesのNodePortサービスを使用してパブリックIPでnginxを公開するにはどうすればよいですか?

分類Dev

クライアントが接続しているサーバーのIPを確認するにはどうすればよいですか?出来ますか?

分類Dev

デスクトップクライアントを使用してAmazonEC2サーバーに接続するにはどうすればよいですか

分類Dev

bashを介してサーバーとのSSL接続を確認するにはどうすればよいですか?

分類Dev

サーバーの再起動時にパスポートを使用して接続ユーザーを保存するにはどうすればよいですか?

分類Dev

ルーターのパブリックIPを使用してパーソナルコンピューターに接続するにはどうすればよいですか?

分類Dev

パブリックIPアドレスをインバウンドルールとして追加するにはどうすればよいですか?

分類Dev

SabreDAVを使用して単純なパブリック読み取り専用WebDAVサーバーを作成するにはどうすればよいですか?

分類Dev

doxygenを使用してパブリックWebサーバーAPIドキュメントを作成するにはどうすればよいですか?

分類Dev

ユーザー名とパスワードを使用してJava mqttクライアントをemqttd(EMQ)ブローカーに接続するにはどうすればよいですか?

分類Dev

Pythonを使用してMySQLサーバー上の他のクライアント接続と通信するにはどうすればよいですか?

分類Dev

ユーザー名パスワードを使用してcoreNLPサーバーに接続するにはどうすればよいですか?

分類Dev

MQTTサーバーは、接続が許可されていないことを示すメッセージをクライアントに送信するにはどうすればよいですか?

分類Dev

ボトルアプリでsqlalchemyセッションを使用して、「クエリ中にMySQLサーバーへの接続が失われる」ことを回避するにはどうすればよいですか?

分類Dev

外部サーバーへのリバースプロキシを使用して安全な接続を確保するにはどうすればよいですか?

分類Dev

LDAPサーバーを使用してvb.NetアプリケーションをOracleに接続するにはどうすればよいですか?

Related 関連記事

  1. 1

    IPのみを使用してサーバーに接続するにはどうすればよいですか?

  2. 2

    パブリックIPなしで自宅のUbuntuサーバーにSSHでリモート接続するにはどうすればよいですか?

  3. 3

    自己署名証明書を使用してAndroid(pahoクライアント)のMqttサーバーに接続するにはどうすればよいですか?

  4. 4

    UnboundID SDKを使用してSSLサーバー証明書を使用してLDAPサーバーに接続するにはどうすればよいですか?

  5. 5

    ケーブルを使用してESP32からRaspberrypiに信号を送信するにはどうすればよいですか?

  6. 6

    パブリックIPとローカルIPを使用してリモートコンピューターに接続するにはどうすればよいですか?

  7. 7

    接続トークンを使用してAzureサブスクリプションに接続するにはどうすればよいですか?

  8. 8

    Javaを使用してMySQLWebサーバーに接続するにはどうすればよいですか?

  9. 9

    LibreOffice Baseを使用してPostgreSQLサーバーに接続するにはどうすればよいですか?

  10. 10

    SIGALRMを使用してサーバー接続を中止するにはどうすればよいですか?

  11. 11

    SIGALRMを使用してサーバー接続を中止するにはどうすればよいですか?

  12. 12

    パブリックIPを使用してサーバーに接続できないのはなぜですか?

  13. 13

    ブローカーとしてmosquittoを介してWebsocket経由でMQTTを使用しているときに、接続を特定のオリジンのセットに制限するにはどうすればよいですか?

  14. 14

    KubernetesのNodePortサービスを使用してパブリックIPでnginxを公開するにはどうすればよいですか?

  15. 15

    クライアントが接続しているサーバーのIPを確認するにはどうすればよいですか?出来ますか?

  16. 16

    デスクトップクライアントを使用してAmazonEC2サーバーに接続するにはどうすればよいですか

  17. 17

    bashを介してサーバーとのSSL接続を確認するにはどうすればよいですか?

  18. 18

    サーバーの再起動時にパスポートを使用して接続ユーザーを保存するにはどうすればよいですか?

  19. 19

    ルーターのパブリックIPを使用してパーソナルコンピューターに接続するにはどうすればよいですか?

  20. 20

    パブリックIPアドレスをインバウンドルールとして追加するにはどうすればよいですか?

  21. 21

    SabreDAVを使用して単純なパブリック読み取り専用WebDAVサーバーを作成するにはどうすればよいですか?

  22. 22

    doxygenを使用してパブリックWebサーバーAPIドキュメントを作成するにはどうすればよいですか?

  23. 23

    ユーザー名とパスワードを使用してJava mqttクライアントをemqttd(EMQ)ブローカーに接続するにはどうすればよいですか?

  24. 24

    Pythonを使用してMySQLサーバー上の他のクライアント接続と通信するにはどうすればよいですか?

  25. 25

    ユーザー名パスワードを使用してcoreNLPサーバーに接続するにはどうすればよいですか?

  26. 26

    MQTTサーバーは、接続が許可されていないことを示すメッセージをクライアントに送信するにはどうすればよいですか?

  27. 27

    ボトルアプリでsqlalchemyセッションを使用して、「クエリ中にMySQLサーバーへの接続が失われる」ことを回避するにはどうすればよいですか?

  28. 28

    外部サーバーへのリバースプロキシを使用して安全な接続を確保するにはどうすればよいですか?

  29. 29

    LDAPサーバーを使用してvb.NetアプリケーションをOracleに接続するにはどうすればよいですか?

ホットタグ

アーカイブ