前回の記事でOpenSSL経由でSE05xを使用する方法を解説しました。
OpenSSLを使用した認証処理を行うアプリケーションの例として、実際にEclipse Mosquitto™ clientを使用したMicrosoft Azure IoT Hubへの接続例を紹介します。
(作業時間:30分 *前回記事までの内容がセットアップ済みの前提)
本記事執筆に使用したハードウェア及びソフトウェアとそのバージョン
ハードウェア:
ソフトウェア:
本記事の概要
SE05xを使用した代表的なアプリケーションの一つとして、IoTデバイスのクラウドへのTLS接続があります。
TLS接続には製品固有の識別情報、具体的には製品固有の鍵ペアとそれに対応した公開鍵の証明書が必要となります。
製造工程では識別情報を漏洩や改ざんなく安全に生成、書込する必要があり、証明書を生成する認証局とのやり取りも必要となります。当然市場のデバイスからの秘密鍵の漏洩も防ぐ必要があります。これらは非常に複雑で工数及びコストを要する問題です。
SE05xは秘密鍵を強力に保護できるだけでなく、NXPの認証局が署名した製品固有の識別情報が標準で書き込まれているため、この識別情報をそのまま使用できるアプリケーションに対してはこれらの問題を考慮する必要がなくなります。
代表的なIoT機器向けクラウドサービスとしてはAWS IoT CoreやAzure IoT Hubなどがありますが、今回はAzure IoT Hubを使用します。Azure IoT Hubとの通信にはMQTTというプロトコルを使用します。
IoT機器はMQTTクライアントとしてAzure IoT Hubと接続しますが、今回はMQTTクライアントアプリケーションとしてMosquitto clientを使用します。
Mosquitto clientはTLS接続にOpenSSLを利用しているため、OpenSSL providerを使用することで、SE05x内のkeyを使用してTLS接続することができます。
本記事では事前準備として、Raspberry Pi上ではデバイス証明書の取得とReference Keyの生成を行います。その後、Azure IoT Hubをセットアップし、NXP認証局証明書とデバイス証明書から取得したデバイスIDを登録します。
picture1.png
事前準備が完了したら実際にMosquitto Clientを使用した接続を行います。
まずOpenSSL provider経由でSE05xからデバイス署名の取得が行われます。デバイス署名とデバイス証明書をAzure IoT Hubに送信すると、証明書の署名検証及びデバイスIDの検証が行われ、デバイス署名の検証が行われることでTLS認証処理が完了します。
picture1.png
注意: Azure IoT Hubの利用料について
Azure IoT Hubは従量課金制のサービスです。
しかし本記事執筆時点ではAzure IoT Hubについては一日のメッセージ量の制限を超えない限り常時無料となっています。
ただし料金は変更される可能性があるため、例を試す前にAzure IoT Hubの利用料金について確認してください。
以下ページに無料で試用可能なAzureサービスの記載があります。
無料の Azure サービスを検討する | Microsoft Azure
作成したAzure IoT Hubを削除することもできるため、試用後しばらく使う予定が無ければ念のため削除しておいてもよいでしょう。
SE05x内の証明書の取得と証明書チェーンについて
前回の記事でSE050からreference keyを取得したのと同様に、ssscliを使用して証明書を取得します。
後ほどreference keyも使用するので同じディレクトリに置いています。
以下コマンドを実行します。
cd simw-top/pycli/
source venv/bin/activate
cd se050_keys/
ssscli connect se05x t1oi2c none
ssscli get cert 0xF0000101 ./device_cert_0xf0000101.pem
ssscli disconnect
以下コマンドで取得した証明書の内容を表示できます。
openssl x509 -text -noout -in device_cert_0xf0000101.pem
実行結果は以下のようになります。
(venv) shinji@raspberrypi:~/SE-PLUG-TRUST-MW_04.07.01/simw-top/pycli/se050_keys $ openssl x509 -text -noout -in device_cert_0xf0000101.pem
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
04:00:50:01:6a:17:2a:e0:43:2e:7c:04:27:6a:d2:9c:1d:90:00:00
Signature Algorithm: ecdsa-with-SHA256
Issuer: OU = Plug and Trust, O = NXP, CN = CloudConn-Intermediate-040050010001A921-ECC
Validity
Not Before: May 29 00:00:00 2024 GMT
Not After : May 26 00:00:00 2036 GMT
Subject: OU = Plug and Trust, O = NXP, CN = CloudConn0-ECC-040050016A172AE0432E7C04276AD29C1D90
Subject Public Key Info:
Public Key Algorithm: id-ecPublicKey
Public-Key: (256 bit)
pub:
04:e7:e0:f5:77:d7:b7:6f:0c:e6:93:7c:61:bf:85:
5e:80:37:76:9a:01:e3:e4:18:60:67:7a:3f:ab:bd:
9b:b6:53:64:4d:40:9b:07:c6:18:c9:5a:74:b9:c7:
c8:d4:ae:2e:49:ae:68:63:de:64:77:6d:1e:1c:94:
4b:bb:70:10:0b
ASN1 OID: prime256v1
NIST CURVE: P-256
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature
X509v3 Subject Alternative Name:
email:d:NXP-SE050-EC-D:040050016A172AE0432E7C04276AD29C1D90
Signature Algorithm: ecdsa-with-SHA256
Signature Value:
30:45:02:21:00:d0:f3:4f:52:03:2a:1d:f9:f9:6f:92:a6:31:
a8:dc:59:ca:bc:ea:e9:08:3a:dc:3d:f0:ca:99:54:53:d0:5b:
23:02:20:35:05:2e:cf:14:22:93:04:6c:99:24:8d:75:0b:f1:
06:00:bc:76:b2:dc:80:e8:a3:e6:27:e0:f7:c8:7f:a7:ce
Subject CNのCloudConn0-ECC-以降はSE050のUIDとなっています。
証明書発行元の認証局の証明書は、AN12436 3.11.5 Cloud Onboarding ECCから入手できます。
以下にも証明書チェーンと証明書の入手先リンクを記載します。
Root CA(CN=NXP RootCAvE305)
https://www.gp-ca.nxp.com/CA/getCA?caid=63709315050001
↓
Intermediate CA(CN=NXP Intermediate-4LayerCAvE205)
https://www.gp-ca.nxp.com/CA/getCA?caid=63709315060001
↓
SE050E2/Dev Kit E variant Intermediate CA(CN=CloudConn-Intermediate-040050010001A921-ECC)
https://www.gp-ca.nxp.com/CA/getCA?caid=63709315070011
↓
SE050(Subject CN = CloudConn0-ECC-040050016A172AE0432E7C04276AD29C1D90)
以下コマンドで証明書をダウンロードしてpemフォーマットに変換し、検証できます。
wget "https://www.gp-ca.nxp.com/CA/getCA?caid=63709315050001" -O RootCA.crt
wget "https://www.gp-ca.nxp.com/CA/getCA?caid=63709315060001" -O IntermediateCA.crt
wget "https://www.gp-ca.nxp.com/CA/getCA?caid=63709315070011" -O IntermediateCA_devkit_e.crt
openssl x509 -in RootCA.crt -inform der -out RootCA.pem
openssl x509 -in IntermediateCA.crt -inform der -out IntermediateCA.pem
openssl x509 -in IntermediateCA_devkit_e.crt -inform der -out IntermediateCA_devkit_e.pem
openssl verify -CAfile RootCA.pem -untrusted IntermediateCA.pem -untrusted IntermediateCA_devkit_e.pem device_cert_0xf0000101.pem
Azure IoT Hubの作成
以下から進んでAzure subscriptonを作成します。
https://azure.microsoft.com/ja-jp
作成方法はweb上に多数情報がございますので割愛させていただきます。
AN12402 3.4 Create Azure subscriptionも参考にしてください。表示が古いです手順は同じです。
*AN12402も本記事同様にAzure IoT Hubへの接続方法を解説していますが、使用しているMCIMX6UL-EVKは製造終了しており、ドキュメント内で使用しているSDカードイメージの配布も終了しています。また本記事ではより手軽に試せるようにいくつか手順を変更しています。
Azure subscriptionの作成が完了したらIoT Hubの作成に進みます。
AN12402 3.5 Create an Azure IoT Hubにも手順がありますが、表示が古いため執筆時点のスクリーンショットを載せます。
・ログインしたら、home左上の「リソースの作成」を選択
picture1.png
・上部の検索窓に「IoT hub」と入力するとIoT Hubが表示されるので、その下部の「作成」を押し「IoT Hub」を押す
picture1.png
・「基本」の入力
- 「リソースグループ」が存在しない場合は新規作成して選択
- 「IoT Hub名」「領域」は任意に入力
- 「レベル」を「無料」にする(無料のIoT ハブは一つしか作成できないので画面ではエラーになっていますが、新規ではエラーとならないはずです)
- 「確認及び作成」を押して次へ
picture1.png
・ネットワーク
「接続の構成」を「パブリックアクセス」に設定後、「確認及び作成」を押して次に
picture1.png
・確認及び作成
「管理」から「タグ」までの内容は変更必要ないはずです。エラーが無ければ下部の「作成」を押して完了します。
Azure IoT Hubへの中間CA証明書の追加
前述した以下リンクからSE050から取得した証明書の発行元CAの証明書をダウンロードします。
SE050E2/Dev Kit E variant Intermediate CA(CN=CloudConn-Intermediate-040050010001A921-ECC)
https://www.gp-ca.nxp.com/CA/getCA?caid=63709315070011
「63709315070011.crt」という名前でダウンロードされますが、そのままでは拡張子が対応していないと表示されアップロードできないので「63709315070011.cer」に変更します。
IoT Hubの管理画面を開き、左側の「セキュリティ設定」->「証明書」と進み、画面上部に表示される「追加」を押してCA証明書を追加します。
- 「証明書名」は何でもよいです。ここでは「IntermediateCA_devkit_e」としました。
- 証明書ファイルは先ほどダウンロードした証明書(.cerに拡張子を変更)を選択します。
- 「アップロード時に証明書の状態を確認済みにする」にチェックを入れ、「保存」を押してください。
picture1.png
証明書が追加され、「状態」が「確認済み」となっていることを確認してください。
次はデバイスを追加します。
画面左の「デバイス管理」->「デバイス」と進み、上部に表示される「デバイスの追加」を押してください。
「デバイスID」に先ほど確認したSE050から取得した証明書のSubject CNを入力(ここでは「CloudConn0-ECC-040050016A172AE0432E7C04276AD29C1D90」)
「認証の種類」を「X.509 CA 署名済み」に設定して保存します。
picture1.png
デバイスが追加されました。これで準備完了です
picture1.png
Mosquitto clientを使用したAzure IoT Hubへの接続
以下コマンドでmosquitto clientをインストールします
sudo apt install mosquitto-clients
以下コマンドでIoT Hubにメッセージを送信できます。
OPENSSL_CONFの値は前回記事を参考に適宜変更してください。
IOT_HUB_NAMEにはIoT Hubの画面左上に表示される作成したIoT Hubの名前、DEVICE_NAMEはデバイス作成時に入力したSE050の証明書のSubject CNを使用します。
export OPENSSL_CONF=/home/shinji/SE-PLUG-TRUST-MW_04.07.01/simw-top/demos/linux/common/openssl30_sss_se050.cnf
export IOT_HUB_NAME=ShinjiIotHubTest
export DEVICE_NAME=CloudConn0-ECC-040050016A172AE0432E7C04276AD29C1D90
mosquitto_pub -h "${IOT_HUB_NAME}.azure-devices.net" -p 8883 -u "${IOT_HUB_NAME}.azure-devices.net/${DEVICE_NAME}/api-version=2016-11-14" -t "devices/${DEVICE_NAME}/messages/events/" -m '{"mes":"Hello Azure with SE050!"}' --capath /etc/ssl/certs/ --cert device_cert_0xf0000101.pem --key reference_key_0xf0000100.pem -i ${DEVICE_NAME} -d -q 1
以下のように表示されれば成功です。
App :INFO :If you want to over-ride the selection, use ENV=EX_SSS_BOOT_SSS_PORT or pass in command line arguments.
sss :INFO :atr (Len=35)
01 A0 00 00 03 96 04 03 E8 00 FE 02 0B 03 E8 00
01 00 00 00 00 64 13 88 0A 00 65 53 45 30 35 31
00 00 00
sss :WARN :Communication channel is Plain.
sss :WARN :!!!Not recommended for production use.!!!
sssprov-flw: Get random data from SE05x
sssprov-flw: Get random data from SE05x
sssprov-flw: Get random data from SE05x
sssprov-flw: Get random data from SE05x
sssprov-flw: Get random data from SE05x
sssprov-flw: Get random data from SE05x
sssprov-flw: Get random data from SE05x
Client CloudConn0-ECC-040050016A172AE0432E7C04276AD29C1D90 sending CONNECT
sssprov-flw: Get random data from SE05x
sssprov-flw: Performing ECDSA sign using SE05x
sssprov-flw: Get random data from SE05x
Client CloudConn0-ECC-040050016A172AE0432E7C04276AD29C1D90 received CONNACK (0)
Client CloudConn0-ECC-040050016A172AE0432E7C04276AD29C1D90 sending PUBLISH (d0, q1, r0, m1, 'devices/CloudConn0-ECC-040050016A172AE0432E7C04276AD29C1D90/messages/events/', ... (33 bytes))
Client CloudConn0-ECC-040050016A172AE0432E7C04276AD29C1D90 received PUBACK (Mid: 1, RC:0)
Client CloudConn0-ECC-040050016A172AE0432E7C04276AD29C1D90 sending DISCONNECT
TLS接続の際に乱数生成とECDSA signがSE050経由で行われていることが確認できます。
コマンド実行後にIoT Hub左側の「概要」から下にスクロールしていくと使用されたメッセージ数などが表示されており、「今日使用されたメッセージ」が0から増えているはずです。
picture1.png
IoT Hubへ送信されたメッセージの確認とデバイスへのメッセージ送信
上記でクラウド接続とメッセージの送信は成功しているのですが、送信したメッセージは確認できていません。
確認にはいくつか方法があります。
私は普段はVisual Studio Code + IoT Hub Extensionを使用していたのですが、社用PCのセキュリティ設定が変更されたため動作しなくなりました。
より手軽に確認する方法としてはAzure IoT Hub画面上部のアイコンからCloud Shellを開き、以下のコマンドを入力してもよいです。
export IOT_HUB_NAME=ShinjiIotHubTest
export DEVICE_NAME=CloudConn0-ECC-040050016A172AE0432E7C04276AD29C1D90
az iot hub monitor-events --device-id ${DEVICE_NAME} --hub-name ${IOT_HUB_NAME}
デバイス名とIoT Hub名を適宜変更してください。またパッケージのインストールなどを要求されるため適宜Yを入力してください
「Starting event monitor」の行が表示されたら先ほどと同様にmosquitto_pubを実行することで送信されたメッセージが表示されます。
イベントモニタを終了するにはCloud Shell上でCtrl + Cを入力します。
picture1.png
また同様にデバイスでのIoT Hubからのメッセージ受信のテストも可能です。
受信を開始するにはデバイス側で以下のコマンドを入力します。
mosquitto_sub -h "${IOT_HUB_NAME}.azure-devices.net" -p 8883 -u "${IOT_HUB_NAME}.azure-devices.net/${DEVICE_NAME}/api-version=2016-11-14" -t "devices/${DEVICE_NAME}/messages/devicebound/#" --capath /etc/ssl/certs/ --cert device_cert_0xf0000101.pem --key reference_key_0xf0000100.pem -i ${DEVICE_NAME} -d -q 1
「Subscribed (mid: 1): 1」と表示されたら受信待ちなので、Cloud Shellに以下を入力します
az iot device c2d-message send -d ${DEVICE_NAME} -n ${IOT_HUB_NAME}
以下のように「Ping from Az CLI IoT Extension」と表示されれば成功です。
App :INFO :If you want to over-ride the selection, use ENV=EX_SSS_BOOT_SSS_PORT or pass in command line arguments.
sss :INFO :atr (Len=35)
01 A0 00 00 03 96 04 03 E8 00 FE 02 0B 03 E8 00
01 00 00 00 00 64 13 88 0A 00 65 53 45 30 35 31
00 00 00
sss :WARN :Communication channel is Plain.
sss :WARN :!!!Not recommended for production use.!!!
sssprov-flw: Get random data from SE05x
sssprov-flw: Get random data from SE05x
sssprov-flw: Get random data from SE05x
sssprov-flw: Get random data from SE05x
sssprov-flw: Get random data from SE05x
sssprov-flw: Get random data from SE05x
sssprov-flw: Get random data from SE05x
Client CloudConn0-ECC-040050016A172AE0432E7C04276AD29C1D90 sending CONNECT
sssprov-flw: Get random data from SE05x
sssprov-flw: Performing ECDSA sign using SE05x
sssprov-flw: Get random data from SE05x
Client CloudConn0-ECC-040050016A172AE0432E7C04276AD29C1D90 received CONNACK (0)
Client CloudConn0-ECC-040050016A172AE0432E7C04276AD29C1D90 sending SUBSCRIBE (Mid: 1, Topic: devices/CloudConn0-ECC-040050016A172AE0432E7C04276AD29C1D90/messages/devicebound/#, QoS: 1, Options: 0x00)
Client CloudConn0-ECC-040050016A172AE0432E7C04276AD29C1D90 received SUBACK
Subscribed (mid: 1): 1
Client CloudConn0-ECC-040050016A172AE0432E7C04276AD29C1D90 received PUBLISH (d0, q1, r0, m8, 'devices/CloudConn0-ECC-040050016A172AE0432E7C04276AD29C1D90/messages/devicebound/%24.mid=17d6aad5-72cc-4dce-b5f3-13885b73d5a3&%24.to=%2Fdevices%2FCloudConn0-ECC-040050016A172AE0432E7C04276AD29C1D90%2Fmessages%2Fdevicebound&%24.ce=utf-8&iothub-ack=none', ... (30 bytes))
Client CloudConn0-ECC-040050016A172AE0432E7C04276AD29C1D90 sending PUBACK (m8, rc0)
Ping from Az CLI IoT Extension
SE050からのreference key取得とOPENSSL_CONFの設定を除けば通常のMosquitto clientを使用したクラウド接続と全く変わらない手順でSE050内の秘密鍵と証明書を使用可能です。
関連情報
以下記事ではAWS IoT Coreへの接続の解説があります。接続にはMosquitto clientではなくaws-iot-device-sdkを使用しています。
Connecting with EdgeLock SE050E and Raspberry Pi to AWS IoT Core
=========================
本投稿の「Comment」欄にコメントをいただいても、現在返信に対応しておりません。
お手数をおかけしますが、お問い合わせの際には「NXPへの技術質問 - 問い合わせ方法 (日本語ブログ)」をご参照ください。
(既に弊社NXP代理店、もしくはNXPとお付き合いのある方は、直接担当者へご質問いただいてもかまいません。)