NXP® MIMXRT1060-EVKCで始めるZephyr®と MCUbootによるセキュアブート
NXP® MIMXRT1060-EVKCで始めるZephyr®とMCUbootによるセキュアブート
セキュアブートとは
セキュアブートは、機器の起動時に読み込むソフトウェアの 署名やハッシュを検証して正規のコードだけを実行する仕組み です。
不正な改ざんやマルウェアの混入を防ぎ、システムを安全に立ち上げるための重要なセキュリティ機能です。
Zephyrとは
Zephyrは、Linux Foundationが主導する オープンソースのリアルタイムOS(RTOS) です。
軽量で省リソースながら、Bluetooth®やWi-Fi®などの通信機能、セキュリティ機能、デバイスドライバを幅広くサポートしており、マイクロコントローラからIoT機器まで幅広い組込み開発に利用できます。
MCUbootとは
MCUbootは、マイクロコントローラ向けに開発された オープンソースのセキュアブートローダ です。
アプリケーションの署名検証や暗号化をサポートし、ファームウェアの安全な更新やロールバック機能を提供することで、IoT機器や組込みシステムの信頼性とセキュリティを高めます。
開発環境
システム構成要素 | 詳細 |
ホストOS | Windows® 11 |
ターゲットOS | Zephyr v4.2.0 |
ターゲットボード | MIMXRT1060-EVKC |
ボード外観と接続
画像上部のUSBケーブル : DEBUG ポートとPCを接続
画像下部のUSBケーブル : USB OTG ポートとPCを接続
環境構築
パッケージマネージャを使ってホスト環境にいくつかの依存関係をインストール
winget install Kitware.CMake Ninja-build.Ninja oss-winget.gperf python Git.Git oss-winget.dtc wget 7zip.7zip
7zip.exeのパスを環境変数に設定してください。
その他ツールをインストール
- TeraTerm のターミナルプログラムをインストール
- MCUXpresso IDE をインストール
- MCUXpresso Secure Provisioning Tool (以後、SECと記載)をインストール
- NXP® のウェブサイト にアクセスし、Windows 用の SEC インストーラをダウンロードします。
MCUXpresso_Secure_Provisioning_<version>.exe
インストーラをダブルクリックしてインストールを開始します。
Zephyr MCUBoot デモを構築
0) 事前準備
コマンドプロンプトを起動して以下を実行してください。
# 新しい仮想環境を作成する
cd %HOMEPATH%
python -m venv zephyrproject\.venv# 仮想環境を有効化する
zephyrproject\.venv\Scripts\activate.bat# west をインストールする
pip install west# Zephyr のソースコードを取得する
west init zephyrproject
cd zephyrproject
west update# Zephyr CMake パッケージをエクスポートする
west zephyr-export# west パッケージを使って Python® の依存関係をインストールする
west packages pip --install# Zephyr SDK をインストールする
west sdk install# mcumgr が未導入なら(Python venv でも可)
pip install mcumgr# 署名鍵(ここでは RSA-2048)
imgtool keygen -k bootloader\mcuboot\root-rsa-2048.pem -t rsa-2048
1) MCUboot(ブートローダ)単体をビルド&書き込み
MCUbootをビルド
west build -p always -b mimxrt1060_evk/mimxrt1062/qspi -d build-mcuboot bootloader\mcuboot\boot\zephyr
MCUbootのセキュアブート書き込み手順(SEC 使用)
- ターゲットをSerial Downloaderモードに切り替え
- MIMXRT1060-EVK の ブートスイッチ を Serial Downloader (USB) に設定
- USB (DEBUG USB) を PC に接続
- デバイスマネージャで HID デバイス / COM ポートが認識されていることを確認
- SEC プロジェクトを作成
- SEC を起動 → New Workspace を作成
- 「Processor」は「MIMXRT1060」を選択
- 「Boot」は「Authenticated(HAB)」を選択
- 鍵作成
- 「PKI management」タブで「Generate Kyes」ボタンを押下して「Authentication keys」を作成
- ビルドイメージ作成
- 「Source executable image」は、MCUbootのビルド結果が格納されているフォルダパスを設定
例:「..\zephyrproject\build-mcuboot\zephyr\zephyr.elf」)
- 「Authnetication key」は、「PKI management」タブで作成した鍵を任意で選択(例:SRK1:IMG1_1 + CSF1_1)
- 「Build image」ボタンを押下してビルド実行
- 「Source executable image」は、MCUbootのビルド結果が格納されているフォルダパスを設定
- イメージ書き込み
- 「Write image」タブで「Write image」ボタンを押下して書き込みを実行
- ターゲットを通常ブートモードに切り替え
- EVK のブートスイッチを FlexSPI NOR Boot に戻す
- 再起動すると、MCUboot が起動し署名検証を実行 → 有効なアプリのみ起動
- 動作確認
- シリアルターミナル(115200bps)で EVK をモニタ(以下のようなログが出ていれば動作しています)
2) 警告(USB重複)を消す:オーバレイでどちらか無効化
usbd@402e0000
と usbh@402e0000
が同アドレスで同時 enable だと DTS 警告が出ます。使わない方を無効化 してください。
- 以下の場所に overlay ファイルを作成してください。
zephyrproject\bootloader\mcuboot\boot\zephyr\boards\mimxrt1060_evk.overlay
- overlayに以下を書き込んでください。USBホスト を無効化しています。
&usbh { status = "disabled"; };
(Host優先なら &usbd { status = "disabled"; };
)
3) パーティションを確実に:pm_static.yml(推奨)
Slot1 へアップロードできるように、QSPI(8MB想定)に mcuboot/slot0/slot1
を明示します。
- プロジェクト直下に
pm_static.yml
ファイルを作成してください。
例:zephyrproject\bootloader\mcuboot\boot\zephyr\pm_static.yml
- pm_static.ymlに以下の内容を書き込んでください。
# 例: MIMXRT1060-EVK の QSPI 8MB を想定
mcuboot:
address: 0x60000000
size: 0x00080000 # 512KBslot0_partition:
address: 0x60080000
size: 0x00380000 # 3.5MBslot1_partition:
address: 0x60400000
size: 0x00380000 # 3.5MB
4) v0.0.0 の SMP サンプル(mcumgrサーバ)をビルド&書き込み
バージョンを付与して署名バイナリを生成します。
west build -p always -b mimxrt1060_evk/mimxrt1062/qspi -d build-smp-svr-v0 zephyr\samples\subsys\mgmt\mcumgr\smp_svr -- ^
-DOVERLAY_CONFIG=overlay-serial.conf ^
-DCONFIG_MCUBOOT_SIGNATURE_KEY_FILE=\"bootloader/mcuboot/root-rsa-2048.pem\" ^
-DCONFIG_MCUBOOT_EXTRA_IMGTOOL_ARGS=\"--version=0.0.0\"
build-smp-svr-v0を実機に書き込みます。
west flash -d build-smp-svr-v0
5) mcumgr の接続を作成(UART)
mcumgr-cliのインストール
- Go をインストール(未導入なら)
以下のURLからWindows 用 MSIをダウンロードして実行してください。
https://go.dev/dl/
- mcumgr-cli をインストール(公式の Go CLI)
go install github.com/apache/mynewt-mcumgr-cli/mcumgr@latest
mcumgr 接続
mcumgr conn add COMPORT type="serial" connstring="dev=COM3,baud=115200,mtu=512"
- “dev=COM3”はデバイスマネージャーで「MCU-Link VCom Port」を確認することでポート番号がわかります。
- 例:「MCU-Link VCom Port(COM3)」
mcumgr 操作 (イメージリスト表示)
mcumgr -c COMPORT image list
結果
Images:
image=0 slot=0
version: 0.0.0
bootable: true
flags: active confirmed
hash: d62f08cd883eb7d31508bfe32be94df20a773a1cd27ed79cfc51254d333c43d7
Split status: N/A (0)
6) v1.0.0 をビルドして Slot1 にアップロード
west build -p always -b mimxrt1060_evk/mimxrt1062/qspi -d build-smp-svr-v1 zephyr\samples\subsys\mgmt\mcumgr\smp_svr -- ^
-DOVERLAY_CONFIG=overlay-serial.conf ^
-DCONFIG_MCUBOOT_SIGNATURE_KEY_FILE=\"bootloader/mcuboot/root-rsa-2048.pem\" ^
-DCONFIG_MCUBOOT_EXTRA_IMGTOOL_ARGS=\"--version=1.0.0\"
アップロード&イメージリスト表示
mcumgr -c COMPORT image upload -e build-smp-svr-v1\zephyr\zephyr.signed.bin
mcumgr -c COMPORT image list
結果
Images:
image=0 slot=0
version: 0.0.0
bootable: true
flags: active confirmed
hash: d62f08cd883eb7d31508bfe32be94df20a773a1cd27ed79cfc51254d333c43d7
image=0 slot=1
version: 1.0.0
bootable: true
flags:
hash: 1193fbc56fd090c787a33b98de6ca3a72b9a36ff7f41048bad463c384ea2e10e
Split status: N/A (0)
7) 新イメージを試す → 確定する
初期状態は以下を想定しています。
Images:
image=0 slot=0
version: 0.0.0
bootable: true
flags: active confirmed
hash: d62f08cd883eb7d31508bfe32be94df20a773a1cd27ed79cfc51254d333c43d7
image=0 slot=1
version: 1.0.0
bootable: true
flags:
hash: 1193fbc56fd090c787a33b98de6ca3a72b9a36ff7f41048bad463c384ea2e10e
Split status: N/A (0)
- HASH0 = d62f08cd883eb7d31508bfe32be94df20a773a1cd27ed79cfc51254d333c43d7
- HASH1 = 1193fbc56fd090c787a33b98de6ca3a72b9a36ff7f41048bad463c384ea2e10e
次回リセットで v1.0.0 を試す
mcumgr -c COMPORT image test <HASH1>
コマンド実行後にリセットします。
結果
slot0とslot1が入れ替わっていることを確認します。
Images:
image=0 slot=0
version: 1.0.0
bootable: true
flags: active
hash: 1193fbc56fd090c787a33b98de6ca3a72b9a36ff7f41048bad463c384ea2e10e
image=0 slot=1
version: 0.0.0
bootable: true
flags: confirmed
hash: d62f08cd883eb7d31508bfe32be94df20a773a1cd27ed79cfc51254d333c43d7
Split status: N/A (0)
端末が v1.0.0 で起動したら、永続化(ロールバック防止)
mcumgr -c COMPORT image confirm <HASH1>
confirm
しないで再起動すると、MCUboot は 0.0(slot0)へロールバックします。
コマンド実行後にリセットします。
結果
Images:
image=0 slot=0
version: 1.0.0
bootable: true
flags: active confirmed
hash: 1193fbc56fd090c787a33b98de6ca3a72b9a36ff7f41048bad463c384ea2e10e
Split status: N/A (0)
最後に
詳細資料をご希望の方には送付させていただきますので、以下フォームよりメールアドレスをご登録ください。
NXP® は NXP Semiconductors N.V. の登録商標です。
Zephyr® は The Linux Foundation の商標です。
Windows® は米国およびその他の国における Microsoft Corporation の登録商標です。
Python® は Python Software Foundation の登録商標です。
Bluetooth® は Bluetooth SIG, Inc. の登録商標です。
Wi-Fi® は Wi-Fi Alliance の登録商標です。
[2025年10月07日 時点]