#はじめに#
2019/12/14に開かれた IoTSecJPにてお時間をいただき
セキュアエレメントとIoTデバイスセキュリティ
と題してお話させていただきました。
その内容をベースにまとめていきたいと思います。
#証明書の書き込み#
SE050を使ってWEBサーバーへつなぐテストを行いたいが、SE050で生成したパブリックキーへ署名して、証明書を作成し、書き戻してTLSセッションで利用できるようにしなくてはならない。
前回、NXP SE050検証(証明書読み出し)(NXP SE050 cerificate extraction by using ESP32)でプリセットされていた証明書を読み込んだが、今回は同様に証明書を作成し書き戻してみる。
ユーザーが使えるObjectIDはex_sss_objid.hに定義されている。
#define EX_SSS_OBJID_CUST_START 0x00000001u
#define EX_SSS_OBJID_CUST_END 0x7BFFFFFFu
この範囲で、下記のように定義してみた。
#define OBJID_usr_key (EX_SSS_OBJID_CUST_START + 0x10000002u)
#define OBJID_usr_cert (EX_SSS_OBJID_CUST_START + 0x10000003u)
#define OBJID_signer_cert (EX_SSS_OBJID_CUST_START + 0x10000004u)
#define OBJID_root_cert (EX_SSS_OBJID_CUST_START + 0x10000005u)
OBJID_usr_keyはPrime256v1のキーペア
OBJID_usr_certは上記の公開鍵を署名してできた証明書
OBJID_signer_cert、OBJID_root_certはそれぞれ中間証明書、ルート証明書となり、すべての証明書チェーンをSE050内に収めてみる。
Linuxだとssscliというものがあるが、これらをシリアル通信で設定できるcliツールを作ってみた。
ソースはNXP-SE050-provisioning-cli
#cliツール概要#
最低必要なのは、デバイスから公開鍵を取り出すコマンドと、証明書を書き戻すコマンド。
DERエンコードのバイナリはシリアル通信で送れないのでPEMに直してやり取りする。
Rでレディ状態確認。通信できるかの確認に使う
qでアプリケーション終了。
sでシリアル番号をbase64で出力。コモンネームに使ったりできるユニークな番号
kでパブリックキーをpemで出力
rでルートCA証明書の受領モード(pem)
cでSigner CA証明書の受領モード(pem)
vでデバイス証明書の受領モード(pem)
Windows10のTeraTermで動作確認ができた。
I (338) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
App:INFO :PlugAndTrust_v02.12.04_20200228
App:INFO :If you want to over-ride the selection, use ENV=EX_SSS_BOOT_SSS_PORT or pass in command line arguments.
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
I (805) uart: queue free spaces: 10
Ready.
BABQAV5rfvqyOR0EfpAKlGaAReady.
Ready.
-----BEGIN PUBLIC KEY-----
MFkwEwYH….
……………….HyTtI43wIldXw==
-----END PUBLIC KEY-----
抜き出したパブリックキーに署名し、各証明書の書き込みモードにし、pemの文字列をTeraTermで「貼り付け」を行うと書き込まれる。
これを使ってテストWEBサーバーへ接続テストを行ってみる。