次の方法で共有


ダウンストリーム デバイスを Azure IoT Edge ゲートウェイに接続する

適用対象:はいアイコン IoT Edge 1.1

重要

IoT Edge 1.1 のサポート終了日は、2022 年 12 月 13 日でした。 この製品、サービス、テクノロジ、または API がどのようにサポートされているかについては、 Microsoft 製品ライフサイクル を確認してください。 最新バージョンの IoT Edge への更新の詳細については、「 IoT Edge の更新」を参照してください。

この記事では、ダウンストリーム デバイスと IoT Edge 透過的ゲートウェイの間に信頼できる接続を確立する手順について説明します。 透過的ゲートウェイのシナリオでは、1 台以上のデバイスが、IoT Hub への接続を維持する単一のゲートウェイ デバイスを経由してメッセージを渡すことができます。

透過的なゲートウェイ接続を正常にセットアップするための 3 つの一般的な手順があります。 この記事では、3 番目の手順について説明します。

  1. ゲートウェイ デバイスをサーバーとして構成し、ダウンストリーム デバイスが安全に接続できるようにします。 ダウンストリーム デバイスからメッセージを受信するようにゲートウェイを設定し、適切な宛先にルーティングします。 これらの手順については、「 透過的なゲートウェイとして機能するように IoT Edge デバイスを構成する」を参照してください。

  2. ダウンストリーム デバイスのデバイス ID を作成して、IoT Hub で認証できるようにします。 ゲートウェイ デバイスを介してメッセージを送信するようにダウンストリーム デバイスを構成します。 これらの手順については、「 Azure IoT Hub に対するダウンストリーム デバイスの認証」を参照してください。

  3. ダウンストリーム デバイスをゲートウェイ デバイスに接続し、メッセージの送信を開始します。

この記事では、ダウンストリーム デバイス接続の基本的な概念について説明し、ダウンストリーム デバイスを設定する方法について説明します。

  • トランスポート層セキュリティ (TLS) と証明書の基礎について説明します。
  • TLS ライブラリが異なる複数のオペレーティング システム上でどのように機能するか、また、各オペレーティング システムによって証明書がどのように処理されるかについて説明します。
  • 作業を開始するのに役立ついくつかの言語で Azure IoT サンプルを確認します。

この記事では、 ゲートウェイIoT Edge ゲートウェイ という用語は、透過的なゲートウェイとして構成された IoT Edge デバイスを指します。

ダウンストリーム デバイスは、インターネットまたはゲートウェイ デバイスに (IoT Edge 対応かどうかに関係なく) 直接データを出力します。 子デバイスには、入れ子になったトポロジ内のダウンストリーム デバイスまたはゲートウェイ デバイスを使用できます。

[前提条件]

  • 「ダウンストリーム デバイスで使用可能な 透過的なゲートウェイとして機能するように IoT Edge デバイスを構成 する」のデバイス CA 証明書の生成に使用されたルート CA 証明書ファイルを用意します。 ダウンストリーム デバイスは、この証明書を使用してゲートウェイ デバイスの ID を検証します。 デモ証明書を使用した場合、ルート CA 証明書は azure-iot-test-only.root.ca.cert.pem と呼ばれます。
  • 「Azure IoT Hub へのダウンストリーム デバイスの認証」で説明されているように、ゲートウェイ デバイスを指す変更された接続文字列を使用します。

ダウンストリーム デバイスを準備する

Azure IoT Hub クラウド サービスを使って作成された ID を持つ任意のアプリケーションまたはプラットフォームを、ダウンストリーム デバイスにすることもできます。 多くの場合、これらのアプリケーションでは Azure IoT デバイス SDK が使用されます。 ダウンストリーム デバイスは、IoT Edge ゲートウェイ デバイスそのもので実行されているアプリケーションの場合もあります。 ただし、別の IoT Edge デバイスを IoT Edge ゲートウェイのダウンストリームにすることはできません。

IoT Hub に登録されている IoT デバイスでは、 モジュール ツインを 使用して、1 つのデバイス上のさまざまなプロセス、ハードウェア、または機能を分離できます。 IoT Edge ゲートウェイでは、x.509 証明書認証ではなく、対称キー認証を使用したダウンストリーム モジュール接続がサポートされます。

ダウンストリーム デバイスを IoT Edge ゲートウェイに接続するには、次の 2 つのものが必要です。

  • ゲートウェイへの接続用に情報を追加した IoT Hub デバイス接続文字列を使って、構成されたデバイスまたはアプリケーション。

    この手順は、前の記事「 Azure IoT Hub に対してダウンストリーム デバイスを認証する」で完了しました。

  • デバイスまたはアプリケーションは、ゲートウェイ デバイスへのトランスポート層セキュリティ (TLS) 接続を検証するために、ゲートウェイの ルート CA 証明書 を信頼する必要があります。

    この手順については、この記事の残りの部分で詳しく説明します。 この手順は、次の 2 つのうちいずれかの方法で実行できます。つまり、CA 証明書をオペレーティング システムの証明書ストアにインストールする方法と、(特定の言語について) Azure IoT SDK を使用してアプリケーション内で証明書を参照する方法です。

TLS と証明書の基礎

ダウンストリーム デバイスを IoT Edge に安全に接続することに関する課題は、インターネット上で発生する他の安全なクライアント/サーバー通信の課題と同様です。 クライアントとサーバーは、 トランスポート層セキュリティ (TLS) を使用してインターネット経由で安全に通信します。 TLS は、証明書と呼ばれる標準的な 公開キー 基盤 (PKI) コンストラクトを使用して構築されます。 TLS はかなり複雑な仕様であり、2 つのエンドポイントのセキュリティ保護に関連した幅広いトピックに対応します。 このセクションでは、デバイスを IoT Edge ゲートウェイに安全に接続することに関連した概念をまとめています。

クライアントがサーバーに接続すると、サーバーはサーバー証明書チェーンと呼ばれる証明書の チェーンを提示します。 証明書チェーンは一般的に、ルート証明機関 (CA) 証明書、1 つ以上の中間 CA 証明書、最後にサーバーの証明書そのものから構成されます。 クライアントは、サーバー証明書チェーン全体を暗号学的に検証し、サーバーとの信頼関係を確立します。 サーバー証明書チェーンのこのクライアント検証は、 サーバー チェーン検証と呼ばれます。 クライアントは、所有証明と呼ばれるプロセスで、サーバー証明書に関連付けられている秘密キーの 所有を証明するようにサーバーにチャレンジします。 サーバー チェーン検証と所有証明の組み合わせは、 サーバー認証と呼ばれます。 サーバー証明書チェーンを検証するには、サーバーの証明書を作成 (または発行) するために使われたルート CA 証明書のコピーがクライアントに必要です。 通常、Web サイトに接続する時点で、ブラウザーにはよく使われる CA 証明書が事前に構成されているので、クライアントのプロセスはシームレスです。

デバイスが Azure IoT Hub に接続するとき、デバイスがクライアントであり、IoT Hub クラウド サービスがサーバーです。 IoT Hub クラウド サービスは、 Baltimore CyberTrust Root と呼ばれるルート CA 証明書によって支えられています。これは一般に公開されており、広く使用されています。 IoT Hub CA 証明書は、ほとんどのデバイスに既にインストールされているため、多くの TLS 実装 (OpenSSL、Schannel、LibreSSL など) において、サーバー証明書の検証時にその証明書が自動的に使用されます。 ただし、IoT Hub に正常に接続したデバイスから IoT Edge ゲートウェイに接続しようとして、問題が発生する場合があります。

デバイスが IoT Edge ゲートウェイに接続するときは、ダウンストリーム デバイスがクライアントで、ゲートウェイ デバイスがサーバーです。 Azure IoT Edge を使用すると、適合するゲートウェイ証明書チェーンを構築できます。 Baltimore のような公開 CA 証明書を使用することも、自己署名 (または社内) ルート CA 証明書を使用することもできます。 多くの場合、公開 CA 証明書には、関連するコストが生じるため、一般的には運用環境シナリオで使用されます。 開発とテストに適しているのは自己署名 CA 証明書です。 デモ証明書を使用している場合は、自己署名ルート CA 証明書です。

IoT Edge ゲートウェイ用に自己署名のルート CA 証明書を使用するときは、ゲートウェイに接続しようとするダウンストリーム デバイスすべてにその証明書をインストールまたは提供する必要があります。

ゲートウェイ証明書のセットアップ

IoT Edge 証明書と運用環境への影響の詳細については、 IoT Edge 証明書の使用に関する詳細を参照してください。

ルート CA 証明書を指定する

ゲートウェイ デバイスの証明書を検証するために、ダウンストリーム デバイスには、ルート CA 証明書の独自のコピーが必要です。 IoT Edge Git リポジトリに用意されているスクリプトを使用してテスト証明書を作成した場合、ルート CA 証明書は azure-iot-test-only.root.ca.cert.pem と呼ばれます。 他のダウンストリーム デバイス準備手順の一部としてまだ行っていない場合は、この証明書ファイルをダウンロード デバイス上の任意のディレクトリに移動します。 Azure Key Vault などのサービスまたはセキュリティで保護されたコピー プロトコルなどの関数を使用して、証明書ファイルを移動できます。

OS に証明書をインストールする

ルート CA 証明書がダウンストリーム デバイス上にある場合は、ゲートウェイに接続しているアプリケーションが証明書にアクセスできることを確認する必要があります。

オペレーティング システムの証明書ストアにルート CA 証明書をインストールすると、一般的に、ほとんどのアプリケーションでルート CA 証明書を使用できるようになります。 いくつか例外はあり、NodeJS アプリケーションのように、OS 証明書ストアを使用せずにノード ランタイムの内部証明書ストアを使用するものがあります。 オペレーティング システム レベルで証明書をインストールできない場合は、「 Azure IoT SDK で証明書を使用する」に進んでください。

Ubuntu

次のコマンドは、Ubuntu ホストに CA 証明書をインストールする方法を示す例です。 この例では、前提条件の記事の azure-iot-test-only.root.ca.cert.pem 証明書を使用していること、およびダウンストリーム デバイス上の場所に証明書をコピーしていることを前提としています。

sudo cp <path>/azure-iot-test-only.root.ca.cert.pem /usr/local/share/ca-certificates/azure-iot-test-only.root.ca.cert.pem.crt
sudo update-ca-certificates

"/etc/ssl/certs の証明書を更新中..." という内容のメッセージが表示されます。1 added, 0 removed; done." (/etc/ssl/certs の証明書を更新しています... 1 個追加、0 個削除されました。完了しました) というメッセージが表示されます。

ウィンドウズ

次の手順は、Windows ホストに CA 証明書をインストールする方法の例です。 この例では、前提条件の記事の azure-iot-test-only.root.ca.cert.pem 証明書を使用していること、およびダウンストリーム デバイス上の場所に証明書をコピーしていることを前提としています。

PowerShell の Import-Certificate を管理者として使用して証明書をインストールできます。

import-certificate  <file path>\azure-iot-test-only.root.ca.cert.pem -certstorelocation cert:\LocalMachine\root

certlm ユーティリティを使用して証明書をインストールすることもできます。

  1. [スタート] メニューで、[ コンピューター証明書の管理] を検索して選択します。 certlm というユーティリティが開きます。
  2. 証明書 - ローカル コンピューター>信頼されたルート証明機関に移動します
  3. [証明書] を右クリックし、[すべてのタスク]>[インポート] を選択します。 証明書のインポート ウィザードが起動します。
  4. 表示される手順に従って証明書ファイル <path>/azure-iot-test-only.root.ca.cert.pem をインポートします。 完了すると、「正常にインポートされました」メッセージが表示されます。

この記事の後半にある .NET のサンプルで示すように、.NET API を使用してプログラムによって証明書をインストールすることもできます。

通常、アプリケーションでは 、Schannel と呼ばれる Windows で提供される TLS スタックを使用して、TLS 経由で安全に接続します。 Schannel では 、TLS 接続を確立する前に、Windows 証明書ストアに証明書をインストールする必要があります。

証明書で Azure IoT SDK を使用する

このセクションでは、Azure IoT SDK が単純なサンプル アプリケーションを使用して IoT Edge デバイスに接続する方法について説明します。 すべてのサンプルの目的は、デバイス クライアントを接続し、テレメトリ メッセージをゲートウェイに送信し、接続を閉じて終了することです。

アプリケーション レベルのサンプルを使用する前に、次の 2 つの準備をします。

  • ゲートウェイ デバイスを指すようダウンストリーム デバイスの IoT Hub 接続文字列が変更され、ダウンストリーム デバイスを IoT Hub に対して認証するために必要なすべての証明書が変更されます。 詳細については、「 Azure IoT Hub に対するダウンストリーム デバイスの認証」を参照してください。

  • コピーしてダウンストリーム デバイス上の任意の場所に保存したルート CA 証明書への完全なパス。

    たとえば、<path>/azure-iot-test-only.root.ca.cert.pem のようにします。

NodeJS

このセクションでは、Azure IoT NodeJS デバイス クライアントを IoT Edge ゲートウェイに接続するサンプル アプリケーションを示します。 NodeJS アプリケーションの場合は、こちらに示すように、アプリケーション レベルでルート CA 証明書をインストールする必要があります。 NodeJS アプリケーションでは、システムの証明書ストアは使用されません。

  1. edge_downstream_device.js のサンプルを Azure IoT デバイス SDK for Node.js サンプル リポジトリから取得します。
  2. readme.md ファイルを確認して、サンプルを実行するための前提条件がすべて満たされていることを確認します。
  3. edge_downstream_device.js ファイルで、 connectionString 変数と edge_ca_cert_path 変数を更新します。
  4. お使いのデバイス上でサンプルを実行する方法を示す手順については、SDK ドキュメントを参照してください。

実行するサンプルについて理解するために、次のコード スニペットを参照してください。このコードは、クライアント SDK によって証明書ファイルを読み取り、読み取った証明書ファイルを使用してセキュリティで保護された TLS 接続を確立する方法を示しています。

// Provide the Azure IoT device client via setOptions with the X509
// Edge root CA certificate that was used to setup the Edge runtime
var options = {
    ca : fs.readFileSync(edge_ca_cert_path, 'utf-8'),
};

.NET

このセクションでは、Azure IoT .NET デバイス クライアントを IoT Edge ゲートウェイに接続するサンプル アプリケーションを示します。 ただし、Linux ホストと Windows ホストの両方で、.NET アプリケーションは、システムの証明書ストアにインストールされている任意の証明書を自動的に使用できます。

  1. IoT Edge .NET サンプル フォルダーから EdgeDownstreamDevice のサンプルを取得します。
  2. readme.md ファイルを確認して、サンプルを実行するための前提条件がすべて満たされていることを確認します。
  3. プロパティ/launchSettings.jsonファイルでDEVICE_CONNECTION_STRING変数とCA_CERTIFICATE_PATH変数を更新します。 ホスト システム上の信頼された証明書ストアにインストールされている証明書を使用する場合は、この変数を空白のままにします。
  4. お使いのデバイス上でサンプルを実行する方法を示す手順については、SDK ドキュメントを参照してください。

.NET アプリケーションを介して証明書ストアに信頼された証明書をプログラムでインストールするには、EdgeDownstreamDevice/ Program.cs ファイルの InstallCACert() 関数を参照してください。 この操作はべき等であるため、同じ値で複数回実行でき、追加の効果はありません。

C

このセクションでは、Azure IoT C デバイス クライアントを IoT Edge ゲートウェイに接続するサンプル アプリケーションを示します。 C SDK は、OpenSSL、WolfSSL、Schannel など、多くの TLS ライブラリと共に動作します。 詳細については、 Azure IoT C SDK を参照してください。

  1. Azure IoT device SDK for C サンプルから iotedge_downstream_device_sample アプリケーションを入手してください。
  2. readme.md ファイルを確認して、サンプルを実行するための前提条件がすべて満たされていることを確認します。
  3. iotedge_downstream_device_sample.c ファイルで、 connectionString 変数と edge_ca_cert_path 変数を更新します。
  4. お使いのデバイス上でサンプルを実行する方法を示す手順については、SDK ドキュメントを参照してください。

C 用 Azure IoT device SDK には、クライアントを設定するときに CA 証明書を登録するためのオプションが用意されています。 この操作では、証明書をどこにもインストールせず、代わりに、メモリ内にある証明書の文字列形式を使用します。 接続を確立するときに、保存されている証明書が、基になる TLS スタックに提供されます。

(void)IoTHubDeviceClient_SetOption(device_handle, OPTION_TRUSTED_CERT, cert_string);

クライアントのセットアップ時に CA 証明書を登録する方法は、 マネージド パッケージまたはライブラリを使用している場合に変更される可能性があります。 たとえば、Arduino IDE ベースのライブラリでは、IoTHubDeviceClient_LL_SetOption操作を使用するのではなく、グローバル certs.c ファイルで定義されている証明書配列に CA 証明書を追加する必要があります。

Windows ホストで OpenSSL または別の TLS ライブラリを使用していない場合、SDK の既定では Schannel が使用されます。 Schannel が機能するためには、IoT Edge ルート CA 証明書が、(IoTHubDeviceClient_SetOption 操作を使用して設定されていない) Windows 証明書ストアにインストールされている必要があります。

ジャワ

このセクションでは、Azure IoT Java デバイス クライアントを IoT Edge ゲートウェイに接続するサンプル アプリケーションを示します。

  1. Azure IoT device SDK for Java サンプルから Send-event のサンプルを取得します。
  2. readme.md ファイルを確認して、サンプルを実行するための前提条件がすべて満たされていることを確認します。
  3. お使いのデバイス上でサンプルを実行する方法を示す手順については、SDK ドキュメントを参照してください。

Python(プログラミング言語)

このセクションでは、Azure IoT Python デバイス クライアントを IoT Edge ゲートウェイに接続するサンプル アプリケーションを示します。

  1. Azure IoT device SDK for Python サンプルから、send_message_downstreamのサンプルを取得します。
  2. Python スクリプトのコメントに指定されているように、IOTHUB_DEVICE_CONNECTION_STRING および IOTEDGE_ROOT_CA_CERT_PATH 環境変数を設定します。
  3. デバイスでサンプルを実行する方法に関する追加の手順については、SDK のドキュメントを参照してください。

ゲートウェイ接続をテストする

ダウンストリーム デバイスでこのサンプル コマンドを使用し、ゲートウェイ デバイスに接続できることをテストします。

openssl s_client -connect mygateway.contoso.com:8883 -CAfile <CERTDIR>/certs/azure-iot-test-only.root.ca.cert.pem -showcerts

このコマンドは、MQTTS (ポート 8883) 経由の接続をテストします。 別のプロトコルを使用している場合は、AMQPS (5671) または HTTPS (443) に必要に応じてコマンドを調整します

このコマンドの出力は、チェーン内のすべての証明書に関する情報を含む、長い出力になる場合があります。 接続に成功すると、 Verification: OKVerify return code: 0 (ok)などの行が表示されます。

ゲートウェイ接続を確認する

ゲートウェイ接続をトラブルシューティングする

ダウンストリーム デバイスがゲートウェイ デバイスに断続的に接続されている場合は、解決のために次の手順を試してください。

  1. 接続文字列のゲートウェイ ホスト名は、ゲートウェイ デバイスの IoT Edge 構成ファイル内のホスト名値と同じですか?
  2. そのゲートウェイ ホスト名は IP アドレスに解決できますか? DNS を使うか、またはダウンストリーム デバイスの host ファイル エントリを追加することで、断続的な接続を解決できます。
  3. ファイアウォールの通信ポートは開いていますか? 使用されるプロトコル (MQTTS:8883/AMQPS:5671/HTTPS:433) に基づく通信を、ダウンストリーム デバイスと透過的な IoT Edge の間で可能にする必要があります。

次のステップ

IoT Edge で オフライン機能 をダウンストリーム デバイスに拡張する方法について説明します。