Howto

SE050 を使用して AWS IoT Core へ接続する (Armadillo-IoT A6)

本 Howto では、 Armadillo IoT ゲートウェイ A6 に搭載されている、
セキュアエレメント SE050 を使用し AWS IoT Core へ接続するデモの動作方法を説明します。

AWS の マルチアカウント登録 機能により、セキュアエレメント SE050 に出荷時点で格納されている証明書と秘密鍵を使用し、
別途証明書を用意することなく AWS IoT Core へ接続することができます。

以下の手順を参考にしております。
参考 URL

事前に、Howto: SE050 ミドルウェア (Plug&Trust MW) ビルド手順 (Armadillo-IoT A6) を参照し、
NXP 社提供の SE050 ミドルウェアをビルドしておいてください。

本 Howto で使用する証明書など

ファイル名 ファイルの説明
AmazonRootCA1.pem AWS IoT連携サービスで使用するルート証明書。
ここ などから取得できます。
se050_device_cert0_ecc.cer デバイス証明書。
セキュアエレメントに格納されています。
se050_device_key_ref0_ecc.pem 秘密鍵のキーリファレンス。
OpenSSL エンジンへ通知する為の参照キーです。
セキュアエレメントから取得できます。
秘密鍵自体はセキュアエレメントに格納されています。

注釈

本 Howto では、 サンプルプログラムの都合でローカルに証明書 (se050_device_cert0_ecc.cer) と
秘密鍵のキーリファレンス (se050_device_key_ref0_ecc.pem) を配置しておりますが、
実際の運用ではローカルに配置せずプログラム内で取得・保持・操作された方が安全です。

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 側の手順

GPIO 89 を high に設定する

セキュアエレメント SE050 へアクセスするには GPIO 89 を high に設定する必要があります。
以下にスクリプトの例を記載しますのでご利用ください。

#!/bin/sh

GPIO_EXPORT="/sys/class/gpio/export"
GPIO_NUM="89"
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 4;
then
        echo "not detect slave addr"
        echo "NG"
fi

ssscli のインストール

コマンドツール ssscli をインストールします。

# apt install python3
# apt install python3-pip
# apt install libffi-dev
# cd ~/simw-top/pycli/
root@armadillo:~/simw-top/pycli# pip3 install -r requirements.txt
root@armadillo:~/simw-top/pycli# pip3 install --editable src

aws-cli のインストール

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

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

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

# aws --version
aws-cli/1.19.96 Python/3.7.3 Linux/4.14-at******* botocore/1.20.96

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

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

# 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 の場合、以下のようになります。

# 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 へ登録する

SE050 から証明書を取り出します。

# cd
root@armadillo:~# mkdir certs
root@armadillo:~# cd certs
root@armadillo:~/certs# ssscli connect se05x t1oi2c /dev/i2c-4:0x48
root@armadillo:~/certs# ssscli get cert 0xF0000101 se050_device_cert0_ecc.cer
root@armadillo:~/certs# ssscli refpem ecc pair 0xF0000100 se050_device_key_ref0_ecc.pem
root@armadillo:~/certs# ssscli disconnect

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

root@armadillo:~/certs# aws iot register-certificate-without-ca --certificate-pem file://se050_device_cert0_ecc.cer --status ACTIVE

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

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

ポリシーのアタッチ

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

# aws iot attach-policy --target "MY-ARN" --policy-name my_test_policy

エンドポイント取得

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

root@armadillo:~/certs# aws iot describe-endpoint --endpoint-type iot:Data-ATS
{
    "endpointAddress": "MY-ENDPOINT-ADDRESS" 
}

デモのビルド

デモのビルドに git が必要なのでインストールします。

# apt install git

~/simw-top/demos/linux/aws_eou/ へ移動します。

# cd ~/simw-top/demos/linux/aws_eou/

~/simw-top/demos/linux/aws_eou/buildScript.sh の "git checkout v4_beta" を "git checkout v4_beta_deprecated" に変更します。

...前略...
git clone https://github.com/aws/aws-iot-device-sdk-embedded-C.git
cd aws-iot-device-sdk-embedded-C
-git checkout v4_beta
+git checkout v4_beta_deprecated
git submodule update --init --recursive
mkdir build
cp ../aws_c_sdk_eou.patch .
git apply aws_c_sdk_eou.patch
cd  build
cmake ../.
cmake -DIOT_NETWORK_USE_OPENSSL:BOOL=ON .
make iot_demo_mqtt -j
cp ../../AmazonRootCA1.pem output/bin/

buildScript.sh に実行権限を付与しビルドします。

root@armadillo:~/simw-top/demos/linux/aws_eou# chmod +x buildScript.sh
root@armadillo:~/simw-top/demos/linux/aws_eou# ./buildScript.sh

デモ実行

sscli で使用する i2c のポートを export します。

root@armadillo:# export EX_SSS_BOOT_SSS_PORT=/dev/i2c-4:0x48

SE050 用の OPENSSL 設定ファイルのパスを export します。

root@armadillo:# export OPENSSL_CONF=/root/simw-top/demos/linux/common/openssl11_sss_se050.cnf

証明書を ~/simw-top/demos/linux/aws_eou/aws-iot-device-sdk-embedded-C/build/output/bin へコピーします。

# cp ~/certs/se050_device* ~/simw-top/demos/linux/aws_eou/aws-iot-device-sdk-embedded-C/build/output/bin/.

以下のコマンドを実行すると、iotdemo/# のトピックが更新されます。
"my_armadillo001" は、モノの作成 で設定したモノの名前です。

root@armadillo:~/simw-top/demos/linux/aws_eou/aws-iot-device-sdk-embedded-C/build/output/bin# ./iot_demo_mqtt -i "my_armadillo001" -h "MY-ENDPOINT-ADDRESS" -r AmazonRootCA1.pem -c  se050_device_cert0_ecc.cer -k se050_device_key_ref0_ecc.pem