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

適用対象:IoT Edge 1.4 チェックマーク IoT Edge 1.4

重要

IoT Edge 1.4 がサポートされているリリースです。 以前のリリースの場合は、「IoT Edge を更新する」を参照してください。

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

Note

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

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

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

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

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

この記事は、次のようなダウンストリーム デバイス接続コンポーネントを理解するのに役立ちます。

  • トランスポート層セキュリティ (TLS) と証明書の基礎。
  • 証明書の取り扱いが異なるオペレーティング システム間で動作する TLS ライブラリ。

次に、Azure IoT のサンプルを好みの言語で確認し、デバイスがゲートウェイにメッセージを送信できるようにします。

前提条件

ダウンストリーム デバイスを準備するには、次の情報を取得します。

  • ダウンストリーム デバイス

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

    ダウンストリーム デバイスとして IoT デバイスを接続する手順については、この記事の後半で説明します。 IoT Edge デバイスをダウンストリーム デバイスとして使用する場合は、「Azure IoT Edgeデバイスを接続して階層を作成する (入れ子になったエッジ)」を作成する方法に関するページを参照してください。

  • ルート CA 証明書ファイル

    このファイルは、「透過的なゲートウェイとして機能するように IoT Edge デバイスを構成する」 で、デバイス CA 証明書を生成するために使用されました。これは、ダウンストリーム デバイスで使用できます。

    ダウンストリーム デバイスは、この証明書を使用してゲートウェイ デバイスの ID を検証します。 この信頼された証明書は、ゲートウェイ デバイスへのトランスポート層セキュリティ (TLS) 接続を検証します。 「ルート CA 証明書を指定する」セクションの使用状況の詳細を参照してください。

  • ゲートウェイ デバイスを指す変更された接続文字列。

    接続文字列を変更する方法については、「Azure IoT Hub に対してダウンストリーム デバイスの認証を行う」で説明されています。

Note

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

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 と呼ばれます。

まだ行っていない場合は、この証明書ファイルをダウンストリーム デバイス上の任意のディレクトリに移動します。 ファイルを移動するには、CA 証明書をオペレーティング システムの証明書ストアにインストールするか、(特定の言語について) Azure IoT SDK を使用してアプリケーション内で証明書を参照します。

Azure Key Vault のようなサービスや、Secure copy protocol のような関数を使用して、証明書ファイルを削除することができます。

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

ルート CA 証明書がダウンストリーム デバイスに置かれたら、ゲートウェイに接続しているアプリケーションで証明書にアクセスできることを確認してください。

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

Ubuntu または Windows にルート CA 証明書をインストールします。

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

sudo cp <file 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 個削除されました。完了しました) というメッセージが表示されます。

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

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

アプリケーション レベルのサンプルを使用する前に、次の項目を準備してください。

  • ゲートウェイ デバイスをポイントするように変更したダウンストリーム デバイスの IoT Hub 接続文字列。

  • ダウンストリーム デバイスを IoT Hub に対して認証するために必要な証明書。 詳細については、「Azure IoT Hub に対するダウンストリーム デバイスの認証を行う」を参照してください。

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

    (例: <file path>/azure-iot-test-only.root.ca.cert.pem)。

これで、選択した言語のサンプルで証明書を使用する準備ができました。

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

  1. edge_downstream_device.js のサンプルを Node.js 用 Azure IoT device SDK サンプル リポジトリから入手します。
  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'),
};

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

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

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: OK または Verify return code: 0 (ok) のような行が表示されます。

ゲートウェイ接続を確認する方法のスクリーンショット。

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

ダウンストリーム デバイスのゲートウェイ デバイスへの接続が不安定な場合は、質問を参照してください。

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

次のステップ

IoT Edge を使用して、どのような方法でダウンストリーム デバイスにオフライン機能を拡張できるかについて学びます。