Azure SphereをX.509でAzure IoT Centralに接続する

連休後半に入って、ようやく落ち着いて作業できる時間が取れたので、かねてから気になっていた「Azure SphereをX.509でAzure IoT Centralに接続」をやってみました。

f:id:matsujirushix:20190503200225p:plain

動機

Azure SphereとAzure IoT Centralに接続するのに、いままでは、Azure IoT Centralに手動でデバイスを追加してから、デバイスの接続情報を使ってdps_cstrコマンドでAzure IoT Hub接続文字列を取得して、これをAzure Sphereのコードに埋め込んでいました。

Azure Sphereから見れば、結局、Azure IoT Hubへ接続文字列で繋ぎにいくので分かりやすいわけですが、これを大規模にスケールするには問題があります。

  • Azure IoT Centralに手動で追加が手間
  • SASトークンなので若干不安
  • OTAで配布が困難

と、もやもやしていたところ、X.509でAzure IoT Centralに接続するサンプルコードが公式githubにアップされたので、試してみました。

github.com

やり方

Azure IoT Centralアプリケーションを作成

いつものように、Sign in to Azure IoT CentralにアクセスしてAzure IoT Centralアプリケーションを作ります。Trialでも大丈夫だと思いますが、なにか引っかかるとヤなのでPay-As-You-Goにしておきます。

f:id:matsujirushix:20190503184201p:plain

Azure SphereテナントとAzure IoT Centralを連携

次に、Azure SphereテナントとAzure IoT Centralを連携します。
細かく言うと、Azure Sphereテナントが証明書を発行したデバイスを、Azure IoT Centralが信頼するよう、Azure IoT Centralに設定します。

Azure SphereテナントのCA証明書を取得します。

azsphere tenant download-CA-certificate --output CAcertificate.cer

f:id:matsujirushix:20190503185250p:plain

Azure IoT Centralの、Administration - Device conneciton画面にある、Certificates(X.509)のPrimaryのところのフォルダアイコンをクリックして、さきほど取得したCA証明書を選択します。このとき、拡張子でフィルタされて表示されないので*.*に切り替える必要があります。

f:id:matsujirushix:20190503185740p:plain

すると、「Needs Verification」という警告が表示されているかと思います。これは、さきほど設定したCA証明書(のプライベートキー)を本当に所有しているのか?検証が必要だぞ!という警告です。

それでは、Verificationしましょう。
Primaryのところの歯車マークをクリックして、Verification Codeを生成します。

f:id:matsujirushix:20190503190224p:plain

Verification CodeをAzure Sphereテナントに渡して、検証証明書を取得します。

azsphere tenant download-validation-certificate --output ValidationCertification.cer --verificationcode <Verification Code>

f:id:matsujirushix:20190503190411p:plain

検証証明書をAzure IoT Centralに渡します。
Verifyをクリックして、さきほど取得した検証証明書を選択します。すると、Verifiedに切り替わります。

f:id:matsujirushix:20190503190808p:plain

Azure Sphereアプリケーションに必要な情報を揃える

あとは、Visual Studioazure-sphere-samples/AzureIoT.sln at master · Azure/azure-sphere-samples · GitHub を開いて、環境固有の情報を書き入れて実行するだけですが、、、

現在のサンプルコードでは、これだけの情報を入れる必要があります。

  • Azure IoT Central Scope ID
  • Azure Sphere tenant ID
  • Azure DPS global endpoint URL
  • Azure IoT Hub URL <- 曲者

思うところがいろいろと。

  • Azure Sphere tenant IDは、Azure Sphereアプリケーションで自動的に取得できるのでは?
  • Azure DPS global endpoint URLって、固定だよね??固定じゃないの??
  • Azure IoT Hub URL、、、、デバイスをRegisterしてProvisioningしないと分からない。いつも一緒とは限らないのでは?となるとOTAできない??

特に最後のは、AzureIoTライブラリとPluton Subsystemを連携できるようにしないといけないんでしょうけど、、、GAまでには対処してほしぃ。

気を取り直して、それぞれの情報を取得します。

Azure IoT Central Scope IDは、Azure IoT Centralの、Administration - Device conneciton画面にあります。

f:id:matsujirushix:20190503193305p:plain

Azure sphere tenant IDは、azsphereコマンドで取得します。

azsphere tenant show-selected

f:id:matsujirushix:20190503193430p:plain

Azure DPS global endpoint URLはglobal.azure-devices-provisioning.netです。

Azure IoT Hub URLは、、、
Azure IoT Centralに、ダミーのDevice Template、Real Deviceを登録して、ShowIoTCentralConfigコマンド(もしくはdps_cstrコマンド)で取得します。

f:id:matsujirushix:20190503194259p:plain

Azure Sphereアプリケーションを修正

サンプルコードのAzureIoT.slnを開いて、AzureIoTのapp_manifest.jsonに、先に調べた情報を入力します。

f:id:matsujirushix:20190503194803p:plain

実行

実行すると、出力ウィンドウにAZURE_SPHERE_PROV_RESULT_PROV_DEVICE_ERRORというエラーメッセージが表示されますが、

f:id:matsujirushix:20190503195005p:plain

Azure IoT Centralの、Device Explorer - Unassociated devicesにデバイスが追加されていれば正常です。

ここで自動的に追加されたデバイスの名称はAzure SphereのDevice IDを小文字にしたものです。Device IDはazsphere device show-attachedで確認することができます。

あとは、公式ドキュメントを参考にして、Device Templateを作って、TelemetryやEventを追加(TelemertyにTemperatureとか、EventにButtonPressとか。 )して、デバイスをAssociateすればOKです。

最後に

  • バイスに証明書埋め込まれているっていいね。手間がかからない。
  • 技術要素を学習するのにAzure Sphere + Azure IoT Centralは良さげ。
  • IoT Hub URLを省略できるようにしてほしい。(中の人がんばって!)
  • シナリオによってはAzure Sphereのマルチテナント必要と感じた。