IoT SAFE(PoC)¶
IoT SAFEとは¶
IoT SAFE (IoT SIM Applet For Secure End-2-End Communication) は、GSMAによって策定された、IoT機器とクラウド間の通信を安全に行うために、SIMカードをRoot of Trustとして利用するための標準規格です。
認証や暗号化の機能をもつSIMアプレットを搭載することで、デバイス認証とデータのエンドツーエンドの暗号化を実現する仕組みであり、セルラーネットワークを利用するIoT機器におけるデバイスセキュリティを実現する技術の一つとして期待されています。
本アプレットは、IoT SAFEの標準規格に沿って実装を行ったものです。
IoT SAFEの動作概要¶
IoT SAFEは以下の流れで動作します。
- IoT SAFE専用のOpenAPIから「SIM個別の識別情報」または「識別情報のテンプレート」を登録する。
- IoT SAFEアプレットが起動すると、自動的にキーペアの生成と識別情報の取得が行われる。
- 取得した識別情報から、IoT SAFEアプレットがCSRを生成し、Applet Consoleへ送信する。
- Applet Consoleに登録されたCSRをもとに、CAでクライアント証明書の署名が行われる。
- クライアント証明書をIoT機器に配布する。
- mTLS通信を確立する。
IoT SAFEの動作確認¶
ここでは、IoT SAFEアプレット及びApplet Consoleを利用して、OpenSSLを用いたmTLS通信の動作確認を行います。
動作確認の環境¶
本手順では以下のソフトウェア、ハードウェアの条件で動作確認を行っています。
IoT機器
- Raspberry Pi
- Debian GNU/Linux 12 (bookworm)
- OpenSSL 3.0.11
- デバイス
- 対応機種は こちら を参照してください。
IoTサーバ
- 任意のWEBサーバ等
- クライアント証明書の検証を必須の設定とします。
Applet Console
- アプレットのインストール操作や、公開鍵及びCSRの確認を行います。
事前準備¶
- IoT SAFEをLinux上で動作させるためのパッケージ(libifd-atcmdとpkcs11-iotsafe)をインストールする。
sudo mkdir /opt/iotsafe && sudo chown _apt /opt/iotsafe sudo cp ~/*.deb /opt/iotsafe/ sudo apt install /opt/iotsafe/*.deb
IoT SAFEアプレットのインストール¶
- SIMカードにIoT SAFEアプレットをインストールする。
- Applet Consoleの操作方法 を参照ください。
- SIMカードに正常にIoT SAFEアプレットがインストールされていることを確認する。
- Applet ConsoleのSIMメニューから該当のSIMカードのSIM詳細画面を開く。
- OTAステータスが「Install:Succeeded」となっていることを確認する。
識別情報をApplet Consoleに登録し、CSRおよびクライアント証明書を取得¶
注釈
以下のAPI操作コマンドにおいて、{env_name} ,{iccid}, {api_id}, {api_secret}は環境に合わせて変更する必要があります。
- SIM個別の識別情報または識別テンプレートを登録する。
ここではSIM個別の識別情報を登録する方法を例として示します。
リクエスト
curl -X 'POST' \ 'https://iot-safe.api.{env_name}.sim-applet.com/v1/identity/sim/{iccid}' \ -H 'accept: application/json' \ -H 'api_id: {api_id}' \ -H 'api_secret: {api_secret}' \ -H 'Content-Type: application/json' \ -d '{ "label": "string", "subject": { "commonName": "example.com", "country": "JP", "organizationName": "Example Co.,Ltd.", "organizationalUnitName": "Example Group", "stateOrProvinceName": "Tokyo", "localityName": "Example City", "email": "hoge@example.com" } }'
レスポンス
{ "id": 1, "label": "string", "content": "3079310d300b06035504030c0474657374310b300906035504060c024a50310d300b06035504070c0474657374310d300b06035504080c0474657374310d300b060355040a0c0474657374310d300b060355040b0c0474657374311f301d06092a864886f70d0109010c1074657374406578616d706c652e636f6d", "createdAt": "2024-01-01T00:00:00Z", "iccid": "{iccid}" }
- OTAタスクを確認し、CSR生成コマンドの送信結果がSucceededになったことを確認します。
リクエスト
curl -X 'GET' \ 'https://iot-safe.api.{env_name}.sim-applet.com/v1/ota-tasks?iccid={iccid}' \ -H 'accept: application/json' \ -H 'api_id: {api_id}' \ -H 'api_secret: {api_secret}'
レスポンス
{ "id": 1, "totalItems": 1, "totalPages": 1, "data": [ { "id": 1, "iccid": {iccid}, "identityTemplate": { "id": 1, "label": "string", "content": "3079310d300b06035504030c0474657374310b300906035504060c024a50310d300b06035504070c0474657374310d300b06035504080c0474657374310d300b060355040a0c0474657374310d300b060355040b0c0474657374311f301d06092a864886f70d0109010c1074657374406578616d706c652e636f6d", "createdAt": "2024-01-01T00:00:00Z" }, "simIdentity": null, "file": null, "externalCaConfig": null, "taskType": { "name": "GenerateCSR" }, "status": { "name": "Succeeded" }, "retryCount": 0, "createdAt": "2024-01-01T00:00:00Z", "updatedAt": "2024-01-01T00:00:00Z" } ] }
- IoT SAFEアプレットが接続するまで5分程度かかる場合があります。
- CSRが生成されたことを確認します。
リクエスト
curl -X 'GET' \ 'https://iot-safe.api.{env_name}.sim-applet.com/v1/csr/{iccid}' \ -H 'accept: application/json' \ -H 'api_id: {api_id}' \ -H 'api_secret: {api_secret}'
レスポンス
{ "csr": "-----BEGIN CERTIFICATE REQUEST-----\n ... \n-----END CERTIFICATE REQUEST-----" }
- IoT SAFEアプレットがCSRを生成し送信完了するまで5分程度かかる場合があります。
- クライアント証明書が署名されたことを確認します。
リクエスト
curl -X 'GET' \ 'https://iot-safe.api.{env_name}.sim-applet.com/v1/certificate/{iccid}' \ -H 'accept: application/json' \ -H 'api_id: {api_id}' \ -H 'api_secret: {api_secret}'
レスポンス
{ "certificate": "-----BEGIN CERTIFICATE-----\n ... \n-----END CERTIFICATE-----" }
- APIで確認したCSRとクライアント証明書はSIM詳細画面からも参照することが可能です。
mTLS通信の確立¶
APIまたはGUIから取得したクライアント証明書をファイルに保存し、IoT機器へ配布する。
- mTLS通信でIoTサーバーに接続する。
- クライアント証明書を「iotsafe.client.cert」とした場合、以下のコマンドで通信が行えることを確認します。
openssl s_client \ -connect IoTサーバのIPアドレス:IoTサーバのポート番号 \ -cert "./iotsafe.client.cert" -key "pkcs11:token=IoTSAFE;type=private;id=%01"