Azure IoT HubとDPSのルート証明書移行の話

# 背景
Azure IoT HubとDevice Provisioning Service (DPS)を使っている方（組織）はきっと下記のようなメールをすでにもらっていると思います。最近、どのように対応すればよいかについてお客様からの問い合わせが多数あり、整理することにしました。
簡単に内容をまとめると「Baltimore CyberTrust Root証明書」から「DigiCert Global Root G2証明書」に変更されることでアクションが必要ですとの内容です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/8ff5f7bf-5d67-5d87-a41a-003a640a4161.png" width="40%">

# 知識

Azure IoT Hubで証明書はクラウドのエンドポイント確認とデバイスの検証の大きく二つで使われています。
今回、移行の話はどちらかというとクラウドのエンドポイント確認で使われる証明書が切り替わるとのことです。
Azure IoT Hubリソースを作成すれば、下記のようなエンドポイントが発行されると思います。

```
＜リソース名＞.azure-devices.net
```

デバイスはAzure IoT Hubのクラウドと通信する際はこのエンドポイントに接続しますが、エンドポイントが本物であるかどうかを確認するために証明書が現在、「Baltimore CyberTrust Root証明書」であることです。
デバイスからAzure IoT Hubに接続するフローを整理してみました。結局①(赤)の内容が変わるから、②(緑)の内容で準備してね。という話です。

![2023-01-18_13h44_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/03504f44-547e-f05c-6419-40261b6cd25b.png)


# 影響内容
1. DigiCert Global Root G2証明書がないデバイスについてはAzure IoT Hubの認証ができなくなるので接続できません。
2. Azure IoT Hubの接続IPが変更されるので、IP制限している場合、Azure IoT Hubに接続できません。

# 対応期限
Azure IoT Hubが2023年2月15日から順次新しい証明書に切り替わるので、その日付までに準備しなければいけません。

# 実施手順

## 1. デバイス

- Azure IoT Hubへ接続するデバイスに対して「Baltimore CyberTrust Root」と「DigiCert Global Root G2」両方の証明書を保持するようにします。
  - Azure IoT Hubの証明書が切り替わってからAzure IoT Hubへ問題なく接続できれば「Baltimore CyberTrust Root」証明書は削除できます。
  - デバイス認証方式のSAS、X.509、TPMは今回対応と関係ないです。
  - 基本的にAzure IoT Hubへ接続時はAzure IoT SDKを使っていることが多いし、ほとんどのAzure IoT SDKはOSの証明書ストアに依存して信頼された証明書を取得するため、OSの証明書ストアに証明書が保持されている場合は対応不要です。

### Windowsの確認

証明書マネージャー ツール(CertMgr)で確認できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/974e2edb-5d28-0b7c-788e-4bd2b1767d96.png" width="70%">

### Ubuntuの場合

CA証明書の管理場所で確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/0e805f34-5c18-88f6-bf8f-db8a1388a3c4.png)

```bash:Ubuntu
ls -l /etc/ssl/certs | egrep 'Baltimore|certSIGN'
```

## 2. クラウド

:::note info
放置すればいずれ切り替わりますが、手動切り替えもできるのでその内容で整理します。
:::

### Azureポータル

Azure IoT Hubのルート証明書を確認し、「Migrate to DigiCert Global G2」ボタンをクリックします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/752bdfab-ea1f-7714-6968-3dc4c6fd17b4.png" width="60%">

現在、接続されているデバイスを確認してチェックボックスをチェックしてから「Update」をクリックします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/5320317b-0686-0ecc-f720-3417b53b6095.png" width="60%">

更新中が表示されて1分程度で終了します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/13682b23-905b-3108-b947-952f1342b08c.png" width="40%">

Azure IoT SDKは約45分ごとに再確認するロジックで動いているため、接続解除になっているデバイスが存在するか1時間程度監視します。なければ移行完了となります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/8c9faf01-d9d8-6f7d-6200-5fc6d2e5334d.png" width="60%">

# まとめ

セキュリティ対策で色々制限していたり、Azure IoT DPSにAzure IoT Hubが複数つながっているパターンだと色々考慮しなければいけないですが、基本的にはわざわざ対応することがないかもしれませんが、今回機会を生かして証明書関連の知識を高めていけば良いのではないでしょうか？

---
> 参考ドキュメント
>> [Migrate IoT Hub resources to a new TLS certificate root - Microsoft Learn](https://learn.microsoft.com/en-us/azure/iot-hub/migrate-tls-certificate?tabs=portal)
>> [Azure IoT TLS: Critical changes are almost here! - Microsoft Blog](https://techcommunity.microsoft.com/t5/internet-of-things-blog/azure-iot-tls-critical-changes-are-almost-here-and-why-you/ba-p/2393169)