Azure IoT Hub と接続する (X.509 CA 証明書を利用した認証)
Beam の MQTT エントリポイントを利用して、Azure IoT Hub (以下、IoT Hub) に複数のデバイスからデータを送信したり、デバイスで IoT Hub からのデータを受信したりできます。
ここでは、データを送受信するデバイスが正規のデバイスであることを保証するために、X.509 CA 証明書を使用したデバイス認証を利用します。X.509 認証の仕組みやデバイス認証の方法について詳しくは、X.509 CA 証明書を使用したデバイス認証 を参照してください。
X.509 CA 証明書とは
「証明書を発行する認証局が信頼できること」を証明するための証明書です。ルート証明書や中間証明書とも呼ばれます。
操作を始める前に準備が必要です (クリックして確認してください)
(1) SORACOM のアカウントを作成して IoT SIM を申し込む / デバイスを購入する
MQTT を使用できるデバイスと、そのデバイスで利用できる IoT SIM を用意します。
例:
- Raspberry Pi + AK-020
- Raspberry Pi + SORACOM Onyx LTE USB ドングル
- Wio LTE
SORACOM アカウントの作成方法、IoT SIM の申し込み方法、およびデバイスの購入方法について詳しくは、SORACOM の利用を始める を参照してください。
(2) Microsoft Azure アカウントを用意する
Microsoft Azure Portal にアクセスして、Microsoft Azure アカウントを作成します。
準備完了ステップ 1: IoT Hub を準備して X.509 CA 証明書および検証証明書を登録する
IoT Hub を準備して、「デバイス証明書に署名する認証局」の X.509 CA 証明書を IoT Hub に登録します。
このステップはデバイスの個数に関わらず 1 回だけ行います。
IoT Hub を準備する
Microsoft Azure Portal にアクセスして、IoT Hub を作成します。詳しくは、Azure Portal を使用して IoT Hub を作成する を参照してください。
なお、以下の項目に設定した内容は、このあとの手順で使用します。設定内容を忘れないでください。
項目 | 説明 |
---|---|
ステップ 4: Beam を使用して IoT Hub にデータを送信する で指定します。 | |
このあとの手順で頻繁に入力します。 |
すでに作成済みの IoT Hub を利用することもできます。
公的なルート証明機関から X.509 CA 証明書を購入する
X.509 CA 証明書を公的なルート証明機関から購入した場合は、その指示に従って設定してください。
独自の X.509 CA 証明書を利用する
動作確認用に限り、独自の X.509 CA 証明書を利用できます
独自の X.509 CA 証明書を発行する手順については、チュートリアル: OpenSSL を使用してテスト証明書を作成する を参照してください。このページで紹介されている Bash スクリプトで作成したテスト証明書は、固定のパスワード ("1234") が設定されており、30 日後に期限が切れます。なお、作成した証明書をアップロードする手順は以下のとおりです。
証明書 | 説明 | ||||||
---|---|---|---|---|---|---|---|
X.509 CA 証明書 | デバイス証明書に署名する認証局の X.509 CA 証明書です。Microsoft が提供する Bash スクリプトを利用した場合は、手順内で作成されます。このファイルは、以下の手順で IoT Hub にアップロードします。
| ||||||
検証証明書 | IoT Hub で生成した確認コードを含み、認証局で署名した証明書です。このファイルは、以下の手順で IoT Hub にアップロードします。
|
コマンドで実施する場合
ステップ 1 の「独自の X.509 CA 証明書を利用する」手順を Bash 環境でコマンドだけで実施するには、以下のコマンドを実行します。
# Azure CLI と拡張機能をインストールする
$ curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
$ az extension add --name azure-iot
# Azure CLI でログインする
$ az login
# IoT Hub の作成
# リソースグループ名と IoT Hub 名は適宜指定してください。
$ resource_group_name="resource group name"
$ iot_hub_name="IoT Hub name"
$ az group create --name ${resource_group_name} -l japaneast
# F1 - 無料 (価格) の IoT Hub の作成
$ az iot hub create --resource-group ${resource_group_name} --name ${iot_hub_name} --sku F1 --partition-count 2
# S1 - 標準 (価格) の IoT Hub を作成する場合は、以下のコマンドを実行します。
# az iot hub create --resource-group ${resource_group_name} --name ${iot_hub_name} --sku S1
# 独自の X.509 CA 証明書の作成
$ git clone https://github.com/Azure/azure-iot-sdk-c.git
$ mkdir working
$ cd working
$ cp ../azure-iot-sdk-c/tools/CACertificates/*.cnf .
$ cp ../azure-iot-sdk-c/tools/CACertificates/*.sh .
$ ./certGen.sh create_root_and_intermediate
# X.509 CA 証明書のアップロード
$ cert_name="Azure-IoT-Hub-CA-Cert-Test-Only"
$ az iot hub certificate create --resource-group ${resource_group_name} --hub-name ${iot_hub_name} \
--name ${cert_name} --path ./certs/azure-iot-test-only.root.ca.cert.pem
# verification code の取得
$ etag=`az iot hub certificate show --hub-name ${iot_hub_name} -n ${cert_name} -o tsv --query etag`
$ verification_code=`az iot hub certificate generate-verification-code --etag ${etag} \
--hub-name ${iot_hub_name} --name ${cert_name} -o tsv --query properties.verificationCode`
# 検証証明書の作成
$ ./certGen.sh create_verification_certificate ${verification_code}
# etag の再発行、および検証証明書のアップロード
$ etag=`az iot hub certificate show --hub-name ${iot_hub_name} -n ${cert_name} -o tsv --query etag`
$ az iot hub certificate verify --etag ${etag} \
--hub-name ${iot_hub_name} --name ${cert_name} --path ./certs/verification-code.cert.pem
# 以下のコマンドで true が表示されることを確認します。
$ az iot hub certificate show --hub-name ${iot_hub_name} -n ${cert_name} --query properties.isVerified
ステップ 2: SORACOM Beam を有効化して MQTT エントリポイントを設定する
SORACOM Beam を有効化して、MQTT エントリポイントを設定します。
このステップはデバイスの個数に関わらず 1 回だけ行います。
Beam の設定はグループに対して行います
ここでは、グループの設定を変更する操作のみを説明します。グループの仕組みやグループを作成する操作について詳しくは、グループ設定 を参照してください。
SIM グループ画面で
をクリックします。SIM グループ画面を表示する操作について詳しくは、グループの設定を変更する を参照してください。
→ の順にクリックします。
以下の項目を設定します。
項目 説明 MQTT エントリポイントを識別するために任意の文字列を入力します。 「Standard MQTT broker」を選択します。(*1) 「MQTTS」を選択します。 IoT Hub のホスト名を入力します。ホスト名は、IoT Hub の設定画面にアクセスし、 をクリックすると確認できます。例:{IoT Hub 名}.azure-devices.net
「8883」を入力します。 に入力したホスト名に、デバイス ID の prefix (例:myDevice-
) とプレースホルダー (#{imsi}
) を追加した文字列を入力します。例:{IoT Hub 名}.azure-devices.net/myDevice-#{imsi}
。(*2)「ON」にします。 デバイス ID の prefix (例: myDevice-
) にプレースホルダー (#{imsi}
) を追加した文字列を入力します。例:myDevice-#{imsi}
。(*2)- (*1) 「Azure IoT Hub」を選択すると、手順 4 で「Azure IoT Hub 認証情報」が選択されます。この設定では、X.509 CA 証明書を利用できません。
- (*2)
{IoT Hub 名}
は、IoT Hub を準備する で作成した IoT Hub の名前を入力します。一方、プレースホルダー (#{imsi}
) はそのまま入力します。IMSI を入力しないでください。
をクリックします。
SIM グループの設定は IoT SIM が所属するグループを切り替えると有効化されます
このページの説明では、IoT SIM が所属するグループを切り替える手順は、ステップ 3: IoT Hub に接続するデバイスとデバイス証明書を作成する で説明しています。これは、グループの切り替えは、IoT SIM を利用するデバイスの数だけ行う必要があるためです。
SORACOM CLI / SORACOM API の場合
ステップ 2 を SORACOM CLI または SORACOM API で実施するには、以下のコマンドを実行します。
SORACOM CLI を利用するには、あらかじめ SORACOM CLI をインストールし、認証情報を保存してください。詳しくは、SORACOM CLI をインストールする を参照してください。
# グループの作成 {#soracom-cli-グループの作成}
$ group_id=`soracom groups create \
--body '{
"tags": {
"name": "Group name"
}
}' | jq -r .groupId`
# MQTT エントリポイントの設定 {#soracom-cli-mqtt-エントリポイントの設定}
# ${iot_hub_name} は、IoT Hub の名前に置き換えてください。 {#soracom-cli-iot_hub_name-はiot-hub-の名前に置き換えてください}
$ soracom groups put-config --group-id ${group_id} --namespace SoracomBeam \
--body '[
{
"key": "mqtt://beam.soracom.io:1883",
"value": {
"enabled": true,
"name": "MQTT",
"addEquipmentHeader": false,
"addSignature": false,
"addSubscriberHeader": false,
"addSimIdHeader": false,
"addMsisdnHeader": false,
"customHeaders": {},
"skipStatusCode": false,
"username": "${iot_hub_name}.azure-devices.net/myDevice-#{imsi}",
"version": "201912",
"useClientCert": true,
"clientCerts": {
"default": {
"$credentialsId": "myDevice-#{imsi}"
}
},
"useGoogleIoT": false,
"useClientCredentials": false,
"addDeviceIdHeader": false,
"destination": "mqtts://${iot_hub_name}.azure-devices.net:8883",
"replaceTopic": false
}
}
]'
SORACOM API を利用するには、API キーと API トークンが必要です。詳しくは、API キーと API トークンの取り扱いについて を参照してください。
# グループの作成 {#soracom-api-グループの作成}
$ group_id=`curl -v -X POST https://api.soracom.io/v1/groups \
-H "X-Soracom-API-Key: $X_SORACOM_API_KEY" \
-H "X-Soracom-Token: $X_SORACOM_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"tags": {
"name": "Group name"
}
}' | jq -r .groupId`
# MQTT エントリポイントの設定 {#soracom-api-mqtt-エントリポイントの設定}
# ${iot_hub_name} は、IoT Hub の名前に置き換えてください。 {#soracom-api-iot_hub_name-はiot-hub-の名前に置き換えてください}
$ curl -v -X PUT https://api.soracom.io/v1/groups/${group_id}/configuration/SoracomBeam \
-H "X-Soracom-API-Key: $X_SORACOM_API_KEY" \
-H "X-Soracom-Token: $X_SORACOM_TOKEN" \
-H "Content-Type: application/json" \
-d '[
{
"key": "mqtt://beam.soracom.io:1883",
"value": {
"enabled": true,
"name": "MQTT",
"addEquipmentHeader": false,
"addSignature": false,
"addSubscriberHeader": false,
"addSimIdHeader": false,
"addMsisdnHeader": false,
"customHeaders": {},
"skipStatusCode": false,
"username": "${iot_hub_name}.azure-devices.net/myDevice-#{imsi}",
"version": "201912",
"useClientCert": true,
"clientCerts": {
"default": {
"$credentialsId": "myDevice-#{imsi}"
}
},
"useGoogleIoT": false,
"useClientCredentials": false,
"addDeviceIdHeader": false,
"destination": "mqtts://${iot_hub_name}.azure-devices.net:8883",
"replaceTopic": false
}
}
]'
ステップ 3: IoT Hub に接続するデバイスとデバイス証明書を作成する
このステップはデバイスごとに行います。たとえば、IoT Hub に送信するデバイスが 10 台ある場合は、このステップを 10 回繰り返してください。
IoT Hub に接続するデバイスを作成する
Microsoft Azure Portal にアクセスし、IoT Hub を準備する で作成した IoT Hub の設定画面で の をクリックします。
をクリックします。
以下の項目を設定します。
項目 説明 IoT Hub でデバイスを区別するための識別子を入力します。1 つの IoT Hub に複数のデバイスを作成する場合は、prefix (例: myDevice-
) とデバイスで利用する IoT SIM の IMSI (例:295012345678901
) を連結します (例:myDevice-295012345678901
)。なお、IMSI は SIM 管理画面の 一覧表示 で確認できます。「X.509 CA 署名済み」を選択します。 「有効化」を選択します。 → の順にクリックします。
作成したデバイスの証明書を作成して認証局で認証する
デバイスの証明書を作成して、認証局で認証します。公的なルート証明機関から X.509 CA 証明書を購入した場合は、その指示に従ってデバイス証明書を認証してください。
チュートリアル: Microsoft 提供のスクリプトを使用してテスト証明書を作成する の手順に従って作成した独自の認証局でデバイスを認証する場合は、以下の手順で行います。
証明書には、固定のパスワード ("1234") が設定されています。また、30 日後に期限が切れます。
IoT Hub に作成したデバイスの ID を
device_id
に代入します。$ imsi="295012345678901" $ device_id="myDevice-${imsi}"
デバイス証明書を発行し、署名要求 (CSR: Certificate Signing Request) を生成します。
$ ./certGen.sh create_device_certificate ${device_id} $ mv ./private/new-device.key.pem ./private/${device_id}.key.pem $ mv ./certs/new-device.cert.pem ./certs/${device_id}.cert.pem $ openssl req -new -key ./private/${device_id}.key.pem -out ./certs/${device_id}.csr -subj "/CN=${device_id}"
./certs/myDevice-295012345678901.cert.pem
および./certs/myDevice-295012345678901.csr
が作成されます。認証局で署名します。
$ openssl x509 -req -in ./certs/${device_id}.csr \ -CA ./certs/azure-iot-test-only.root.ca.cert.pem \ -CAkey ./private/azure-iot-test-only.root.ca.key.pem \ -CAcreateserial \ -out ./certs/${device_id}.signed.cert.pem -days 500 -sha256
Enter pass phrase for ./private/azure-iot-test-only.root.ca.key.pem:
と表示されます。「1234」(certGen.sh で定義されているパスワード) を入力して、Enter キーを押します。
./certs/myDevice-295012345678901.signed.cert.pem
が作成されます。このファイルが、認証局が発行したデバイス証明書です。作成したデバイス証明書の秘密鍵とデバイス証明書を SORACOM ユーザーコンソールの認証情報ストアに登録します。
認証情報ストアの「認証情報を登録」画面の表示方法については、認証情報を登録する を参照してください。
認証情報は、以下のように登録します。
情報 説明 IoT Hub に接続するデバイスを作成する で指定したデバイス ID を入力します。それ以外の文字列を入力するとデータを送受信できません。例: myDevice-295012345678901
「X.509 証明書」を選択します。 デバイス証明書の秘密鍵 ( ./private/myDevice-295012345678901.key.pem
) の内容を貼り付けます。(*1)デバイス証明書 ( ./certs/myDevice-295012345678901.signed.cert.pem
) の内容を貼り付けます。(*1)空欄のままにします。 - (*1) ファイル名ではなくファイルの内容を貼り付けてください。
コマンドで実施する場合
ステップ 3 を Bash 環境でコマンドだけで実施するには、以下のコマンドを実行します。
# デバイスの作成
# デバイス ID は、prefix (例: `myDevice-`) とデバイスで利用する IoT SIM の IMSI (例: `295012345678901`) を連結します
$ imsi="295012345678901"
$ device_id="myDevice-${imsi}"
$ az iot hub device-identity create --hub-name ${iot_hub_name} \
--device-id ${device_id} --auth-method x509_ca
# デバイス証明書の作成
$ ./certGen.sh create_device_certificate ${device_id}
$ mv ./private/new-device.key.pem ./private/${device_id}.key.pem
$ mv ./certs/new-device.cert.pem ./certs/${device_id}.cert.pem
$ openssl req -new -key ./private/${device_id}.key.pem -out ./certs/${device_id}.csr -subj "/CN=${device_id}"
# デバイス証明書の署名
$ openssl x509 -req -in ./certs/${device_id}.csr \
-CA ./certs/azure-iot-test-only.root.ca.cert.pem \
-CAkey ./private/azure-iot-test-only.root.ca.key.pem \
-CAcreateserial \
-out ./certs/${device_id}.signed.cert.pem -days 500 -sha256
# Enter pass phrase for ./private/azure-iot-test-only.root.ca.key.pem: と表示されたら
# 「1234」を入力して、Enter キーを押します。
以降の手順は、SORACOM CLI または SORACOM API で実施します。
SORACOM CLI を利用するには、あらかじめ SORACOM CLI をインストールし、認証情報を保存してください。詳しくは、SORACOM CLI をインストールする を参照してください。
# 認証情報ストアへの登録 {#soracom-cli-認証情報ストアへの登録}
$ unset key
$ while read line; do key=${key}`eval "echo $line"`"\n" ;
done<./private/${device_id}.key.pem
$ unset cert
$ while read line; do cert=${cert}`eval "echo $line"`"\n" ;
done<./certs/${device_id}.signed.cert.pem
$ echo '{
"credentials": {
"key": "'${key}'",
"cert": "'${cert}'"
},
"type": "x509"
}' > credentials.txt
$ soracom credentials create \
--credentials-id "${device_id}" \
--body @credentials.txt
SORACOM API を利用するには、API キーと API トークンが必要です。詳しくは、API キーと API トークンの取り扱いについて を参照してください。
# 認証情報ストアへの登録 {#soracom-api-認証情報ストアへの登録}
$ unset key; while read line
do
key=${key}`eval "echo $line"`"\n"
done<./private/${device_id}.key.pem
$ unset cert; while read line
do
cert=${cert}`eval "echo $line"`"\n" ;
done<./certs/${device_id}.signed.cert.pem
$ echo '{
"credentials": {
"key": "'${key}'",
"cert": "'${cert}'"
},
"type": "x509"
}' > credentials.txt
$ curl -v -X POST https://api.soracom.io/v1/credentials/${device_id} \
-H "X-Soracom-API-Key: $X_SORACOM_API_KEY" \
-H "X-Soracom-Token: $X_SORACOM_TOKEN" \
-H "Content-Type: application/json" \
-d @credentials.txt
ステップ 4: Beam を使用して IoT Hub にデータを送信する
MQTT クライアントを準備する (デバイスの操作)
デバイスで Mosquitto のクライアントを利用して、IoT Hub にデータを送信します。デバイスが Raspberry Pi の場合は、以下のコマンドでインストールできます。
$ sudo apt-get install mosquitto-clients
送信データを確認するツールを準備する (PC の操作)
送信されたデータを確認する
デバイスから送信されたデータは、以下のようなツールで確認できます。
ここでは、PC に Azure CLI と Azure CLI 向けの IoT 拡張機能 (Microsoft Azure IoT extension for Azure CLI) をインストールして、デバイスから送信したメッセージをモニターできます。
デバイスから送信したメッセージをモニターするコマンドは以下のとおりです。
$ az login
$ az iot hub monitor-events -g ${resource_group_name} -n ${iot_hub_name}
Starting event monitor, use ctrl-c to stop...
${resource_group_name}
にはリソースグループ名を、${iot_hub_name}
には IoT Hub 名を設定してください。- 初めて実行するときは、Azure CLI 向けの IoT 拡張機能 (Microsoft Azure IoT extension for Azure CLI) のインストールが始まることがあります。画面の指示に従って操作してください。
デバイスからデータを送信する (デバイスの操作)
デバイスから IoT Hub にデータを送信します。
デバイスからのデータは、devices/${device_id}/messages/events/
というトピックに Publish します。また、MQTT のクライアント ID (-i オプション) として、IoT Hub に作成したデバイスのデバイス ID を指定します。
なお、以下のコマンドの例では、device_id
に、IoT Hub に接続するデバイスを作成する で IoT Hub に作成したデバイスの ID (例: myDevice-295012345678901
) を代入すると、上記のとおりにデバイス ID が指定されます。
$ device_id="myDevice-295012345678901"
$ mosquitto_pub -d -h beam.soracom.io -V mqttv311 \
-i ${device_id} -t "devices/${device_id}/messages/events/" \
-m "Hello from Device via Beam!"
Client myDevice-295012345678901 sending CONNECT
Client myDevice-295012345678901 received CONNACK (0)
Client myDevice-295012345678901 sending PUBLISH (d0, q0, r0, m1, 'devices/myDevice-295012345678901/messages/events/', ... (27 bytes))
Client myDevice-295012345678901 sending DISCONNECT
Azure IoT extension for Azure CLI 側で以下のように表示されることが確認できます。
{
"event": {
"origin": "myDevice-295050912391841",
"module": "",
"interface": "",
"component": "",
"payload": "Hello from Device via Beam!"
}
}
ステップ 5: IoT Hub からのデータを受信する
次に、IoT Hub からデータを送信し、デバイスで受信します。
受信したデータを確認するツールを準備する
IoT Hub からのデータを受信するには、devices/デバイス ID/messages/devicebound/#
というトピックを Subscribe します。また、MQTT のクライアント ID (-i オプション) として、IoT Hub に作成したデバイスのデバイス ID を指定します。
なお、以下のコマンドの例では、device_id
に、IoT Hub に接続するデバイスを作成する で IoT Hub に作成したデバイスの ID (例: myDevice-295012345678901
) を代入すると、上記のとおりにデバイス ID が指定されます。
$ device_id="myDevice-295012345678901"
$ mosquitto_sub -d -h beam.soracom.io -V mqttv311 \
-i ${device_id} -t "devices/${device_id}/messages/devicebound/#"
Client myDevice-295012345678901 sending CONNECT
Client myDevice-295012345678901 received CONNACK (0)
Client myDevice-295012345678901 sending SUBSCRIBE (Mid: 1, Topic: devices/myDevice-295012345678901/messages/devicebound/#, QoS: 0)
Client myDevice-295012345678901 received SUBACK
Subscribed (mid: 1): 0
IoT Hub からデータを送信する
Microsoft Azure Portal にアクセスし、IoT Hub を準備する で作成した IoT Hub の設定画面で の をクリックします。
デバイス ID をクリックして、
をクリックします。に「Hello from Azure Portal!」と入力して、 をクリックします。
デバイスにメッセージが届き、以下のように表示されます。
Client myDevice-295012345678901 received PUBLISH (d0, q0, r0, m0, 'devices/myDevice-295012345678901/messages/devicebound/%24.to=%2Fdevices%2FmyDevice-295012345678901%2Fmessages%2FdeviceBound&%24.ct=text%2Fplain%3B%20charset%3DUTF-8&%24.ce=utf-8', ... (24 bytes)) Hello from Azure Portal!
(参考) Beam を使用せずに直接 IoT Hub と接続する
Beam を使用してデータの送受信ができない場合は、IoT Hub に直接データを送信できることを確認します。
以下のファイルをデバイスにコピーします。
- IoT Hub のルート証明書 (DigiCert Global Root G2)。
/etc/ssl/certs/DigiCert_Global_Root_G2.pem
に保存されていることを確認してください。デバイスに保存されていない場合は DigiCert Global Root G2 からダウンロードできます。 - デバイス証明書の秘密鍵 (
./private/myDevice-295012345678901.key.pem
) - デバイス証明書 (
./certs/myDevice-295012345678901.signed.cert.pem
)
- IoT Hub のルート証明書 (DigiCert Global Root G2)。
IoT Hub に直接データを送信します。
なお、
device_id
には、IoT Hub に接続するデバイスを作成する で IoT Hub に作成したデバイスの ID (例:myDevice-295012345678901
) を代入します。$ iot_hub_name="IoT Hub name" $ device_id="myDevice-295012345678901" $ mosquitto_pub -d -h ${iot_hub_name}.azure-devices.net -p 8883 \ --cafile /etc/ssl/certs/DigiCert_Global_Root_G2.pem \ --key ./private/${device_id}.key.pem --cert ./certs/${device_id}.signed.cert.pem \ -i ${device_id} -u "${iot_hub_name}.azure-devices.net/${device_id}" \ -t "devices/${device_id}/messages/events/" \ -m '{"message": "Hello IoT Hub from Device!"}' -V mqttv311
Beam を使用するとデバイスから送信するデータ量も削減できます
Beam を使用する場合は、デバイスからルート証明書およびデバイス証明書を送信しないため、送信データ量が削減できます。