Howto: EdgeLock SE050 Plug&Trust MW のビルド済みパッケージのインストールと証明書の取得 (Armadillo-IoT G4)
Howto で出来ること
Armadillo-IoT G4 に搭載される EdgeLock SE050C1 にアクセスするためのミドルウェアをビルドして Alpine Linux のコンテナにインストールする。その後で X.509 証明書 とリファレンスキーを取得する。
Howto の概要
- Armadillo-IoT G4 に搭載される EdgeLock SE050 にアクセスするために NXP Semiconductors 製 Plug & Trust middleware をビルドする
- ターゲットボード上の Alpine Linux のコンテナでビルド作業を行ってライブラリをターゲットボードにインストールする
- Plug & Trust middleware に含まれるサンプルアプリケーション se05x_GetInfo を利用してミドルウェアの動作を確認する
- EdgeLock SE050 の CLI 管理ツール (ssscli) を Alpine Linux にインストールする
- EdgeLock SE050 にプリインストールされている X.509 証明書とその対となるリファレンスキーを ssscli を用いて取得する
EdgeLock SE050
NXP Semiconductors 製 EdgeLock SE050 (以下「SE050」という) は IoT アプリケーション向けのセキュアエレメントです。様々なアルゴリズムに対応した暗号エンジン、セキュアストレージを搭載します。内部処理は秘密鍵を露出させることなくセキュアに暗号処理を行うことができます。外部インターフェースは I2C を採用します。また、SE050 はターンキーソリューションとして利用を開始してすぐにクラウドサービスなど PKI を基にしたサービスに接続することができます。チップ固有の X.509証明書などが事前にプロビジョニングされた状態で出荷されます。
SE050 を有効にする
以下を参考に SE050 の Deep Power-down を解除してください。
Plug & Trust Middleware をビルドする
ビルド環境を構築する
Plug and trust ミドルウェアをダウンロードします。
以下のサイトからダウンロードします。ここではユーザーが NXP Semiconductors のサイトで最新版を検索してダウンロードすることを想定しています。
取得したファイルはコンテナから参照できる位置に配置しておいてください。
- 本 Howto 作成時点では 04.02.00 を利用しました
コンテナを立ち上げる
NXP Semiconductors のビルド環境はターゲットボード上のコンテナになります。ここでは alpine を利用します。
コンテナを立ち上げる前に Fash メモリに書き込むために、保存先をディスクに変更します。 一次的に利用するだけであれば以下の作業は不要です。
[armadillo ~]# podman_switch_storage --disk
Alpine Linux コンテナを立ち上げます。
[armadillo ~]# podman run -it --name=dev_se050 --device=/dev/i2c-2 \
-v "$(pwd)":/mnt docker.io/alpine /bin/sh
ビルド環境を構築する
plug and trust をビルドするために必要なパッケージをインストールします。
[container ~]# apk add musl-dev gcc make g++ file \
linux-headers openssl openssl-dev cmake python3
Plug and trust ミドルウェアを展開します。
[container /mnt]# unzip SE-PLUG-TRUST-MW.zip
ビルドスクリプトを変更する
ターゲットの変更 コンテナ上でビルドスクリプトを実行すると正しくプラットフォームを認識できないために、異なるプラットフォーム向けのバイナリを作ってしまいます。imx_native_se050_t1oi2c_openssl_el2go 向けを強制的に True になるように変更する必要があります。i.MX6UL/ULL, i.MX8M Mini 向けの条件文が真になるように変更します。
デバイス設定の変更 PTMW_Applet を Armadillo に搭載されている SE05X_C に変更してください。PTMW_SE05X_Ver を追加してください。
以下が変更内容です。1と2 の変更点が含まれます。
[container /mnt]# cd simw-top
[container /mnt/simw-top]# vi scripts/create_cmake_projects.py
: (省略)
# i.MX6UL/ULL and i.MX8M Mini EVK
if True: #gc.imx_native_compilation() and gc.is_with_el2go(): 1
e = gc.generate_native("imx_native_se050_t1oi2c_openssl_el2go", {
"PTMW_Applet": "SE05X_C",
"PTMW_SE05X_Ver": "03_XX",
"PTMW_SE05X_Auth": "None",
: (省略)
ビルドする
プロジェクトをつくるスクリプトを実行する。
[container /mnt]# cd simw-top
[container /mnt/simw-top]# python3 scripts/create_cmake_projects.py
### Native compilation on iMX Linux for SE05X using T=1 Over I2C for EdgeLock 2GO
#cmake -DPTMW_Applet=SE05X_C -DPTMW_SE05X_Auth=None (省略)...
-- The C compiler identification is GNU 10.3.1
-- The CXX compiler identification is GNU 10.3.1
: (省略)
-- Generating done
Build files have been written to: /simw-top_build/(省略)...
simw-top_build に移動してビルドする。
[container /mnt]# cd simw-top_build/imx_native_se050_t1oi2c_openssl_el2go
[container /mnt/simw-top_build/imx_native_(省略)...]# cmake --build .
: (省略)
[ 1%] Linking C shared library libmwlog.so
[ 1%] Built target mwlog
[100%] Linking C executable ../../../bin/nxp_iot_agent_demo
[100%] Built target nxp_iot_agent_demo
インストールする
ビルド結果をインストールします。
[container /mnt/simw-top_build/imx_native_(省略)...]# make install
[container /mnt/simw-top_build/imx_native_(省略)...]# ldconfig /usr/local/lib
ビルド結果の確認
以下の2つのディレクトリができる。
[container /mnt/simw-top_build]# ls
imx_native_se050_t1oi2c_openssl_el2go simw-top-eclipse_jrcpv1
以下のデモアプリケーションがビルドされる。
[container /mnt/simw-top_build/imx_native_se050_t1oi2c_openssl_el2go]# ls bin
MQTTVersion se05x_ConcurrentEcc
accessManager se05x_ConcurrentSymm
apdu_player_demo se05x_Delete_and_test_provision
claimcode_inject se05x_GetInfo
ex_attest_ecc se05x_I2cMaster
ex_attest_mont se05x_I2cMasterWithAttestation
ex_ecc se05x_InjectCertificate
ex_ecdaa se05x_InvokeGarbageCollection
ex_ecdh se05x_MandatePlatformSCP
ex_hkdf se05x_Minimal
ex_hmac se05x_MultiThread
ex_md se05x_MultipleDigestCryptoObj
ex_policy se05x_PCR
ex_rsa se05x_ReadWithAttestation
ex_se05x_WiFiKDF_derive se05x_TimeStamp
ex_se05x_WiFiKDF_inject se05x_TransportLock
ex_symmetric se05x_TransportUnLock
generate_certificate se05x_ex_export_se_to_host
generate_certificate_key se05x_ex_import_host_to_se
jrcpv1_server seTool
nxp_iot_agent_demo test_Crypto
remote_provisioning_client
サンプルアプリケーションで動作を確認する
se05x_GetInfo を実行する。SE050 にアクセスできると以下のようなログが出力される。
[container /mnt/simw-top_build/imx_native_(省略)/bin]# ./se05x_GetInfo \
/dev/i2c-2:0x48
App :INFO :PlugAndTrust_v03.03.00_20210528
App :INFO :Running ./se05x_GetInfo
App :INFO :Using PortName='/dev/i2c-2:0x48' (CLI)
: (省略)
App :WARN :#####################################################
App :INFO :Applet Major = 3
App :INFO :Applet Minor = 1
App :INFO :Applet patch = 1
App :INFO :AppletConfig = 6FFF
App :INFO :With ECDAA
App :INFO :With ECDSA_ECDH_ECDHE
App :INFO :With EDDSA
App :INFO :With DH_MONT
App :INFO :With HMAC
App :INFO :With RSA_PLAIN
App :INFO :With RSA_CRT
App :INFO :With AES
App :INFO :With DES
App :INFO :With PBKDF
App :INFO :With TLS
App :INFO :With MIFARE
App :INFO :With I2CM
: (省略)
X.509 証明書とリファレンスキーの取得
ssscli のインストール
SE050 ミドルウェア をビルドしてからこの作業を行ってください。
ssscli は SE050 にアクセスすることができる NXP 製のアプリケーションです。 Plug & Trust MW のリリースされたソースファイルに含まれているので、 ここでは Plug & Trust MW のビルドで使用した環境のコンテナとソースファイルを再度、利用していきます。
必要なパッケージをインストールします。
[container ~/simw-top]# apk add py3-pip gcc libffi-dev python3-dev musl-dev
pip を新しくしないとインストールに失敗するケースがあるので回避策です。
[container ~/simw-top]# pip install --upgrade pip
必要なパッケージをインストールします。
[container ~/simw-top]# cd pycli
[container ~/simw-top/pycli]# pip3 install -r requirements.txt
コンソール出力
Collecting click
Downloading click-8.0.3-py3-none-any.whl (97 kB)
(省略)...
Collecting cryptography
Downloading cryptography-36.0.1-cp36-abi3-musllinux_1_1_aarch64.whl (3.7 MB)
(省略)...
Successfully installed cffi-1.15.0 click-8.0.3 cryptography-36.0.1 func-timeout-4.3.5 pycparser-2.21
ssscli をインストールします。
[container ~/simw-top/pycli]# pip3 install --editable src
コンソール出力
Preparing metadata (setup.py) ... done
Requirement already satisfied: cffi in /usr/lib/python3.9/site-packages (from ssscli==4.0.0) (1.15.0)
: (省略)
Successfully installed ssscli-4.0.0
証明書とリファレンスキーを取得する
本 Howto では例として以下の証明書とリファレンスキーを取得します。別の鍵を選択することもできます。その場合は適宜、読み替えてください。
key name | ID |
---|---|
Cloud connection key 0, RSA2048, Die Indivisual |
0xF0000110 (refkey) 0xF0000111 (cert) |
接続します。
[container ~/]# mkdir cert
[container ~/]# cd cert
[container ~/cert]# ssscli connect se050 t1oi2c /dev/i2c-2:0x48
X.509 証明書を取得します。
[container ~/cert]# ssscli get bin 0xF0000111 ./device_cert.der
コンソール出力
Getting Binary data from KeyID = 0xF0000111
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.!!!
Retrieved Binary from KeyID = 0xF0000111
証明書を Azure IoT Hub DPS に登録する際に PEM 形式で登録するので PEM 形式に変換する。
openssl x509 -in device_cert.der -inform der -out device_cert.pem -outform pem
リファンレンスキーを取得する
[container ~/cert]# ssscli refpem rsa pair 0xF0000110 key.pem
コンソール出力
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.!!!
Created reference key for RSA Pair from KeyID = 0xF0000110
取得作業は以上なので切断します。
[container ~/cert]# ssscli disconnect