OpenWeave ファクトリ プロビジョニング ツール

GitHub のソースを見る

OpenWeave Factory プロビジョニング ツールは、永続的なデバイスごとの構成情報を Weave 対応デバイスにプロビジョニングするための便利な手段を提供します。ファクトリー プロビジョニング ツールは、お客様に発送する前に個々のデバイスに一意の ID と認証情報を刻印する製造ラインプロセスの一部として使用します。また、デベロッパーは、開発プロセスで使用する生産開始前のハードウェアをカスタマイズするためにも使用できます。

運用理論

OpenWeave Factory プロビジョニング ツールの目的は、選択した構成情報をデバイスの永続構成ストアに挿入することです。この構成ストアは、デバイスのファームウェアによって実行時に取得され、使用できます。永続的なデバイス設定は通常、デバイスの内部フラッシュに保存されます。ただし、データの保存方法やその形式の詳細は、プラットフォームによって異なります。ファクトリ プロビジョニング ツール自体は、最終的なストレージ形式とは関係がなく、デバイスのファームウェア内のコードを使用して適切な方法でデータを書き込むものです。ツールのユーザー インターフェースは、構成されているハードウェアの種類にも大きく依存しています。つまり、異なるハードウェア プラットフォームに基づく製品ライン間で同様の製造プロセスを使用できます。

Factory Provisioning Tool は、JTAG や SWD ポートなど、なんらかのデバッグ インターフェースや制御インターフェースを介してターゲット デバイスに接続されているホストマシン上で動作するように設計されています。このツールは、特別な情報をエンコードした形式で、プロビジョニング情報をデバイスの RAM に挿入します。その後、再起動するように指示されます。再起動すると、デバイスのファームウェアに組み込まれているコードによって、エンコードされたデータが検索され、整合性が検証され、含まれている値がプラットフォームに適した形式で永続ストレージに書き込まれます。

挿入されたプロビジョニング データを検出して処理するオンデバイス コードは、OpenWeave デバイスレイヤに組み込まれており、サポートされている任意のプラットフォームで有効にできます。有効にすると、デバイスが起動するたびに、デバイスの初期化プロセスの早い段階で、コードが自動的に実行されます。 コードは、プラットフォーム固有の RAM 領域をスキャンすることで動作します。適度なマウント メモリ(たとえば <1M)があるプラットフォームでは、使用可能なすべての RAM がスキャンの対象となります。

RAM に配置されると、プロビジョニング データは簡単に識別できる接頭辞でエンコードされるため、スキャン処理中にすばやく検出できます。暗号ハッシュに基づく整合性チェック値は、処理前にデータの有効性を確認するために使用されます。

デフォルトでは、プロビジョニング ツールは、ターゲット デバイス プラットフォームに基づいて、プロビジョニング データを挿入する RAM の場所を選択します。この選択はツールへの引数でオーバーライドできます。通常、デバイスのファームウェアがプロビジョニング データの受信専用の RAM の場所を予約する必要はありません。一般的に、プロビジョニング データは他の目的のために割り当てられる RAM の場所に書き込まれますが、通常はデバイスの起動プロセスの初期段階では使用されません。一般的な選択肢は、初期のシステム スタックの最上部、またはヒープアリーナの最端にあります。

Factory Provisioning Tool は、ターゲット デバイスとのインターフェースとして、一連の外部開発ツールを利用します。使用するツールは、ターゲット デバイスの種類によって異なります。現在、次の 2 つのデバイス インターフェースがサポートされています。

  • デバイスの JTAG または SWD ポートに接続された SEGGER J-Link デバッグ プローブ
  • Espressif ESP32 に接続された USB シリアルポート

J-Link インターフェースは、SEGGER J-Link Commander ツール(JLinkExe)に依存します。これは、ホストマシンに個別にインストールする必要があります。

ESP32 インターフェースは、Espressif esptool.py コマンドに依存しています。このコマンドは Espressif の ESP-IDF SDK の一部として提供されています。

プロビジョニングできる情報の種類

OpenWeave Factory プロビジョニング ツールは、次のタイプの情報をプロビジョニングできます。

  • デバイスのシリアル番号
  • メーカーが割り当てた Weave デバイス ID
  • メーカーによって割り当てられた Weave の証明書と秘密鍵
  • Weave ペア設定コード
  • 商品のリビジョン番号
  • 製造日

一般に、デバイスが正しく動作するには上記の情報がすべて必要ですが、すべての情報を同時にプロビジョニングする必要はありません。そのため、製造プロセスの異なる段階で、さまざまな種類の情報のプロビジョニングが発生する可能性があります。また、後続のプロビジョニング ステップで、以前にプロビジョニングされた値を新しい値に置き換えることもできます。

プロビジョニング情報のソース

デバイスのプロビジョニング情報は、次の方法で Factory Provisioning Tool に供給できます。

  • コマンドライン引数
  • プロビジョニング用の CSV ファイルを使用する
  • Nest プロビジョニング サーバーから値を取得する

コマンドライン

最もシンプルな形式では、デバイスのプロビジョニング情報を OpenWeave Factory プロビジョニング ツールにコマンドラインで直接指定します。 次に例を示します。

./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000001 \
    --pairing-code NESTUS --mfg-date 2019/04/01

Weave 証明書や秘密鍵などのバイナリデータ値は、base-64 文字列または未加工(バイナリ)形式の目的のデータを含むファイルの名前として指定できます。

使用可能なコマンドライン引数の全一覧については、以下をご覧ください。

CSV ファイルのプロビジョニング

デバイスの一括プロビジョニングに対応するために、Factory Provisioning Tool で CSV 形式のプロビジョニング データファイルからプロビジョニング データを読み取ることもできます。このファイルの列は、特定のプロビジョニング データ型(Serial_NumCertificatePrivate_Key など)に対応している必要があります。ファイルの行には、特定のデバイスの個々の値が、Weave デバイス ID(Device_Id)でインデックスが付けられています。プロビジョニングする特定のデバイスの ID は、コマンドラインで指定する必要があります。次に例を示します。

./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000001 \
    --prov-csv-file ./dev-provisioning-data.csv

次の CSV 列がサポートされています。

名前 Format Description
Device_Id 16 桁の 16 進数値 Weave デバイス ID。必ず追加してください。
Serial_Num 文字列 デバイスのシリアル番号です。
Certificate base64 文字列 メーカーによって割り当てられた Weave デバイスの証明書
Private_Key base64 文字列 メーカーによって割り当てられた Weave の秘密鍵。
Pairing_Code 文字列 Weave のペア設定コード
Product_Rev 整数 商品のリビジョン番号。
Mfg_Date YYYY/MM/DD デバイスの製造日

列は任意の順序で CSV ファイルに表示されます。Device_Id を除くすべての列は省略可能です。CSV ファイルにない値は、単にデバイスにプロビジョニングされません。

ユーザーは、CSV ファイルに加えて、コマンドラインでも個別のプロビジョニング値を指定できます。この場合、コマンドライン値がファイル内の値よりも優先されます。

Factory Provisioning Tool でサポートされる CSV ファイル形式は、weave ツールの gen-provisioning-data コマンドの出力と互換性があります。

Nest プロビジョニング サーバー

ファクトリー プロビジョニング ツールは、HTTPS ベースのプロトコルを使用して、Nest プロビジョニング サーバーから選択したプロビジョニング情報を取得します。プロビジョニング サーバー プロトコルを使用すると、メーカーによって割り当てられた Weave デバイス証明書、対応する秘密鍵、プロビジョニング サーバーからの Weave ペア設定コードを取得できます。

プロビジョニング サーバーのネットワークの場所は、プロビジョニング ツールのコマンドラインでベース URL を指定して指定します。コマンドラインで Weave デバイス ID を指定して、目的のプロビジョニング情報を選択します。次に例を示します。

./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000001 \
    --prov-server https://192.168.172.2:8000/

ユーザーは、プロビジョニング サーバーの URL に加えて、コマンドラインでも個々のプロビジョニングの値を指定できます。この場合、コマンドラインから指定された値は、サーバーから返された値よりも優先されます。

ファクトリー プロビジョニング サポートの有効化 / 無効化

デバイスのファームウェアにおける OpenWeave のファクトリー プロビジョニングのサポートは、WEAVE_DEVICE_CONFIG_ENABLE_FACTORY_PROVISIONING コンパイル時構成オプションによって制御されます。このオプションはデフォルトで有効になっています。この機能は、アプリの WeaveProjectConfig.h ファイル内のオプションをオーバーライドすることで無効にできます。次に例を示します。

#define WEAVE_DEVICE_CONFIG_ENABLE_FACTORY_PROVISIONING 0

一般に、デバイスのデバッグ インターフェースが本番環境のデバイスで適切に無効になっている場合は、本番環境のデバイスのファームウェアでファクトリー プロビジョニングを有効にすれば安全です。これは、ハードウェア手段(SoC のヒューズなど)、またはソフトウェア(ブートプロセスの一部としてデバッグ アクセスをブロックするセキュア ブートローダーなど)を通じて実現できます。

Factory プロビジョニング ツールを実行する

OpenWeave Factory プロビジョニング ツールは、以下のコマンドライン オプションをサポートしています。

オプション Description
--target <string> 対象のデバイスタイプ。選択肢: nrf52840esp32
--load-addr <hex-digits> プロビジョニング データが書き込まれるデバイスのメモリ内のアドレス。
--verbose、-v 出力の詳細レベルを調整します。複数の引数を使用して詳細度を高めます。
--serial-num <string> デバイスのシリアル番号を設定します。
デバイス ID <16 進数 メーカーによって割り当てられたデバイス ID を設定します。
--device-cert <base-64> | <file&name> メーカーによって割り当てられた Weave デバイスの証明書を設定します。
--device-key <base-64> | <file&name> メーカーによって割り当てられた Weave デバイスの秘密鍵を設定します。
--pairing-code <string> デバイスのペア設定コードを設定します。
--product-rev <integer> デバイスの製品リビジョンを設定します。
--mfg-date <YYYY/MM/DD> | 今日 | 現在 デバイスの製造日を設定します。
--jlink-cmd <path-name> JLink コマンドへのパス。デフォルトは 'JLinkExe' です。
--jlink-if SWD | JTAG J-Link インターフェース タイプ。デフォルトは SWD です。
--jlink-speed <integer> | 適応 | 自動 J-Link インターフェースの速度。
--jlink-sn <string> J-Link プローブのシリアル番号。
--esptool-cmd <path-name> esptool コマンドへのパス。デフォルトは 'esptool.py' です。
--port <path-name> ESP32 用の COM ポートのデバイス名。デフォルトは /tty/USB0 です。
--speed <integer> COM ポートのボーレート。デフォルトは 115200 です。
--prov-csv-file <file-name> プロビジョニング用の CSV ファイルからデバイス プロビジョニング データを読み取ります。
--prov-server <url> プロビジョニング サーバーからデバイスのプロビジョニング データを読み取ります。
--disable-server-validation HTTPS を使用する場合は、プロビジョニング サーバーによって提示された証明書の検証を無効にします。

Examples

次のコマンドは、デバイス ID、シリアル番号、製品のリビジョン、ペア設定コードを特定の値に設定します。製造日は現在の日付に設定されます。また、デバイス証明書と秘密鍵は、openweave-core ソース リポジトリで提供された CSV ファイルで指定された値をテストするように設定されます。

./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000042 \
    --serial-num JAYS_DEVICE_42 --product-rev 1 --pairing-code NESTUS --mfg-date today \
    --prov-csv-file ~/projects/openweave-core/certs/development/device/test-dev-provisioning-data.csv