Node-RED MCUでSSL/TLSを使ってデバイスから直接セキュアな通信を行うための取り組み

　Node-RED MCUでSSL/TLSを使った認証と暗号化の仕組みを使ってセキュアな通信ができるようになりました。事例にもよりますが、これまでマイコンデバイスから一旦エッジサーバを介してセキュアな通信を行っていたケースでもマイコンデバイスから直接セキュアな通信を行う といったように、システムをシンプルにできる可能性があります。 
  
1.「HTTP Request」ノードを使ってHTTPSで提供されているサービスのAPIを使ってセンサデータを送ったり、HTTPSでアクセスしたサイトのスクレイピングにも利用の可能性が広がります。
<img width="780" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3012948/d9cb8062-3021-901f-901b-09c702a68781.png">

2.「MQTT Broker」ノードの設定でもSSL/TLSを設定すると、「MQTT in」や「MQTT out」ノードでもセキュアな通信ができるようになります。
<img width="780" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3012948/d3864427-d435-c3f1-4998-3180b9d54906.png">

　この記事を含む一連の投稿はNode-RED アドベントカレンダー2023に参加しています。まずこの記事ではNode-RED MCUでのSSL/TLS対応の取り組みについて紹介しています。その後、アドベントカレンダーの進行に沿って、別記事の公開を予定しています。

 ・「httpリクエストノード」からhttpsでkintoneに直接アクセスする
 ・「MQTT in/out ノード」からMQTTSでtest.mosquitto.orgに直接アクセスする
 ・「MQTT in/out ノード」から自己署名の証明書を使用して、クラウドサーバ上で運用しているMosquitto MQTT BrokerにMQTTSで直接アクセスする
 
これに使用した、[Node-RED MCU Editionについてはこちら](https://github.com/phoddie/node-red-mcu/blob/main/readme.md)をご覧ください。

https://github.com/phoddie/node-red-mcu/

また、この内容は@kitazakiさんの記事で紹介されている書籍、補足書とも連動しています。

https://qiita.com/kitazaki/items/0768eb7484ee3c27f6e1

http requestノードについては@utaaniさんの記事が詳細な所まで丁寧に解説されています。

https://qiita.com/utaani/items/a4ea0cba414f63adf09f

上記の記事で紹介されているNode-REDのhttp requestノードがNode-RED MCUでは小さなマイコンデバイスで実行するために変換されますが、そこでセキュアな通信をどのように実装されているかを紹介しているのがこの記事という形になります。

::: note
ここではコンピュータ上で操作するコマンド等はUbuntuを事例として紹介します。お試しの場合は、お使いのシステムに応じて読み替えてください。
:::

#### SSL/TLSとは？
　インターネット上で通信を行う際、通信相手の認証や送受信するデータの暗号化を行うための仕組みがSSL/TLSです。この技術を使用する事で、通信相手へのなりすまし、通信データの盗聴、改ざんを防ぐことが目的です。
　元はSSL(Secure Socket Layer)という技術が使用されていましたが、SSLに脆弱性が発見されたためにTLS(Transport Layer Security)v1.2以降への切り替えが進んでいます。それでも、歴史的経緯からSSL/TLSと併記する事が多くあります。
　Node-REDにおいても「SSL/TLS接続を有効化」という選択項目があり、これを有効化すると表示される「TLS設定」の中で設定をおこないます。

#### HTTPでSSL/TLSを使ったアクセスをする

　Webサイトの情報を伝えるHTTP(Hyper Text Transfer Protocol)でセキュアな通信を行う場合、「http://」に代えて「https://」を使ってアクセスするというのは広く知られるようになっています。「https://」でアクセスした場合、内部ではSSL/TLSの技術が使用されてサーバの認証と送受信データの暗号化がおこなわれ、ブラウザのアドレスバーに鍵アイコンが表示されるなど、安全な通信ができていることが表示されます。逆に、「https://」ではなく「http://」でSSL/TLSを使用しない通信を行った場合には「このサイトは安全ではありません」などのメッセージが表示される事があります。

#### Node-RED MCUでのSSL/TLS実装について

　ここはGitHubのnode-red-mcuリポジトリでSSL/TLSを実装されたnode-red-mcu作者/Moddable社CEOのPeter Hoddie氏の解説の中から日本語訳で掲載します。
https://github.com/phoddie/node-red-mcu/issues/120

##### ・Node-RED MCUでのTLS証明書の取扱い
　小さなマイコンデバイスの限られたリソースの中で運用する場合、最も困難な事はTLSの証明書の取り扱いです。通常、コンピュータ上でブラウザやノードからHTTPSリクエストを発行した場合、コンピュータ上には巨大なTLS証明書のコレクションが存在し、それを使用して認証する事でコネクションが有効となります。この証明書コレクションのおかげでメジャーなWebサイトとの間で安全な接続が可能となります。
ただ、この証明書コレクション全てを小さなマイコンデバイス上にインストールするには大きすぎます。Node-RED MCUでは、全ての証明書をインストールするのではなく、必要とされる証明書のみをマイコンデバイスにインストールする事で実現しています。

##### ・Moddable SDKの証明書を利用する場合
　Node-RED MCUで使用できるLTS証明書のコレクションはModdable SDKリポジトリに存在します。たとえば「http request」ノードでアクセスする場合にどの証明書が必要なのかを調べるのに、最も簡単な方法は一旦ビルドして動作させてデバッガxs-bugのエラーメッセージを確認します。
```
$MODDABLE/modules/files/resource/Resource.c (44) 
# Break: Resource: Resource not found: ca176.der!
```
　上記の例では「ca176」の証明書が必要です。
 
　Moddable SDKでは `$MODDABLE/modules/crypt/data` にある「.der」フォーマットの証明書「ca176.der」を使用しますが、Node-RED側ではPEMフォーマットの証明書が必要なので、Node-REDフローエディタの設定では `$MODDABLE/modules/crypt/data-pem` にある「.pem」フォーマットの証明書「ca176.pem」を設定します。

##### ・使用する証明書をNode-REDフローエディタで設定する
　「HTTP Request」ノードの場合、設定の中で"Enable secure (SSL/TLS) connection"にチェックマークを入れて有効にします。通常、これはプライベート証明書を利用する時にだけ必要ですが、Node-RED MCUではTLSを使用する時は常に必要となります。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3012948/3e47057b-7cfe-559a-c537-4791ea991860.png)

"TLS Configuration"の隣にある鉛筆アイコンをクリックして新しいTLS設定を作成し、使用する証明書を「.pem」フォーマットで指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3012948/5ed7112a-93b3-a523-3d92-c603998e1d42.png)


「CA証明書」の項目にある「↑ファイル」をクリックして　Moddable SDKに含まれている必要なCA証明書を選択します。ここでは「ca176.pem」を選択しました。
この設定は、「ローカルファイルの秘密鍵と証明書を使用」のチェックボックスにマークして、必要なCA証明書のパスをセットする事でも可能です。

##### ・URLについて
HTTP RequestノードのURLプロパティについては少々説明が必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3012948/7cefe281-dd7b-a260-a5db-d005e81dff93.png)

ここにセットされるURLが“http://”で始まっていたら、「SSL/TLS接続を有効化」にチェックを入れていたとしても常にセキュアではない接続となります。
URLが“https://”で始まっていたら、「SSL/TLS接続を有効化」にチェックを入れていなかったとしても常にセキュアなTLSを使用した接続となります。
もしURLに“http://”や“https://”がなかった場合、例えば"www.moddable.com"のように設定された場合、「SSL/TLS接続を有効化」のチェックボックスの状態に応じて“http://”または“https://”が使用されます。

##### ・リダイレクトについて
　多くのWebサイトでは、セキュアではない"http://"でのリクエストを受信した場合、自動的に"https://"にリダイレクトされます。このリダイレクトの処理はマイクロコントローラの処理時間を消費しリソースの負荷を増加させることになります。このような場合、サーバーに任せてリダイレクトされるよりも"https://"リクエストを使用するのが望ましいです。

##### ・インプリメンテーションノート
　nodered2mcuツールが更新された事で証明書データを抽出してファームウェアに含まれるModdable SDKリソースの中に自動で組み込むことができるようになりました。証明書の抽出の部分では、証明書は.pemフォーマットから.derフォーマットに変換されます。この動作はビルドログの中でも確認することができます。
```
# nodered2mcu flows
# extract from Node-RED 38c597bbed72c216-ca.der
```
　このリソース名はコンフリクトの発生を最小にするためにTLS設定ノードのIDをベースにしています。

　リダイレクトをサポートするために、fetch()の実装が自動的にリダイレクトを処理するように更新されました。それに応じて redirectedプロパティと urlプロパティが更新されるので、クライアントがリダイレクトを検出できるようになります。

### 関連記事
お待たせしました、Node-RED アドベントカレンダー2023の進行に沿って、各記事へのリンクを更新しました。

 https://qiita.com/mshioji/items/3b98aaaab492ff942961

https://qiita.com/mshioji/private/bbdd3be9deca253e8267

 https://qiita.com/mshioji/items/2d333826570f41009447