Azure IoT Hubを久しぶりに触ってみたので個人的な備忘録 5（X.509証明書でIoT Hubに接続）

# はじめに

これは、最近AzureのIoT Hubを触ってなかったので、触ってみる個人的な備忘録です。
何回かに分けてツラツラ触ってみたいと思います。
忙しくなったら途中で終わるかもです。

前回まではデバイス側の基本的な実装をおこなったので、今回はサービス側(クラウド側)をやります。
[初回はこちら](https://qiita.com/mstakaha1113/items/ff5e86ce969caceccb8d)：メッセージングとデバイスツイン
[２回はこちら](https://qiita.com/mstakaha1113/items/02f5ffb49367c3c4bcdd)：メッセージルーティング
[３回はこちら](https://qiita.com/mstakaha1113/items/bf312e34f0ee53fde239)：ファイルアップロード
[４回はこちら](https://qiita.com/mstakaha1113/items/2d80a209a6e4b4d0c0f6)：c2dメッセージとメッセージエンリッチメント

# X.509でIoT Hubに接続
今まではSASキーで接続していましたが、証明書で接続してみます。
自己証明書を使った接続を実施してみます、が証明書作成は面倒です。（個人の感想です。）
もし実施する場合は、手前みそですがこちらが楽です。
[IoT Hub Device Provisioning Service とは？を作りながら理解する - X.509証明書の準備](https://qiita.com/mstakaha1113/items/1ccaaf445ea6f7ffd76c#x509%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%AE%E6%BA%96%E5%82%99)
AzureのCloudShellを使ってコマンド何個かコピペで打ち込めば完成します。
CloudShellの環境であれば、汚れて不要になったときはStorageを削除してしまえば思い出とともに放棄できます。

今回はKeyVaultで自己証明書を作成し、利用してみます。

# Azure KeyVaultで自己証明書を作成
Azure KeyVaultの作成作業は省略します。標準価格レベルで適当に作成します。
そのうえで、Azure KeyVaultポータルメニュー左の"証明書"を選択し、右画面上部"+生成/インポート"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/5e4c7c72-2a6e-03b2-f5a2-4837e9fb61ac.png)
証明書の作成方法を"生成"というデフォルト設定の状態で、適宜値を入力して"作成"ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/f501e02d-b68c-edb0-2c19-970b72fab8cc.png)
最初の画面に戻るので、証明書名をクリック、バージョンをクリックして、証明書情報を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/5e362a84-2d1d-0797-8c8d-e8b74d758f98.png)
表示したら、"CER形式でダウンロード"と"PFX/PEM形式でダウンロード"を実施します。
また、"X.509 SHA-1 拇印 (16 進数)"をコピーしておきます。

# 自己証明書をIoT Hubへ登録
IoT Hubのポータルメニュー左の"証明書"を選択し右画面上部"+追加"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/976ee791-fc6d-01a2-86a9-43e783e23155.png)

適当な証明書名を入力し、先ほどダウンロードしたcerファイルを選択します。
"アップロード時に証明書の状態を確認済みに設定する"のチェックも入れましょう。
これで証明書の登録は完了です。

# 自己証明書を利用するデバイスの登録
デバイスを作成します。
IoT Hubのポータルメニュー左の"デバイス"を選択し右画面上部"+デバイスの追加"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/1cb06d81-a308-876c-83d2-bba78e47fff3.png)
適当なデバイスIDを入れ、認証の種類で"X.509自己署名済み"を選択します。
さきほどコピーした拇印を"プライマリ拇印"と"セカンダリ拇印"にペーストして"保存"ボタンをクリックします。
今回は実施しませんが、本来は証明書を２つ登録しておいて、プライマリとセカンダリでそれぞれ登録して、プライマリ証明がはじかれた時や、キーローテーション的な何かを実施することを目的として拇印は２つ登録できるようになっています。

# 証明書を使ったデバイスアプリをゼロベースから作成
本家のドキュメントのチュートリアルを参照しながら、実行してみます。
[チュートリアル: 証明書の認証をテストする](https://docs.microsoft.com/ja-jp/azure/iot-hub/tutorial-x509-test-certificate)

今回もC#、.NETは6.0.202、VSCodeで作成します。
"x509device"というフォルダを作成し、VSCodeのコンソール(Ctrl＋＠)で以下コマンドを実施します。
> dotnet new console 
dotnet add package Microsoft.Azure.Devices.Client

チュートリアルのコードをコピペし以下を変更しました。
- 20行目の{your-device-id}をx509sample
- 47行目の{full path to pfx certificate.pfx}を先ほどダウンロードしたpfxファイル
- 直後の"{your certificate password}"を""（パスワードは無い）
- 50行目の{your-device-id}をx509sample
- 53行目の{your-IoT-Hub-name}を自身のIoT Hub名(ボクの場合はmatakahaiothubjapaneast1)

実行してみると、無事にメッセージが送信されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/18916890-12e2-989c-2e13-ef848ae1a703.png)

コードはチュートリアルから理解するに必要最小限のものだけにそぎ落としたものを置いておきます。
このままでは使い物にはなりませんが、簡単だということだけわかれば幸いです。
https://github.com/matakaha/iotsample2022/blob/main/x509device/Program.cs


# さいごに
今回はX509証明書を利用してIoT Hubに接続してみました。
余談ですが、証明書作成を終えたらKeyVaultはもう不要です。削除しても大丈夫です。

個人的には、やはりX.509を利用するのであればDevice Provosioning Serviceを使うべきだと思いました。
作るのは簡単ですが、やっぱりDR対策だとか証明書のローテーションだとか、アレコレをまじめに考えると、このまま使うのはどうかなぁと思いました。