鍵の保護

この章では、Armadillo-IoT ゲートウェイ G4/Armadillo-X2 と Armadillo Base OS を利用して 鍵を保護する方法と保護された鍵を利用する方法について説明します。

4.1. EdgeLock SE050 を利用したキーストレージ

NXP の EdgeLock SE050 は IoT アプリケーション向けのセキュアエレメントです。 フラッシュメモリを内蔵しており、保存された秘密鍵を外部に露出することなく 暗号処理に利用できます。 ここでは Egelock SE050 をキーストレージとして利用する方法を説明します。

[注記]

EdgeLock SE050 の詳細については以下のデータシートを参照してください。

4.1.1. EdgeLock SE05x Plug & Trust Middleware

EdgeLock SE050 を利用するためのソフトウェアとして、 NXP から ミドルウェア EdgeLock SE05x Plug & Trust Middleware (以下、Plug & Trust Middleware) が提供されています。 ただし、ビルド済みバイナリは提供されないため利用環境に合わせて ビルドの必要があります。

Armadillo Base OS では Alpine Linux と Debian GNU/Linux 向けに Plug & Trust Middleware のビルド済みパッケージを提供しています。 以下は Plug & Trust Middleware 周辺のソフトウェアスタックです。 提供中のビルド済みパッケージは赤い四角のブロックになります。

./images/se050_software_stack.png

図4.1 Plug & Trust Middleware の周辺のソフトウェアスタック


提供しているパッケージは以下のとおりです。

表4.1 Plug & Trust Middle のパッケージ

パッケージ内容

plug-and-trust

Plug & Trust Middleware のビルド済みライブラリ群。OpenSSL engine を含む。

plug-and-trust-dev

Plug & Trust Middleware の開発用ファイル。アプリケーション開発に利用できます。

plug-and-trust-tools

Plug & Trust Middleware に含まれるサンプルアプリケーション。最小限の動作確認ツール (se05x_Minimal) や機能や固有情報を取得するツール (se05x_GetInfo) など。

se05x-tools

非対称暗号向けの鍵の読み書きツール。


Armadillo Base OS が対応するディストリビューションとバージョンは以下のとおりです。

表4.2 Plug & Trust Middleware のサポート

ディストリビューションバージョン

Alpine Linux

3.15

Alpine Linux

3.16

Debian GNU/Linux

10 (buster)

Debian GNU/Linux

11 (bullseye)


[注記]

本ガイド作成時点では利用したバージョンは以下のとおりです。

  • Plug & Trust Middleware : 04.01.00
  • plug-and-trust : 4.1.0
  • se05x-tools : 1.0.0

4.1.2. EdgeLock SE050 を有効にする

EdgeLock SE050 は ENA ピンがアサートされると有効化されます。

Armadillo Base OS 3.18.5-at.7 (linux 5.10.205-r0) 以降では Armadillo-IoT ゲートウェイ G4/Armadillo-X2 の EdgeLock SE050 はデフォルトで自動的に有効化され、スリープモード中は無効化されるようになっています。

それ以前のバージョンの場合は EdgeLock SE050 が自動的に有効化されないため、 ENA ピンを手動でアサートして Deep Power-down モードを解除する必要があります。

表4.3 SE050 ena pin

SE050 PINi.MX8MP portinitial port status

ENA

GPIO1_IO12

GPIO input


gpioset コマンドを利用して GPIO1_IO12 を出力ポートに変更して high にする。

[armadillo ~]# gpioset gpiochip0 12=1

4.1.3. Plug & Trust Middleware のインストール

Debian と Alpine Linux に対応しますが、ここでは Alpine Linux で作業を進めます。

コンテナを立ち上げます。

[armadillo ~]# podman run -it --name=plug_and_trust --device=/dev/i2c-2 \
-v /etc/apk:/etc/apk:ro docker.io/alpine /bin/sh
[注記]

Debian を利用する場合は、at-debian の利用をお勧めします。 at-debian はアットマークテクノによる動作確認済みの環境です。 apt-get install を利用してインストールしてください。

製品マニュアルを参考にしてください。

パッケージをインストールします。

[container ~]# apk add se05x-tools plug-and-trust-tools

利用のために環境変数を設定します。

[container ~]# export OPENSSL_CONF=/etc/plug-and-trust/openssl11_sss_se050.cnf
[container ~]# export EX_SSS_BOOT_SSS_PORT=/dev/i2c-2:0x48

インストールと環境設定が終わったら、 se05x_GetInfo で EdgeLock SE050 の動作確認を確認します。 アクセスに成功すると以下のようなログが出力されます。

[container ~]# se05x_GetInfo
App   :INFO :PlugAndTrust_v04.01.01_20220112
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
: (省略)

以上で Plug & Trust Middleware を利用するための準備を終わります。

4.1.4. Plug & Trust Middleware を活用する

ここからは実際に Plug & Trust Middleware を用いて EdgeLock SE050 を利用する 方法を説明していきます。

4.1.4.1. EdgeLock SE050 の保存された鍵を利用する

plug-and-trust パッケージには OpenSSL engine のライブラリが含まれており、 OpenSSL を利用して間接的に EdgeLock SE050 を操作することができます。 ここでは例として、EdgeLock SE050 のチップ製造時に書き込まれた鍵を使って OpenSSL で署名と署名の検証を行います。

まず、次のコマンドでリファレンスキーを取得します。

  • keyid = 0xF0000100
  • Cloud connection key 0 (prime256v1)
[container ~]# se05x_getkey 0xF0000100 refkey.pem /dev/i2c-2:0x48
[注記]

チップ製造時に書き込まれた鍵について

「事前書き込みされた鍵と X.509 証明書」 を参照してください。

[注記]

リファレンスキーについて

「リファレンスキー」 を参照してください。

次のコマンドで署名します。message.txt は任意のファイルを用意してください。 取得したリファレンスキーを利用します。

[container ~]# openssl dgst -sha256 -sign refkey.pem -out sig.bin message.txt
ssse-flw: EmbSe_Init(): Entry
App   :INFO :Using PortName='/dev/i2c-2:0x48' (ENV: EX_SSS_BOOT_SSS_PORT=/dev/i2c-2: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

署名が正しいかどうかを確認するために署名を検証します。

[container ~]# openssl dgst -sha256 -prverify refkey.pem -signature sig.bin message.txt
ssse-flw: EmbSe_Init(): Entry
App   :INFO :Using PortName='/dev/i2c-2:0x48' (ENV: EX_SSS_BOOT_SSS_PORT=/dev/i2c-2: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
Verified OK
[注記]

クラウドサービスに接続するために事前書き込みされた鍵と証明書を 利用する方法は以下を参照してください。

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

https://armadillo.atmark-techno.com/howto/connect_to_aws_iot_core_for_aiot_g4

EdgeLock SE050 を使用して Azure IoT Hub へ接続する

https://armadillo.atmark-techno.com/howto/connect_azure_iot_hub_for_aiot_g4

4.1.4.2. ユーザーが生成した鍵を保存して利用する

EdgeLock SE050 ではユーザーが生成した鍵を保存することもできます。 一度保存された鍵は、そのまま暗号処理に利用することができるようになります。 ここでは例として、ユーザー鍵を保存して openssl cms で暗号化と復号を実行してみます。

まず、ECC の曲線 prime256v1 の鍵を生成します。証明書の情報はお任せします。

[container ~]# openssl req -x509 -nodes -days 3650 -newkey ec \
-pkeyopt ec_paramgen_curve:prime256v1 -keyout key.pem -out cert.pem

生成した鍵と自己証明書を EdgeLock SE050 に保存します。 keyid は 1 から 0x7BFFFFFF の範囲が利用者に開放されています。

[container ~]# se05x_setkey -f 0x10 key.pem /dev/i2c-2:0x48
[container ~]# se05x_setkey -f 0x11 cert.pem /dev/i2c-2:0x48
[注記]

Secure Object についての詳しい情報は以下を参照してください。

[重要項目]

秘密鍵を EdgeLock SE050 に保存に成功したあとは、利用する際に EdgeLock SE050 にアクセスすることになります。そのため、ファイルシステム上の key.pem は 基本的に必要ありません。セキュリティ上、削除することをお勧めします。

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

[container ~]# se05x_getkey 0x10 refkey.pem /dev/i2c-2:0x48
[注記]

リファレンスキーについて

「リファレンスキー」 を参照してください。

自己証明書に含まれる公開鍵を使って暗号化します。 message.txt は任意のファイルを用意してください。

[container ~]# openssl cms -encrypt -binary -aes256 -in message.txt \
-out message.enc cert.pem

以下はあくまで例ですが、暗号化されたファイルは以下のような内容になります。

[container ~]# cat message.enc
MIME-Version: 1.0
Content-Disposition: attachment; filename="smime.p7m"
Content-Type: application/pkcs7-mime; smime-type=enveloped-data; name="smime.p7m"
Content-Transfer-Encoding: base64

MIIBmQYJKoZIhvcNAQcDoIIBijCCAYYCAQIxggERoYIBDQIBA6BRoU8wCQYHKoZI
zj0CAQNCAARdx2h5MMEe0e7MgYHg179QPxxJvuLTOPONM9NF10V7/3AjgxE1D2XS
Fjgt/btA17HU9l13f6NVRFbZzNVHtxX2MBgGCSuBBRCGSD8AAjALBglghkgBZQME
AS0wgZowgZcwazBTMQswCQYDVQQGEwJKUDEMMAoGA1UECAwDTi9BMQwwCgYDVQQH
DANOL0ExDDAKBgNVBAoMA04vQTEaMBgGA1UEAwwRYXRtYXJrIHRlY2hubyxpbmMC
FA2ES6jQVjVE5fv9KjfD4QqM5hrLBChc/Z1uATls1oxl6aPyYcqf1tns3pR41gko
sturG2/iRRjjQNbwaa2gMGwGCSqGSIb3DQEHATAdBglghkgBZQMEASoEEMl596FU
hh1Rs4sHBcqwmTyAQPyYZLqHHSr1np9CnCxtzcRztheo0gtkC+8elS97GPzKcbpU
gWoOECwNNwyOpTRGxEJ9Mx+C4yW7J7Jiz/XvgDs=

EdgeLock SE050 のキーストレージにある秘密鍵を使って復号します。

[container ~]# openssl cms -decrypt -in message.enc -out message.dec \
-inkey refkey.pem

4.1.5. 補足説明

4.1.5.1. 事前書き込みされた鍵と X.509 証明書

EdgeLock SE050 のフラッシュメモリにはチップ製造時に書き込まれた チップ固有な鍵と NXP に署名された X.509 証明書を保持しています。 それらの鍵や証明書は Armadillo-IoT ゲートウェイ G4/Armadillo-X2 を購入後に すぐにそのままの状態でクラウドサービスなどの PKI に利用できます。 事前に書き込みがされた状態で空き容量はあるので、ユーザーの鍵や証明書を追加することも可能です。

[注記]

事前書き込みされた鍵と証明書については以下のドキュメントを参照してください。 利用可能な keyid、鍵の種類、想定する用途が記載されています。

なお、Armadillo-IoT ゲートウェイ G4/Armadillo-X2 に搭載されている EdgeLock SE050 は Variant C です。

4.1.5.2. リファレンスキー

EdgeLock SE050 は秘密鍵が外部に露出しません。 これは、いったん鍵を EdgeLock SE050 に書き込むと秘密鍵を抜き出すこと ができない (削除や書き換えは可能) という仕様で実現されています。 攻撃者がチップの中にある、どこかのサイトの認証資格などを有する証明書を 得るためには、物理的にチップ自体も必要ということになってきます。

秘密鍵を抜き出すことができない仕様で、どのように秘密鍵を利用するかというと、 リファレンスキーと呼ばれる特殊なファイルで代用します。 リファレンスキーは秘密鍵のフォーマットで保存されますが、 公開鍵部分のみ有効で、それ以外の値は管理用やダミーの情報になっています。 リファレンスキーをファイルシステムに置いておいて、EdgeLock SE050 を利用する時に そのファイルを秘密鍵のように使うと、Plug & Trust Middleware に含まれる OpenSSL の engine のライブラリがフックして EdgeLock SE050 にアクセスします。

4.1.5.3. se05x-tools

se05x-tools は EdgeLock SE050 をキーストレージとして利用するためのツールです。 アットマークテクノから Armadillo Base OS 向けにリリースされています。 se05x-tools の内部では Plug & Trust Middleware を利用しています。 バージョン 1.0.0 ではサポートする Secure Object は非対称暗号鍵のみです。

対応する非対称暗号鍵の種類は以下のとおりです。

se05x-tools でサポートされる ECC カーブ

  • prime192v1, secp224r1, prime256v1, secp384r1, secp521r1

se05x-tools でサポートされる RSA 鍵長

  • 1024bit, 2048bit, 3072bit, 4096bit
[注記]

Secure Object についての詳しい情報は以下を参照してください。