Howto

EdgeLock SE050 を使用して AWS IoT Core へ接続する

Howto で出来ること

EdgeLock SE050 にプリインストールされた X.509 証明書を用いたデバイス認証によって単一のデバイスを AWS IoT Core に接続する。

Howto の概要

  • Armadillo IoT ゲートウェイ G4 向け
  • クラウドサービス (AWS IoT Core)側の環境を構築する
  • EdgeLock SE050 を利用して、単一のデバイスを X.509 認証で AWS IoT Core に登録し、message を送信する
  • 接続アプリケーションは aws-iot-sdk-python の basicPubSub.py を利用する
  • AWS management console を利用してプロビジョニングを行います。AWS CLI を利用したプロビジョニングについて知りたい方は以下を参考にしてください

EdgeLock SE050

NXP Semiconductors 製 EdgeLock SE050 (以下「SE050」という) は IoT アプリケーション向けのセキュアエレメントです。様々なアルゴリズムに対応した暗号エンジン、セキュアストレージを搭載します。内部処理は秘密鍵を露出させることなくセキュアに暗号処理を行うことができます。外部インターフェースは I2C を採用して GlobalPlatform が規定する Secure Channel Protocol 03 に準拠し、バスレベル暗号化 (AES)、ホストとカードの相互認証 (CMAC ベース) を行うことも可能です。また、SE050 はターンキーソリューションとして利用を開始してすぐにクラウドサービスなど PKI を基にしたサービスに接続することができます。チップ固有の X.509証明書などが事前にプロビジョニングされた状態で出荷されます。

AWS IoT Core

AWS IoT Core は IoT に特化した AWS のクラウドサービスです。 メッセージを各種 AWS サービスにルーティングするゲートウェイの役割はもちろん、接続時の相互認証やデバイス管理の役割を持ちます。AWS IoT Core は幅広い顧客の要件に応えることができるのことも大きな特徴です。通信プロトコルとして MQTT、HTTPS、MQTT over WSS、LoRaWAN などに対応し、デバイスの認証として X.509 証明書、AWS 認証情報、Amazon Cognito やカスタム認証トークンといった様々なデバイス認証情報を利用することができます。また、クラウドサービスサイドのプロビジョニング方法として X.509証明書や IAM ユーザー、クレーム証明書を選択することが可能です。AWS IoT Core に接続するアプリケーションを開発するためには AWS IoT Device SDK が AWS によって OSS として用意されています。C、C++、python、JAVA、JavaScript といった言語でデバイスアプリケーションを開発することができます。

セットアップ作業の流れと実運用について

以下に接続までの流れを示します。これらの作業はセットアップ時に一度だけ行います。セットアップが完了した後には Armadillo IoT ゲートウェイ G4 を AWS IoT Core に接続する IoT デバイスとして利用することができます。

  1. SE050 を有効にする
  2. IoT デバイスの準備をする
    1. SE050 から証明書を取得する
    2. AWS の Root CA 証明書を準備する
  3. AWS アカウント、IAM ユーザーを作る
  4. AWS IoT Core にプロビジョニングする
    1. AWS IoT Thing をつくる
    2. AWS IoT Policy をつくる
    3. 証明書を登録する
    4. 証明書に AWS IoT Thing と AWS IoT Policy をアタッチする
  5. AWS IoT Core に接続するために必要な情報
  6. デバイスアプリケーションを実行する

実運用には、「2.1 デバイス上で SE050 から証明書を取得する」を事前に行っておいて、運用者 (もしくは開発者) に証明書とリファレンスキーを渡して 3. 以降のクラウド側の構築を行う分担が考えられます。証明書やリファレンスキーは SE050 チップと紐づくので漏洩が脆弱性につながるリスクは大きくありません。

SE050 を有効にする

以下を参考にセットアップ作業を行う前に SE050 の Deep Power-down を解除してください。

証明書を取得する

以下を参考にセットアップ作業を行う前に NXP Semiconductors の SE050 ミドルウェア (Plug & Trust MW) のビルド、SE050 から証明書とリファレンスキーの取得をしてください。

AWS の Root CA 証明書を準備する

接続時の TLS 通信でサーバーを認証するするために、AWS の CA 証明書が必要です。RSA 2048 bit を利用するのでAmazon Root CA 1の証明書をダウンロードするか、plug and trust middleware に含まれる証明書を利用するかしてください。

  • plug and trust middleware
    • simw-top/demos/linux/aws/AmazonRootCA1.pem

AWS アカウント、IAM ユーザーを作る

以下を参考に AWS アカウント、IAM ユーザーを作ってください。

AWS IoT Core にプロビジョニングする

AWS IoT Thing をつくる

AWS management console を利用してプロビジョニングを行います。AWS CLI を利用したプロビジョニングについて知りたい方は以下を参考にしてください。

AWS management console にログインして、IoT Core に移動します。

Manage から Things を選択します。

Create Things を押します。

Single Thing を選択して、次に進みます。

Thing の名前は任意、設定が完了したら次に進みます。

SE050 から取得した X.509 証明書は後から登録するのでここはスキップする。

Manage から Things を選択すると、作った Thing を確認できます。

AWS IoT Policy をつくる

Secure から Policies を選択する。

Create を押す。

任意の名前を入力して、Advanced mode を選択する。

ここでは以下の内容を入力する。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iot:*",
      "Resource": "*"
    }
  ]
}

Secure から Policies を選択して、作った Policy を確認できる。

証明書を登録する

Secure から Certificates を選択する。

Create を押す。

SE050 から取得した証明書を利用するために、Use my certificate を選択する。

次に進む。

SE050 から取得した証明書を選択する。

すぐに利用するので Activate をチェックして、証明書を登録する。

Secure から Certificates を選択して、先頭の行に登録した証明書を確認できる。

証明書に AWS IoT Policy と AWS IoT thing をアタッチする

Secure から Certificates を選択する。登録した証明書の行の右側にある点々々(・・・)を押す。 プルアップメニューが表示されるので、Attach Policy を選択する。

先ほど作った Policy を選択する。

次に、Policy のときと同様に Secure から Certificates を選択する。登録した証明書の行の右側にある点点々(・・・)を押す。 プルアップメニューが表示されるので、Attach thing を選択する。

先ほど作った thing を選択する。

Device data endpoint を取得する

AWS IoT Core に接続する際に必要になります。

Settings に移動する。

Device data endpoint を取得する。

AWS IoT Core に接続するために必要な情報

以下は AWS IoT Core に接続するために、これまでの作業で入手した情報の一覧です。 今後はこの情報を基にAWS IoT Core に接続するアプリケーションを設定して接続してください。

  • SE050 から取得した証明書
  • SE050 から取得したリファレンスキー
  • Device data endpoint

以上で、AWS IoT Core 上の作業は終了です。 これ以降は AWS IoT Core へ接続するアプリケーションを動作させる方法について説明します。

aws-iot-device-sdk-python

ここでは aws-iot-device-sdk-python を使って接続を確認していきます。 aws-iot-device-sdk-python は AWS Iot Core に接続するための python 環境です。SDK 内に含まれるサンプルアプリ basicPubSub.py を利用します。

準備

Plug & trust MW のビルドで python3 はインストール済みの前提なので省略します。

Azure IoT 向けの python のライブラリをインストールします。空き容量が足りずにインストールに失敗する場合は、Plug & trust MW のビルドで利用した gcc, g++ などをアンインストールしてください。

[container ~]# pip install AWSIoTPythonSDK

Github からソースファイルを取得するために git をインストールします。

[container ~]# apk add git

ソースファイルの取得とインストール

GitHub からリポジトリをクローンします。

[container ~]# git clone https://github.com/aws/aws-iot-device-sdk-python.git
[container ~]# cd aws-iot-device-sdk-python
[container ~/aws-iot-device-sdk-python]# python3 setup.py install

設定

NXP semiconductorsから提供される Plug & Trust MW 経由で SE050 にアクセスする OpenSSL 設定ファイルを利用します。

[container ~]# export OPENSSL_CONF=/root/simw-top/demos/linux/common/openssl11_sss_se050.cnf

以下は Plug & Trust MW のための接続デバイスの設定です。

[container ~]# export EX_SSS_BOOT_SSS_PORT=/dev/i2c-2:0x48
argument description
--endpoint XXXXXXX.amazonaws.com。取得した Device data endpoint を入力してください。
--rootCA RSA 2048 bit を利用するのでAmazon Root CA 1の証明書をダウンロードするか、plug and trust middleware に含まれる証明書を利用するかしてください。
--cert SE050 から取得した証明書を入力してください。
--key SE050 から取得したリファレンスキーを入力してください。
--topic トピック名です。任意の名前を入力してください。
-id デバイスの ID となります。任意の ID を入力してください。
--port MQTT を利用するので、443、もしくは、8883 を入力してください。

デバイスアプリケーションの実行

以下のコマンドを実行してください。AWS の root CA 証明書は plug and trust middleware に含まれているものを利用しました。

[container ~]# cd aws-iot-device-sdk-python/samples/basicPubSub
[container ~/aws-(省略)...]# python3 basicPubSub.py \
    --rootCA "/root/simw-top/demos/linux/aws/AmazonRootCA1.pem" \
    --endpoint "xxxxx.amazonaws.com" \
    --cert "/root/cert/device_cert.pem" \
    --key "/root/cert/key.pem" \
    -id "se050test_01" \
    --topic "se050test" \
    --port 443

以下はコンソール出力の例です。

2021-12-24 01:16:55,195 - AWSIoTPythonSDK.core.protocol.internal.clients - DEBUG - Initializing MQTT layer...
2021-12-24 01:16:55,196 - AWSIoTPythonSDK.core.protocol.internal.clients - DEBUG - Registering internal event callbacks to MQTT layer...
2021-12-24 01:16:55,196 - AWSIoTPythonSDK.core.protocol.mqtt_core - INFO - MqttCore initialized
2021-12-24 01:16:55,197 - AWSIoTPythonSDK.core.protocol.mqtt_core - INFO - Client id: se050test_01
2021-12-24 01:16:55,197 - AWSIoTPythonSDK.core.protocol.mqtt_core - INFO - Protocol version: MQTTv3.1.1
2021-12-24 01:16:55,197 - AWSIoTPythonSDK.core.protocol.mqtt_core - INFO - Authentication type: TLSv1.2 certificate based Mutual Auth.
: (省略)
Received a new message:
b'{"message": "Hello World!", "sequence": 0}'
from topic:
se050test
: (省略)
--------------

AWS IoT Core 上での確認

AWS IoT Core のテスト用クライアントで MQTT メッセージの受信を確認できます。

MQTT test client を選択する。

"#" を入力する。

アプリケーションの実行するとログが表示される。

参考

以下の手順を参考にしております。
- EdgeLock™ SE05x for secure connection to AWS IoT Core