IoT SAFEを試してみた

はじめに

こんにちは、5G&IoT部/IoTサービス部門の下地です。SIMのAppletを活用したサービスの企画・開発に取り組んでいます。 IoT (Internet of Things) デバイスの普及に伴い、セキュリティの重要性が高まっていますが、GSMA規格のIoT SAFE (IoT SIM Applet For Secure End-to-End Communication) は、この課題に対するソリューションとして注目されています。 今回はそのIoT SAFEとAWS IoT Coreを連携させてみます。

IoT SAFEの特徴

特徴は以下の通りです。

  • 安全な鍵管理
    • SIMカード内でキーペアを生成
    • そのため秘密鍵がSIMカード外に流出することなく安全な鍵管理が可能
  • エンドツーエンドの暗号化
    • デバイスはPKCS#11を通じてSIM内の秘密鍵にアクセス可能
    • PKCS#11を通じた署名により安全で標準性の高い相互認証を実現
  • 運用負荷軽減
    • 鍵の生成や公開鍵の登録が自動化されており、手動での運用負担を軽減
  • コスト削減
    • SIMカード内のHSM機能により、IoT機器自体のコスト軽減に貢献
  • リモート管理機能
    • OTA (Over-The-Air) による鍵情報やIoT SAFEアプレットの更新が可能
  • GSMA標準
    • GSMA標準規格に準拠しているため、異ベンダー間での相互運用性を促進
    • 主要諸元

試してみた

NTTコミュニケーションズのIoT Connect mobile Type Sでは、IoT SAFEをPoC (Proof of Concept) として提供しています。PoC申込者には、IoT SAFEアプレット搭載のSIMカードが提供されます。今回はそのSIMカードを用いてIoT SAFEとAWS IoT Coreの連携を試行しました。

構成概要

端末としてラズベリーパイを用い、IoT SAFEの管理コンソール「AppletConsole」と接続し、CA証明書やクライアント証明書を自作し、証明書等をAWS IoT Coreに登録します。

項目 詳細
SIMカード IoT Connect mobile Type S提供のSIMカード
IoT Device Raspberry Pi4 modelB
OS Raspberry Pi OS
通信モジュール EG25-G
CA証明書 OpenSSLによる自作
SIM管理コンソール AppletConsole
デバイス管理 AWS IoT Core

ATコマンド利用設定

デバイスからSIMカード内のIoT SAFE Appletと通信するためATコマンドツール (minicom) をインストールします。

  1. minicomのインストール
    • sudo apt-get install minicom
  2. ATコマンド送受信用デバイスファイルを確認
    • sudo minicom -D /dev/ttyUSBX (ttyUSBXはデバイスにより異なる)
    • プロンプト表示後、基本的なATコマンド(AT等)を入力しレスポンスを確認
    • ctrl+a, x でminicomを終了

セルラー接続の設定

IoT Connect Mobile Type Sの接続のため、wvdialをインストール・接続設定を行います。

  1. wvdialのインストール
    • sudo apt-get install wvdial
  2. /etc/wvdial.conf の編集

     [Dialer Defaults]
     Init1 = ATZ
     Init2 = AT+CGDCONT=1,"IP","mobiledata.ntt.com"
     Phone = *99#
     Username = "a" # ダミーの値が必要
     Password = "b" # ダミーの値が必要
     Modem = /dev/ttyUSB2 # デバイスによって異なる
     Baud = 115200
     Stupid Mode = 1
    
  3. セルラー接続

    • sudo nohup wvdial > wvdial.log 2>&1 &

IoT SAFE連携用パッケージをインストール

IoT SAFE連携に必要なパッケージをインストールします。

パッケージ名 説明
pkcs11-provider PKCS#11(暗号化トークンインターフェース)のプロバイダー。OpenSSLなどからHSMへのアクセスを提供。
pcscd PC/SCデーモン。スマートカードの読み取り・書き込みを管理するためのサーバープロセス。
opensc スマートカードのセキュリティ機能を提供するライブラリ。
pkcs11-dump PKCS#11のデバッグツールで、PKCS#11のオブジェクトを表示。
libifd-atcmd 個別提供パッケージ。ATコマンドを通じてIoT SAFEアプレットと通信時に使用。
pkcs11-iotsafe 個別提供パッケージ。PKCS#11を通じてIoT SAFEアプレットを利用するために使用。
  1. 各種既定パッケージのインストール
    • apt install pkcs11-provider pcscd opensc pkcs11-dump
  2. 個別提供パッケージ libifd-atcmd のインストール
    • sudo apt install ./libifd-atcmd_0.1.6-1_arm64.deb
    • /etc/reader.conf.d/libifd-atcmd の編集 FRIENDLYNAME libifd-atcmd DEVICENAME :/dev/ttyUSB3 LIBPATH /usr/lib/pcsc/drivers/serial/libifdhandler_atcmd.so
    • ATコマンド送受信用のデバイスファイルを指定する
    • DEVICENAME :/dev/ttyUSB3 は、通信モジュールに合わせて調整する
  3. 個別提供パッケージ pkcs11-iotsafe のインストール
    • sudo apt install ./pkcs11-iotsafe_0.1.3-1_arm64.deb

CSRの作成と確認

クライアント証明書作成のためのCSR(証明書署名の要求)を作成します。

  1. PoC申込者向けに提供されるpoetry管理のスクリプトを実行し、CSRを生成する
  2. 一定時間後にCSRがAppletConsoleに送信されるのでAppletConsoleにアクセスしCSRをコピーペーストして適当な場所にファイル保存する(ファイル名:csr.pemとしておく)

CA証明書の作成

クライアント証明書を検証するためのCA証明書を作成します。opensslが利用できる環境であれば、作成場所は特に問いません。 今回はラズベリーパイ内でCA証明書を作成します。

  1. 秘密鍵の作成
    • openssl genpkey -algorithm RSA -out ca.key
  2. CA証明書の作成
    • openssl req -new -x509 -key ca.key -out ca.crt -sha256 -days 1825 -subj "/C=JP/ST=Tokyo/O=mycompany"

クライアント証明書の作成

  1. クライアント証明書の作成
    • openssl x509 -req -in csr.pem -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365 -sha256

AWS IoT Coreへの登録・設定

CA証明書とクライアント証明書をAWS IoT Coreへ登録します。

CA証明書の登録

  1. AWSコンソールへログインし、AWS IoT Coreを開く
  2. 「認証機関」>「CA証明書を選択」を選択しca.crtをアップロード(その際に証明書IDを控えておく)
  3. CAステータスを「ACTIVE」に変更し、その他はデフォルトのまま「登録」をクリック

クライアント証明書の登録

  1. 続いて「証明書」>「証明書を追加」>「証明書を登録」をクリックし証明書の登録画面を開く
  2. CA証明書を選択のドロップダウンメニューから前述の証明書IDを選択
  3. 先に作成したclient.crtをアップロードしクライアント証明書を登録

ドメインの設定

  1. 「ドメイン設定」>「ドメイン設定を作成」>「続行」を選択
  2. ドメイン設定名に任意の値を入力し、認証タイプが「X.509」であることを確認する
  3. アプリケーションプロトコルとしてHTTPSを選択する
    • HTTPSでもpublishはできるためこちらを選択
  4. 「ドメイン設定を作成」を実施する

AWS IoT Coreでのsubscribe設定

AWS IoT Coreにてトピックのsubscribe設定します。

  1. 「MQTTテストクライアント」>「サブスクライブ」タブを選択
  2. 「トピックフィルター」にtest/testingを入力
  3. 「サブスクライブ」をクリック

こちらの画面でpublishされたメッセージを確認できます。

publishの実施

PoC申込時に提供された openssl_iotsafe.cnf を使用して以下スクリプトでHTTPSによるpushを行います。 MQTTSでも大丈夫なはずですが、ひとまず扱いやすいHTTPSで実施してます。

#!/bin/bash

topdir=$(realpath $(dirname $0))

export OPENSSL_CONF=${topdir}/openssl_iotsafe.cnf

# 必要なパスの定義
ENDPOINT="xxxxx.iot.ap-northeast-1.amazonaws.com:8443"
PATH_TO_CERTIFICATE="iotsafe.client.cert"
PATH_TO_PRIVATE_KEY="pkcs11:token=IoTSAFE;type=private;id=%01"
PATH_TO_AMAZON_ROOT_CA_1="AmazonRootCA1.pem"
TOPIC="test/testing"
MESSAGE="{\"message\": \"Hello, world\"}"

# POSTリクエストのHTTPヘッダーとボディを構築
HTTP_REQUEST="POST /topics/${TOPIC}? HTTP/1.1\r\n"
HTTP_REQUEST+="Host: $ENDPOINT\r\n"
HTTP_REQUEST+="Content-Type: application/json\r\n"
HTTP_REQUEST+="Content-Length: ${#MESSAGE}\r\n"
HTTP_REQUEST+="Connection: close\r\n\r\n"
HTTP_REQUEST+="$MESSAGE\r\n"

# OpenSSLでPOSTリクエストを送信
(echo -en "$HTTP_REQUEST"; echo ; sleep 4) | \
openssl s_client \
    -connect $ENDPOINT \
    -cert $PATH_TO_CERTIFICATE \
    -key $PATH_TO_PRIVATE_KEY \
    -CAfile $PATH_TO_AMAZON_ROOT_CA_1 \
    -tls1_2

AmazonRootCA1.pem はAWSの既定サイトからダウンロードしておきます。

publishされたメッセージの確認

ラズベリーパイからpublishを実施すると、先にsubscribe設定した画面にて指定トピックのメッセージを購読できます。

考察

AWS IoT CoreとIoT SAFEの連携についての考察です。

  • SIM内で秘密鍵が生成されるため、秘密鍵等を外部からダウンロードする手間や保管場所に関する懸念からは解放される
  • 今回はOpenSSL上にHTTPSでpublishを実施したが、理屈的にはMQTTSでもpublishできるはずで、こちらは試行錯誤中。
  • クライアントをopenssl s_clientからmosquittoに変えて試行してみたが、mosquittoにはPKCS#11連携にバグがありそうでうまくいかず。
  • ただ、理屈的にはPKCS#11対応アプリケーションであればIoT SAFEアプレットとの連携が容易かとも推測。
  • 現状のAppletConsoleでは、CSRの作成やクライアント証明書の作成・登録手順が複雑なため、これらのプロセスが簡素化されないと商用運用は難しいとみる。
  • この技術がどのような領域の業種や産業で活用できるかについての考察は、次回記載予定。
© NTT Communications Corporation 2014