Device Provisioning Service のグループ登録で使用する証明書について

こんにちは。Azure IoT 開発サポートチームの中神です。

Device Provisioning Service では X.509 証明書を使ったデバイスの認証ならびにプロビジョニング (デバイスの登録) をサポートします。その方法としては以下の 2 種類があります。

[1] デバイスの自己署名証明書を使った個別登録 (Individual Enrollment)
[2] ルート認証局 (Root CA) や中間認証局 (Intermediate CA) で署名された証明書を使うグループ登録 (Group Enrollment)

今回は [2] のグループ登録で使用する証明書とその注意点についてご紹介します。

X.509 証明書を使ったデバイス登録では、SSL / TLS での接続時にデバイスがクライアント証明書を Device Provisioning Service に対して提示します。Device Provisioning Service は提示された証明書を検証して、デバイス登録の可否および対象となる登録エントリを判断します。そして該当する登録エントリで指定された接続情報をデバイスに対して返すことにより、デバイスは IoT Hub に接続することが可能になります。

clip_image001[4]

ここでグループ登録に使用される証明書は一般に以下のような証明書チェーンを構成しています。左端が Root CA の発行する自己署名証明書、右端がデバイス個別のクライアント証明書です。

clip_image002[4]

また Device Provisioning Service における検証済みの証明書とは、Device Provisioning Service にアップロード後、Proof of Possession (所有者証明) が行われた証明書を指します。検証済みの証明書は Azure ポータル上では Verified として表示されます。

clip_image003[4]

Device Provisioning Service (DPS) ではデバイスが提示したクライアント証明書を元に、以下のような流れでデバイス登録の可否を判断します。

1. デバイスが提示した証明書チェーンが有効か(例. 有効期限が切れていないか)。Yes なら次へ進む。
2. 証明書チェーンの中に DPS に登録されて検証済み (Verified) の証明書があるか。Yes なら次へ進む。
3. 個別登録 (Individual Enrollment) にエントリがあるか。あればプロビジョニングを開始する。なければ次へ。
4. グループ登録に中間証明機関 N の証明書の登録があるか。あればプロビジョニングを開始する。なければ次へ。
5. グループ登録に中間証明機関 N-1 の証明書の登録があるか。あればプロビジョニングを開始する。なければ次へ。
6. (証明書チェーンをたどって繰り返す)
7. グループ登録に中間証明機関 1 (ルート証明機関の場合あり) の証明書の登録があるか。あればプロビジョニングを開始する。なければプロビジョニングしない。

ここで重要になるのは、デバイスは Device Provisioning Service に対して、検証済みの証明書までたどることができる証明書チェーンを提示する必要がある点です。
例えば以下のようにルート証明書が検証済みの証明書として登録されており、かつ中間証明機関 2 の証明書がグループ登録の証明書として登録されているケースを考えます。

clip_image004[4]

この時、デバイスが提示する証明書チェーンが上記のように中間証明書までしかなく、検証済みの証明書までたどれない場合は、検証手順 2 で失敗します。そのためデバイスは以下のように完全な証明書チェーンを提示する必要があります。

clip_image005[4]

なお、グループ登録用に指定されただけで、検証されていない中間 (ルート) 証明書は、証明書チェーンの検証には使われません。そのため、検証済みの証明書にいたる完全な証明書チェーンをデバイスから送る必要があります。
また、SSL / TLS のハンドシェイクで中間証明書を含む完全な証明書チェーンを送付するかどうかは、デバイスの OS および Device Provisioning Service SDK の実装、 SDK に渡す証明書の情報に依存するため、個別に確認する必要があります。
例えば Windows OS の場合は証明書チェーンを構成するルート証明書や中間証明書を OS の証明書ストアに追加することで、SSL / TLS 通信時の証明書チェーンにも含まれるようになります。

証明書チェーンが送付されているかどうかは、 SSL / TLS のハンドシェイクのパケットから確認できます。以下は Wireshark を使った確認例です。

clip_image006[4]

この場合はクライアント証明書 (myedge222) の部分しか送られていません。

clip_image007[4]

こちらではクライアント証明書の発行元の中間認証局の証明書 (Azure IoT Hub Intermediate Cert Test Only) も同時に送られています。

X.509 証明書を使ったグループ登録を検証される際のお役に立ちましたら幸いです。