IoTマイコンで人気のESP8266。MQTTでブローカーと接続する使い方も多いと思います。ここでは、MQTT接続の暗号化を取り上げます。
この記事はESP8266 Arduino Core バージョン 2.5.1以上の使用を前提としています。
MQTTの接続を暗号化するには
MQTTプロトコルライブラリ pubsubclient を使うことを前提に、pubsubclient ライブラリと共に追加されるスケッチ例 mqtt_esp8266 を使って解説します。
ESP8266ではTLS1.2がサポートされています。TLSはSSLとよばれることもあります。TLS通信規約を使うようにスケッチを変更することでMQTTの接続を暗号化できます。
MQTTの接続をTLSで暗号化するには、mqtt_esp8266の次の二か所を変更します。
一か所目
WiFiClient espClient; PubSubClient client(espClient);
WiFiClientを次のようにWiFiClientSecureとします。これで接続にTLSが使われるようになります。
WiFiClientSecure espClient; PubSubClient client(espClient);
二か所目
setup_wifi(); client.setServer(mqtt_server, 1883); client.setCallback(callback);
ここでは暗号化のみに注目しているため、setInsecure()で接続相手の確認を行わないようにしています。さらに、ポート番号をMQTTブローカーが指定する暗号化接続用のポート番号にします。例では、1883から8883に変更しています。
setup_wifi(); espClient.setInsecure(); /*接続相手の確認を行わない命令のため推奨しない*/ client.setServer(mqtt_server, 8883); client.setCallback(callback);
※暗号化が必要となる通信では接続相手の確認は必須ですので通常はsetInsecure()は使わずに。こちらの記事を参考に最低限の相手確認をするようにしてください。
ポート番号は、MQTTブローカーの管理画面や設定に記載があり、「TLS/SSLポート」や「暗号化ポート」といったラベルがついています。