0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ESP32のセキュアなプロトタイピング環境を作成した(通信プロトコル検討編)

Posted at

はじめに#

独学しているIoTセキュリティについて、集大成の意味合いを込めて現在理想と考えるセキュアなプロトタイピング環境を構築しました。
デバイス、サーバー、クライアントアプリの要素技術の勉強を含めて備忘録として分散して記していきます。
前回、このプロジェクトにrainbowtypeと名前を付けました。
image.png

構成は上記となり、今回はサーバー側の実装を検討してみます。

rainbowtype serverの実装#

rainbowtype bootloaderとの接続はwebsocketを採用した。
デバイスとの通信でMQTTは使ったことがあったが、websocketではどのようにするのか検討してみる。

MQTTの場合の構成イメージ:
今回の要件をMQTTで実現する場合、下記のイメージとなりそうだ。

MQTTブローカーに対して、複数のrainbowtype bootloader、およびrainbowtype clientがサブスクライブする。
それぞれがステータスをパブリッシュし共有する。
ブローカーはメッセージのルーティングなどは行わず、そのままを流すので、接続端末側でメッセージの中で自身に関係ないものはドロップするような処理が必要になる。
image.png

一方websocketはもっと低レイヤーな実装になる。
MQTT over websocketという実装もあったり、よくあるチャットアプリの実装例のように、ブラウザとサーバー間のリアルタイム通信に使う例が多い。
image.png

websocketは1対1の通信のみを取り扱うため、ルーティングは別途実装する必要がある。
そこでwebsocket serverに提示されるデバイス証明書のコモンネームを使って接続元識別を行い、インスタンス(接続毎の実体)の配列を作成し、メッセージ内に書かれた宛先情報と配列内に保存しておいたコモンネームが一致するインスタンスを見つけ、そのインスタンスのsendメソッドを使ってメッセージ送信を行う方法を構築した。
image.png

余計な相手に情報を送らなくてもいい点はセキュリティ強化によいだろう。
調査しきれていないが、Socket.io、Crossbar.ioなどがルーティングを合わせて提供する
Web Application Messaging Protocol(WAMP)という実装を実現しているようだ。
マイコンレベルまで対応クライアントが出てくれば使いやすいかもしれない。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?