Howto

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

Howto で出来ること

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

Howto の概要

  • Armadillo-IoT ゲートウェイ G3M1 と Armadillo-X1(一部リビジョンのみ) 向けの Howto
  • AWS コマンドラインインターフェイス (CLI) を利用して AWS IoT Core にデバイスをプロビジョニングします
  • EdgeLock SE050 を利用して AWS IoT Core の接続認証を行い、message を送信します
    • SDK は aws-iot-device-sdk-embedded-C を利用します

以下の手順を参考にしております。
Connecting with EdgeLock SE050E and Raspberry Pi to AWS IoT Core

EdgeLock SE050

EdgeLock SE050 は IoT アプリケーション向けのセキュアエレメントです。様々なアルゴリズムに対応した暗号エンジン、セキュアストレージを搭載します。内部処理は秘密鍵を露出させることなくセキュアに暗号処理を行うことができます。外部インターフェースは I2C を採用して GlobalPlatform が規定する Secure Channel Protocol 03 に準拠し、バスレベル暗号化 (AES)、ホストとカードの相互認証 (CMAC ベース) を行うことも可能です。また、EdgeLock 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 といった言語でデバイスアプリケーションを開発することができます。

AWS の設定

アカウントの作成

AWS アカウントの作成方法については、 こちら を参照してください。

IAMユーザー作成

AWSマネジメントコンソールへログインし、サービス一覧からIAMを選択してください。
その後、ユーザータブを開き、「ユーザーを追加」をクリックします。

下記の通り入力、選択し「次のステップ: アクセス権限」に進みます。

  • ユーザー名
  • AWSアクセスの種類を両方選択
  • コンソールのパスワードは自動生成パスワードを選択
  • 「パスワードのリセットが必要」にチェックを入れる

「アクセス許可の設定」画面では、
下記の手順でポリシーをアタッチし、「次のステップ: タグ」に進みます。

  • 「既存のポリシーを直接アタッチ」を選択
  • ポリシーのフィルタにAWSIoTConfigAccessと入力
  • 表示されたAWSIoTConfigAccessにチェック

「タグの追加」画面では、何もせず「次のステップ:確認」に進みます。

「確認」画面では、内容を確認し「ユーザーの作成」に進みます。

「ユーザーの作成」画面では、csv のダウンロードをクリックし、
new_user_credentials.csv をダウンロードし、左下の閉じるをクリックします。

ポリシーの作成

  1. IoT Core へ移動し、「ポリシー」→「作成」を選択します。


  2. ポリシーの名前を入力し、「アドバンスモード」を選択します。
    ここでは、ポリシー名を "my_test_policy" としています。
    このポリシー名は後程使用しますので、メモしておいてください。


  3. ポリシー構文に以下の様に入力します。

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

モノの作成

  1. AWS IoT Coreの「モノ」→「単一のモノを作成する」を選択します。


  2. モノの名前を入力し「次へ」を選択します。
    ここでは、モノの名前を "my_armadillo001" としています。
    このモノの名前は後程使用しますので、メモしておいてください。


  3. 「証明書なしでモノを作成」を選択します。

Armadillo 側の手順

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

サーバー認証するために AWS の Root CA 証明書が必要です。Amazon Root CA 1の証明書をダウンロードしてください。

[armadillo ~]# wget https://www.amazontrust.com/repository/AmazonRootCA1.pem

GPIO 73 を high に設定する

EdgeLock SE050 へアクセスするには GPIO 73 を high にする必要があります。
以下にスクリプトの例を記載しますのでご利用ください。

#!/bin/sh

GPIO_EXPORT="/sys/class/gpio/export"
GPIO_NUM="73"
GPIO_DIRECTION="/sys/class/gpio/gpio$GPIO_NUM/direction"
GPIO_VALUE="/sys/class/gpio/gpio$GPIO_NUM/value"

if [ ! -e $GPIO_VALUE ]; then
        echo $GPIO_NUM > $GPIO_EXPORT
fi

echo out > $GPIO_DIRECTION

echo 1 > $GPIO_VALUE

sleep 0.3

if ! i2cdetect -y 3;
then
        echo "not detect slave addr"
        echo "NG"
fi

証明書とリファレンスキーを取得する

AWS IoT Core に登録する X.509 証明書と、デバイス認証に利用するリファレンスキーを EdgeLock SE050 から取得します。 以下を参考にセットアップ作業を行う前にミドルウェアのインストールと取得作業を行います。

Armadillo を起動したらログイン後にミドルウェアをインストールします。

[armadillo ~]# apt-get update 
[armadillo ~]# apt-get upgrade
[armadillo ~]# apt-get install se05x-tools plug-and-trust-tools

インストールが終わったら、環境変数を設定します。

[armadillo ~]# export OPENSSL_CONF=/etc/plug-and-trust/openssl11_sss_se050.cnf
[armadillo ~]# export EX_SSS_BOOT_SSS_PORT=/dev/i2c-3:0x48
Plug & Trust MW の利用開始前に環境変数 OPENSSL_CONF と EX_SSS_BOOT_SSS_PORT を設定してください。
OpenSSL engine を介して EdgeLock SE050 にアクセスする際には OPENSSL_CONF の設定が利用されます。
また、Plug & Trust MW を利用したアプリの初期値として EX_SSS_BOOT_SSS_PORT が利用されることもあります。

証明書を取得します。

[armadillo ~]# se05x_getkey 0xF0000111 devcert.pem /dev/i2c-3:0x48

リファレンスキーを取得します。

[armadillo ~]# se05x_getkey 0xF0000110 refkey.pem /dev/i2c-3:0x48

aws-cli のインストール

aws-cli をインストールします。

[armadillo ~]# pip3 install awscli --upgrade --user
[armadillo ~]# export PATH=/root/.local/bin:$PATH

aws-cli のバージョンは以下のコマンドで確認できます。

[armadillo ~]# aws --version
aws-cli/1.25.34 Python/3.7.3 Linux/4.9.133-at21 botocore/1.27.34

AWS のコンフィグレーションを実施する

AWS のコンフィグレーションが未実施の場合、 aws configure コマンドを実行します。

[armadillo ~]# aws configure

各パラメーターは以下の通りに設定します。

  • AWS Access Key ID [None]: new_user_credentials.csv の Password 列に記載されている文字列
  • AWS Secret Access Key [None]: new_user_credentials.csv の Access 列に記載されている文字列
  • Default region name [None]: ご利用の region
  • Default output format [None]: json

例えば、Password が AWS123 で Access が AWS/access で
ご利用の region が ap-northeast-1 の場合、以下のようになります。

[armadillo ~]# aws configure
AWS Access Key ID [None]: AWS123
AWS Secret Access Key [None]: AWS\access
Default region name [None]: ap-northeast-1
Default output format [None]: json

証明書を AWS IoT Core へ登録する

証明書を AWS IoT Core へ登録します。

[armadillo ~]# aws iot register-certificate-without-ca --certificate-pem file://devcert.pem --status ACTIVE

{
    "certificateArn": "MY-ARN",
    "certificateId": "MY-CERTIFICATED-ID"
}

MY-ARN をメモしておいてください。

ポリシーのアタッチ

ポリシーをアタッチします。
"my_test_policy” は、ポリシーの作成 で設定したポリシー名です。

[armadillo ~]# aws iot attach-policy --target arn:[my-arn] --policy-name my_test_policy

エンドポイント取得

以下のコマンドでエンドポイントを取得します。
MY-ENDPOINT-ADDRESS は後で使用しますので、メモしておいてください。

[armadillo ~]# aws iot describe-endpoint --endpoint-type iot:Data-ATS
{
    "endpointAddress": "MY-ENDPOINT-ADDRESS" 
}

デモのビルド

aws-iot-device-sdk-embedded-C のビルドに必要なパッケージをインストールします。

[armadillo ~]# apt install build-essential cmake libssl-dev git

aws-iot-device-sdk-embedded-C を取得します。

[armadillo ~]# git clone https://github.com/aws/aws-iot-device-sdk-embedded-C.git
[armadillo ~]# git submodule update --init --recursive

移動して、ビルドシステムを生成します。

[armadillo ~/]# cd aws-iot-device-sdk-embedded-C
[armadillo ~/aws-iot-device-sdk-embedded-C]# cmake -S . -Bbuild \
-DAWS_IOT_ENDPOINT="MY-ENDPOINT-ADDRESS" \
-DCLIENT_CERT_PATH="/root/devcert.pem" \
-DCLIENT_PRIVATE_KEY_PATH="/root/refkey.pem" \
-DROOT_CA_CERT_PATH="/root/AmazonRootCA1.pem"
  • AWS_IOT_ENDPOINT には先程入手したエンドポイントを入力します。上記は例です。
  • CLIENT_CERT_PATH には EdgeLock SE050 から入手したX.509 証明書を入力します
  • CLIENT_PRIVATE_KEY_PATH には EdgeLock SE050 から入手したリファレンスキーを入力します
  • ROOT_CA_CERT_PATH には Amazon から入手した Root CA の証明書を入力します

ビルドします。

[armadillo ~/aws-iot-device-sdk-embedded-C]# cd build
[armadillo ~/aws-iot-device-sdk-embedded-C/build]# make

ビルドに成功すると、build/bin にデモアプリが生成されています。

[armadillo ~/aws-iot-device-sdk-embedded-C/build]# ls bin
certificates   http_demo_basic_tls    http_demo_plaintext  mqtt_demo_mutual_auth  ota_demo_core_mqtt              pkcs11_demo_mechanisms_and_digests  pkcs11_demo_sign_and_verify
defender_demo  http_demo_mutual_auth  jobs_demo_mosquitto  ota_demo_core_http     pkcs11_demo_management_and_rng  pkcs11_demo_objects                 shadow_demo_main

デモを実行する

EdgeLock SE050 を利用して AWS IoT Core の接続認証を行い、message を送信します。

[armadillo ~/aws-iot-device-sdk-embedded-C/build]# bin/mqtt_demo_mutual_auth

以下のようなログが出力されると成功です。 無限ループするので途中で止めてください。

[INFO] [DEMO] [mqtt_demo_mutual_auth.c:645] Establishing a TLS session to xxxxx-ats.iot.ap-northeast-1.amazonaws.com:8883.
ssse-flw: EmbSe_Init(): Entry
App   :INFO :Using PortName='/dev/i2c-3:0x48' (ENV: EX_SSS_BOOT_SSS_PORT=/dev/i2c-3:0x48)
sss   :INFO :atr (Len=35)
      00 A0 00 00    03 96 04 03    E8 00 FE 02    0B 03 E8 08 
      01 00 00 00    00 64 00 00    0A 4A 43 4F    50 34 20 41 
      54 50 4F 
sss   :WARN :Communication channel is Plain.
sss   :WARN :!!!Not recommended for production use.!!!
ssse-flw: Version: 1.0.5
ssse-flw: EmbSe_Init(): Exit
ssse-flw: Control Command EMBSE_LOG_LEVEL; requested log level = 4
[INFO] [MQTT] [core_mqtt.c:886] Packet received. ReceivedBytes=2.
[INFO] [MQTT] [core_mqtt_serializer.c:970] CONNACK session present bit not set.
[INFO] [MQTT] [core_mqtt_serializer.c:912] Connection accepted.
[INFO] [MQTT] [core_mqtt.c:1565] Received MQTT CONNACK successfully from broker.
[INFO] [MQTT] [core_mqtt.c:1831] MQTT connection established with the broker.
[INFO] [DEMO] [mqtt_demo_mutual_auth.c:1130] MQTT connection successfully established with broker.

(: 省略)

[INFO] [MQTT] [core_mqtt.c:1047] De-serialized incoming PUBLISH packet: DeserializerResult=MQTTSuccess.
[INFO] [MQTT] [core_mqtt.c:1060] State record updated. New state=MQTTPubAckSend.
[INFO] [DEMO] [mqtt_demo_mutual_auth.c:846] Incoming QOS : 1.
[INFO] [DEMO] [mqtt_demo_mutual_auth.c:861] Incoming Publish Topic Name: testclient/example/topic matches subscribed topic.
Incoming Publish message Packet Id is 1.
Incoming Publish Message : Hello World!.

[INFO] [DEMO] [mqtt_demo_mutual_auth.c:1425] Delay before continuing to next iteration.

(: 省略)

注釈

本 Howto では、 サンプルプログラムの都合でローカルのファイルシステム上に証明書 (devcert.pem)やリファレンスキー (refkey.pem) を配置しておりますが、実際の運用ではセキュアエレメント内に証明書を格納したままで、都度、プログラムで取得・操作された方が安全です。