Azure IoT EdgeでX.509証明書のデバイス認証 - certGen.sh編

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/eb240243-102f-2e1a-9dc5-b7ef374d604d.png)

# 背景

IoTデバイスまたはIoT Edgeデバイスを検証する際は、扱いやすい対称キー認証(SAS)でデバイスを登録して使うと思います。検証後の本番運用ではX.509証明書の認証に切り替える必要がありますが、事前検証としてマイクロソフトさんが提供しているcertGen.shスクリプトを使うことで更にX.509証明書を素早く検証できますので、関連業界の方々に情報共有のため、整理します。

# [参考] OpenSSLを使ってX.509証明書作成

OpenSSLを使ってX.509証明書を作成する場合は以下の手順をご参照ください。

https://qiita.com/motoJinC25/items/4a7c6773c843bb5370b2

# Azure IoT Hubのデバイス認証

IoTデバイスとIoT Edgeデバイスによってデバイス認証方式が異なります。
こちらの記事では、OpenSSLを使って「X.509 自己署名認証」でIoT Edgeデバイスを登録する内容をまとめます。

## IoTデバイス

- 対称キー認証(SAS)
- X.509 CA署名認証(X.509 CA-signed authentication)
- X.509 自己署名認証(X.509 Self-signed authentication)

## IoT Edgeデバイス

- 対称キー認証(SAS)
- X.509 自己署名認証(X.509 Self-signed authentication)

# certGen.shの用語整理

certGen.shはテスト証明書を作成するためのLinuxスクリプトです。
[IoT Edge](https://github.com/Azure/iotedge)リポジトリで付属しているツールですので、今後もcertGen.shという名前で使いますので、違和感を感じてもご容赦ください。

# certGen.shで自己署名によるデバイス認証

## 確認と設定

`openssl`コマンドが必要なのでLinux基盤OSが必要となります。
こちらはRaspberry Pi OSで実行した内容をお見せします。

```bash
$ openssl version  # OpenSSLインストール状態確認
OpenSSL 1.1.1n  15 Mar 2022
$ export DEVICE_NAME="edge_device_001"  # デバイス名定義
```

## IoT Edgeリポジトリをクローン

```bash
$ git clone https://github.com/Azure/iotedge.git
$ cd iotedge
```

## 証明書作成

### 作業ディレクトリ作成

```bash
$ mkdir -p EdgeCert && cd EdgeCert
```

### 証明書スクリプトのコピー

```bash
$ cp ../iotedge/tools/CACertificates/*.cnf .
$ cp ../iotedge/tools/CACertificates/certGen.sh .
```

### X.509ルートCAテスト証明書の作成

```bash
$ ./certGen.sh create_root_and_intermediate
```

### ファイル確認

```bash
$ ls -l certs/
total 20
-r--r--r-- 1 user user 1976 Aug 31 08:58 azure-iot-test-only.intermediate.cert.pem
-rw------- 1 user user 5806 Aug 31 08:58 azure-iot-test-only.intermediate.cert.pfx
-rw-r--r-- 1 user user 3960 Aug 31 08:58 azure-iot-test-only.intermediate-full-chain.cert.pem
-r--r--r-- 1 user user 1984 Aug 11 08:58 azure-iot-test-only.root.ca.cert.pem
$ ls -l csr/
total 4
-rw-r--r-- 1 user user 1626 Aug 31 08:58 azure-iot-test-only.intermediate.csr.pem
$ ls -l private/
total 8
-r--r--r-- 1 user user 3326 Aug 31 08:58 azure-iot-test-only.intermediate.key.pem
-r-------- 1 user user 3326 Aug 31 08:58 azure-iot-test-only.root.ca.key.pem
```

### デバイス証明書の作成

```bash
$ ./certGen.sh create_edge_device_identity_certificate ${DEVICE_NAME}
```

### ファイル確認

```bash
$ ls -l certs/
total 40
-r--r--r-- 1 user user 1976 Aug 31 08:58 azure-iot-test-only.intermediate.cert.pem
-rw------- 1 user user 5806 Aug 31 08:58 azure-iot-test-only.intermediate.cert.pfx
-rw-r--r-- 1 user user 3960 Aug 31 08:58 azure-iot-test-only.intermediate-full-chain.cert.pem
-r--r--r-- 1 user user 1984 Aug 31 08:58 azure-iot-test-only.root.ca.cert.pem
-r--r--r-- 1 user user 1712 Aug 31 09:08 iot-edge-device-identity-edge_device_001.cert.pem
-rw------- 1 user user 5951 Aug 31 09:08 iot-edge-device-identity-edge_device_001.cert.pfx
-rw-r--r-- 1 user user 5672 Aug 31 09:08 iot-edge-device-identity-edge_device_001-full-chain.cert.pem
$ ls -l csr/
total 8
-rw-r--r-- 1 user user 1626 Aug 31 08:58 azure-iot-test-only.intermediate.csr.pem
-rw-r--r-- 1 user user  899 Aug 31 09:08 iot-edge-device-identity-edge_device_001.csr.pem
$ ls -l private/
total 12
-r--r--r-- 1 user user 3326 Aug 31 08:58 azure-iot-test-only.intermediate.key.pem
-r-------- 1 user user 3326 Aug 31 08:58 azure-iot-test-only.root.ca.key.pem
-r--r--r-- 1 user user 1675 Aug 31 09:08 iot-edge-device-identity-edge_device_001.key.pem
```

### X.509自己署名証明書の拇印確認

```bash
$ openssl x509 -in certs/iot-edge-device-identity-${DEVICE_NAME}.cert.pem -noout -fingerprint | sed 's/[:]//g'
SHA1 Fingerprint=ABBDF77D95A28DEAC91DDECECA4C697CAE13830B
```

### 証明書のコピー

```bash
$ sudo cp private/iot-edge-device-identity-${DEVICE_NAME}.key.pem /var/secrets/
$ sudo cp certs/iot-edge-device-identity-${DEVICE_NAME}.cert.pem /var/secrets/
```

### 権限設定と確認

```bash
$ sudo chmod 444 /var/secrets/iot-edge-device-identity-${DEVICE_NAME}.*
$ ls -l /var/secrets/iot-edge-device-identity-${DEVICE_NAME}.*
-r--r--r-- 1 root root 1712 Aug 31 09:14 /var/secrets/iot-edge-device-identity-edge_device_001.cert.pem
-r--r--r-- 1 root root 1675 Aug 31 09:14 /var/secrets/iot-edge-device-identity-edge_device_001.key.pem
```

## Azure IoT EdgeでIoT Edgeデバイス登録

### Azure CLI

Azure CLIを使って証明書認証のエッジデバイスを登録します。
プライマリとセカンダリの両方の拇印に同じ証明書の拇印の値を設定します。

```bash
$ az iot hub device-identity create --device-id ${DEVICE_NAME} --hub-name <IoT Hubリソース名> --edge-enabled --auth-method x509_thumbprint --primary-thumbprint <拇印の値> --secondary-thumbprint <拇印の値>
```

### Azure Portal

Azureポータルでエッジデバイスを登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/8922e684-4019-366c-37d2-eeac7af79a6a.png)

## IoT Edgeデバイスの構成ファイル反映

```bash
$ sudo vi /etc/aziot/config.toml
...
[provisioning]
source = "manual"
iothub_hostname = "<IoT Hubリソース名>.azure-devices.net"
device_id = "<DEVICE_NAME>"

[provisioning.authentication]
method = "x509"
identity_pk = "file:///var/secrets/iot-edge-device-identity-<DEVICE_NAME>.key.pem"
identity_cert = "file:///var/secrets/iot-edge-device-identity-<DEVICE_NAME>.cert.pem"
...
$ sudo iotedge config apply  # 構成ファイルの変更を適用
Azure IoT Edge has been configured successfully!

Restarting service for configuration to take effect...
Stopping aziot-edged.service...Stopped!
Stopping aziot-identityd.service...Stopped!
Stopping aziot-keyd.service...Stopped!
Stopping aziot-certd.service...Stopped!
Stopping aziot-tpmd.service...Stopped!
Starting aziot-edged.mgmt.socket...Started!
Starting aziot-edged.workload.socket...Started!
Starting aziot-identityd.socket...Started!
Starting aziot-keyd.socket...Started!
Starting aziot-certd.socket...Started!
Starting aziot-tpmd.socket...Started!
Starting aziot-edged.service...Started!
Done.
```