はじめに
こんにちは、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標準
試してみた
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) をインストールします。
- minicomのインストール
sudo apt-get install minicom
- ATコマンド送受信用デバイスファイルを確認
sudo minicom -D /dev/ttyUSBX
(ttyUSBX
はデバイスにより異なる)- プロンプト表示後、基本的なATコマンド(
AT
等)を入力しレスポンスを確認 ctrl+a, x
でminicomを終了
セルラー接続の設定
IoT Connect Mobile Type Sの接続のため、wvdialをインストール・接続設定を行います。
wvdial
のインストールsudo apt-get install wvdial
/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
セルラー接続
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アプレットを利用するために使用。 |
- 各種既定パッケージのインストール
apt install pkcs11-provider pcscd opensc pkcs11-dump
- 個別提供パッケージ
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 は、通信モジュールに合わせて調整する
- 個別提供パッケージ
pkcs11-iotsafe
のインストールsudo apt install ./pkcs11-iotsafe_0.1.3-1_arm64.deb
CSRの作成と確認
クライアント証明書作成のためのCSR(証明書署名の要求)を作成します。
- PoC申込者向けに提供されるpoetry管理のスクリプトを実行し、CSRを生成する
- 一定時間後にCSRがAppletConsoleに送信されるのでAppletConsoleにアクセスしCSRをコピーペーストして適当な場所にファイル保存する(ファイル名:
csr.pem
としておく)
CA証明書の作成
クライアント証明書を検証するためのCA証明書を作成します。opensslが利用できる環境であれば、作成場所は特に問いません。 今回はラズベリーパイ内でCA証明書を作成します。
- 秘密鍵の作成
openssl genpkey -algorithm RSA -out ca.key
- CA証明書の作成
openssl req -new -x509 -key ca.key -out ca.crt -sha256 -days 1825 -subj "/C=JP/ST=Tokyo/O=mycompany"
クライアント証明書の作成
- クライアント証明書の作成
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証明書の登録
- AWSコンソールへログインし、AWS IoT Coreを開く
- 「認証機関」>「CA証明書を選択」を選択しca.crtをアップロード(その際に証明書IDを控えておく)
- CAステータスを「ACTIVE」に変更し、その他はデフォルトのまま「登録」をクリック
クライアント証明書の登録
- 続いて「証明書」>「証明書を追加」>「証明書を登録」をクリックし証明書の登録画面を開く
- CA証明書を選択のドロップダウンメニューから前述の証明書IDを選択
- 先に作成したclient.crtをアップロードしクライアント証明書を登録
ドメインの設定
- 「ドメイン設定」>「ドメイン設定を作成」>「続行」を選択
- ドメイン設定名に任意の値を入力し、認証タイプが「X.509」であることを確認する
- アプリケーションプロトコルとしてHTTPSを選択する
- HTTPSでもpublishはできるためこちらを選択
- 「ドメイン設定を作成」を実施する
AWS IoT Coreでのsubscribe設定
AWS IoT Coreにてトピックのsubscribe設定します。
- 「MQTTテストクライアント」>「サブスクライブ」タブを選択
- 「トピックフィルター」に
test/testing
を入力 - 「サブスクライブ」をクリック
こちらの画面で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の作成やクライアント証明書の作成・登録手順が複雑なため、これらのプロセスが簡素化されないと商用運用は難しいとみる。
- この技術がどのような領域の業種や産業で活用できるかについての考察は、次回記載予定。