Soracom

Users

ドキュメント

Azure IoT Hub と X.509 証明書で認証した接続をする

はじめに 

このドキュメントでは、SORACOM Beam (以下、Beam) を使用して、Azure IoT Hub にデータを送信します。当ガイドの前提は以下のとおりです。

  • SORACOM のアカウントを作成済みで、SORACOM IoT SIM をお持ちであること
  • MQTT を使用できるデバイス (Raspberry Pi + AK-020 / Wio LTE など) をお持ちであること
  • Microsoft Azure アカウントをお持ちであること

ステップ 1: Azure IoT Hub を準備する 

IoT Hub を作成する 

Microsoft Azure Portal から、IoT Hub を開き、“IoT Hub の作成” から IoT Hub を作成します。(既に作成済みのものがある場合には、そちらを利用ください。)

CA 証明書をアップロード・認証する 

  • IoT Hub の Settings メニューから “Certificates” をクリックします。
  • “+ Add” ボタンから、証明書をアップロードします。
  • 証明書をアップロードしたら認証します。証明書名をクリックして “Generate Verification Code” をクリックします。
  • verification code をもとに Verification Certificate (検証証明書) を作成し、Azure へアップロードします。

上記の詳細な手順については Azure のドキュメント をご参照ください。

IoT Device を作成する 

  • IoT Hub の Explores メニューから “IoT Devices” をクリックします。
  • “+ New” ボタンから、デバイスを新規作成します。
    • Authentication Type は、X.509 CA Signed を選択します。

デバイス証明書を作成する 

  • Common Name (CN) を 先ほど作成した IoT Device の Device ID にしてデバイスの証明書、秘密鍵を作成します。ここで作成した証明書および秘密鍵は後ほど SORACOM に登録します。

(参考) IoT Hub の作成からデバイス証明書の作成までを Azure CLI と openssl コマンドで実施する手順 

  • 以下は自身が CA となり証明書の作成などを行う手順です。また Bash 環境での実施を想定しています。参考としてください。
# Azure CLI と拡張機能のインストール
curl -L https://aka.ms/InstallAzureCli | bash
az extension add --name azure-cli-iot-ext

# Azure CLI でログイン
az login

# IoT Hub の作成
# リソースグループ名・IoT Hub 名は適宜指定してください
RgName=[リソースグループ名]
HubName=[IoT Hub 名]
az group create --name ${RgName} -l japaneast
az iot hub create -n ${HubName} -g ${RgName} --sku F1

# ルート証明書の作成
# subject は適宜修正してください
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem  -subj "/C=JP/ST=Tokyo/O=TestOrg/OU=TestOu"

# ルート証明書のアップロード
# 証明書名は適宜指定してください
CertName=[証明書名]
az iot hub certificate create --hub-name ${HubName} --name ${CertName} --path ./rootCA.pem -g ${RgName}

# verification code の取得
etag=`az iot hub certificate show -n ${CertName} --hub-name ${HubName} -o tsv --query etag`
VeriCode=`az iot hub certificate generate-verification-code --etag ${etag} --name ${CertName} --hub-name ${HubName} -o tsv --query properties.verificationCode`

# verification code をもとに Verification Certificate (検証証明書) を作成する。
# Common Name を verification code にする。その他の subject は適宜修正してください
openssl genrsa -out verificationCert.key 2048
openssl req -new -key verificationCert.key -out verificationCert.csr -subj "/C=JP/ST=Tokyo/O=TestOrg/OU=TestOu/CN=${VeriCode}"
openssl x509 -req -in verificationCert.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out verificationCert.pem -days 500 -sha256

# Verification Certificate (検証証明書) をアップロードする
etag=`az iot hub certificate show -n ${CertName} --hub-name ${HubName} -o tsv --query etag`
az iot hub certificate verify --etag ${etag} --name ${CertName} --path ./verificationCert.pem --hub-name ${HubName}

# 以下のコマンドで True となっていれば Verificate できています。
az iot hub certificate show -n ${CertName} --hub-name ${HubName} --query properties.isVerified

# デバイスの作成
# デバイス名は適宜指定してください
deviceId=[デバイス名]
az iot hub device-identity create --device-id ${deviceId} --hub-name ${HubName} --auth-method x509_ca

# デバイス証明書の作成
openssl genrsa -out deviceCert.key 2048
openssl req -new -key deviceCert.key -out deviceCert.csr -subj "/C=JP/ST=Tokyo/O=TestOrg/OU=TestOu/CN=${deviceId}"
openssl x509 -req -in deviceCert.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out deviceCert.pem -days 500 -sha256

ステップ 2: SORACOM Beam を設定する 

グループを作成する 

IoT SIM を登録した際にグループを作成していない場合には、左上の[MENU]→[SIM グループ]を開き、+追加 から新規のグループを追加します。 ユーザーコンソールの SIM 管理画面より対象の IoT SIM を選択し [操作][所属グループ変更] より、作成したグループを紐付けます。

グループで Beam を設定する 

作成したグループを選択し、グループ詳細画面から[SORACOM Beam 設定]タブを開き、[+]ボタンから「MQTT エントリポイント」を選択します。

以下を入力します。

  • 設定名 (任意の文字列)
  • 種別から Standard MQTT broker を選択
  • プロトコルから MQTTS を選択
  • ホスト名に、<IoT Hub 名>.azure-devices.net を入力
  • ポート番号に、8883 を入力
  • ユーザー名に、<IoT Hub 名>.azure-devices.net/<デバイス ID> を入力
  • 認証情報を右の+を押す
  • パスワードは空白に、IMSI ヘッダー付与は OFF にする

認証情報では、以下を入力します。

  • 認証情報 ID (任意文字列) を入力
  • 秘密鍵に、作成したデバイス証明書の秘密鍵を入力 (参考例の場合 deviceCert.key の内容)
  • 証明書に、作成したデバイス証明書の内容を入力 (参考例の場合 deviceCert.pem の内容)

登録を押して、認証情報が選択されていることを確認して、保存を押します。

ステップ 3: Beam を使用して Azure IoT Hub にデータを送信する 

デバイスの準備 

当ガイドでは、Mosquitto のクライアントを利用します。Raspbian であれば、下記コマンドでインストール可能です

sudo apt-get install mosquitto-clients

送信されたデータ確認の準備 

送信されたデータは、以下のようなツールを使用して確認します。

当ガイドでは、Azure IoT extension for Azure CLI を利用します。Azure Cloud Shell での利用も可能です。

下記のコマンドより、デバイスから送信されたメッセージをモニターできます。

$ az iot hub monitor-events -n ${iothub-name} -g ${resource-group}
Starting event monitor, use ctrl-c to stop...
${iothub-name} には IoT Hub 名を、${resource-group} にはリソースグループ名を設定してください。

デバイスからデータを送信 

デバイスからクラウドへデータを送信します。

デバイスからのデータは、 devices/<デバイス ID>/messages/events/ というトピックに Publish する必要があります。また、MQTT のクライアント ID として、作成した device の、deviceId を指定する必要があります (-i オプション)。

pi@raspberrypi: ~$ deviceId=myDevice
pi@raspberrypi: ~$ mosquitto_pub -d -h beam.soracom.io -i $deviceId -t "devices/$deviceId/messages/events/" -m "Hello from SORACOM Beam!" -V mqttv311
Client myDevice sending CONNECT
Client myDevice received CONNACK
Client myDevice sending PUBLISH (d0, q0, r0, m1, 'devices/myDevice/messages/events/', ... (24 bytes))
Client myDevice sending DISCONNECT

Azure IoT extension for Azure CLI 側で以下のように表示されることが確認できます。

{
    "event": {
        "origin": "myDevice",
        "module": "",
        "interface": "",
        "component": "",
        "properties": {
            "application": {}
        },
        "payload": "Hello from SORACOM Beam!"
    }
}

ステップ 4: Azure IoT Hub からのデータを受信する 

次に、クラウドからデバイスへデータを送信します。

クラウドからのデータは、 devices/デバイスID/messages/devicebound/# というトピックに Subscribe する必要があります。また、MQTT のクライアント ID として、作成した device の、deviceId を指定する必要があります (-i オプション)。

pi@raspberrypi: ~$ mosquitto_sub -d -h beam.soracom.io -i $deviceId -t "devices/$deviceId/messages/devicebound/#" -V mqttv311
Client myDevice sending CONNECT
Client myDevice received CONNACK
Client myDevice sending SUBSCRIBE (Mid: 1, Topic: devices/myDevice/messages/devicebound/#, QoS: 0)
Client myDevice received SUBACK
Subscribed (mid: 1): 0

この状態で、Azure Portal のデバイス画面から、“Message To Device"をクリックし、メッセージ送信画面からデータを送信してみましょう。

デバイスの方にメッセージが届き、下記のように表示されます。

Client myDevice received PUBLISH (d0, q0, r0, m0, 'devices/myDevice/messages/devicebound/%24.to=%2Fdevices%2FmyDevice%2Fmessages%2FdeviceBound', ... (24 bytes))
Hello from Azure Portal!

(参考) Beam を使用せずに直接 Azure IoT Hub と接続する 

データの送信が上手くいかない場合、Azure IoT Hub に直接接続できるかが切り分けとなります。参考までに手順を紹介します。

Beam を使用しない場合は以下のように証明書ファイル等を指定して送信する必要があります。 cafile は Azure IoT Hub のルート証明書です。Azure 側の CA 証明書は Baltimore CyberTrust Root です。デフォルトで入っているクライアントも多いですが、ない場合は こちら からダウンロードします。

HubName=[IoT Hub 名]
deviceId=[デバイス名]
mosquitto_pub -d -h ${HubName}.azure-devices.net -p 8883 \
--cafile /etc/ssl/certs/Baltimore_CyberTrust_Root.pem \
--cert ./deviceCert.pem --key ./deviceCert.key \
-i ${deviceId} -u "${HubName}.azure-devices.net/${deviceId}" \
-t "devices/${deviceId}/messages/events/" \
-m '{"message": "Hello IoT Hub!"}' -V mqttv311

ここまでの解説により、直接 Azure IoT Hub に接続する時と異なり Beam で接続する時はデバイスに証明書の付与が不要なことがわかります。証明書の変更があった際も、Beam の設定を変更するのみで対応することが可能となります。