IoT Hub でのトランスポート層セキュリティ (TLS) のサポート

IoT Hub は、トランスポート層セキュリティ (TLS) を使用して、IoT デバイスとサービスからの接続をセキュリティで保護します。 現時点では 3 つのバージョンの TLS プロトコル (つまり、バージョン 1.0、1.1、および 1.2) がサポートされています。

TLS 1.0 と 1.1 はレガシと見なされており、非推奨となる予定です。 詳細については、IoT Hub の TLS 1.0 および 1.1 の廃止に関する記事を参照してください。 今後の問題を回避するには、IoT Hub に接続するときに、TLS バージョンとして TLS 1.2 のみを使用してください。

IoT Hub のサーバー TLS 証明書

TLS ハンドシェイク中、IoT Hub は、接続するクライアントに RSA キー付きサーバー証明書を提示します。以前は、証明書はすべて Baltimore Cybertrust Root CA からルートされていました。 Baltimore ルートは寿命が終了しているため、DigiCert Global G2 と呼ばれる新しいルートに移行中です。 この移行は、現在 IoT Hub に接続しているすべてのデバイスに影響します。 詳細については、「IoT TLS 証明書の更新」を参照してください

ルート CA の移行はまれですが、最新のセキュリティ環境での回復性のために、ルート CA が侵害されたり、緊急ルート CA の移行が必要な場合に備えて IoT シナリオを準備する必要があります。 すべてのデバイスで、次の 3 つのルート CA を信頼することを強くお勧めします。

  • Baltimore CyberTrust root CA
  • DigiCert Global G2 root CA
  • Microsoft RSA root CA 2017

これらの証明書をダウンロードするためのリンクについては、Azure 証明機関の詳細を参照してください

楕円曲線暗号 (ECC) サーバー TLS 証明書 (プレビュー)

IoT Hub ECC サーバー TLS 証明書は、パブリック プレビューとして提供されています。 ECC 証明書の検証 (ECC のみの暗号スイートを使用) を使用すると、RSA 証明書と同様のセキュリティが提供されると同時に、コンピューティング、メモリ、および帯域幅の使用が最大 40% 削減されます。 このような削減は、IoT デバイスにとって重要です。そのプロファイルおよびメモリのサイズが小さくなるためであり、ネットワーク帯域幅が制限された環境でのユース ケースに対応することができます。

ECC を使用するすべてのデバイスは、次の 2 つのルート CA を信頼することを強くお勧めします。

  • DigiCert Global G3 root CA
  • Microsoft RSA root CA 2017

これらの証明書をダウンロードするためのリンクについては、Azure 証明機関の詳細を参照してください

IoT Hub の ECC サーバー証明書をプレビューするには、次のようにします。

  1. プレビュー モードをオンにした状態で新しい IoT ハブを作成します
  2. ECDSA の暗号スイート "のみ" を含め、RSA のものについてはいずれも "除外" するように、クライアントを構成してください。 ECC 証明書パブリック プレビューでサポートされている暗号スイートは次のとおりです。
    • TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
    • TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
    • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
    • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  3. クライアントをプレビュー IoT ハブに接続します。

一部のリージョンで利用できる TLS 1.2 の強制

セキュリティを強化するために、TLS バージョン 1.2 を使用するクライアント接続 "のみ" を許可し、暗号スイートの使用を強制するように、IoT Hub を構成します。 この機能は、次のリージョンでのみサポートされています。

  • 米国東部
  • 米国中南部
  • 米国西部 2
  • US Gov アリゾナ
  • US Gov バー ジニア (TLS 1.0/1.1 のサポートはこのリージョンでは利用できません - TLS 1.2 の強制を有効にする必要があります。そうしないと、IoT ハブの作成は失敗します)

TLS 1.2 の強制を有効にするには、Azure portal での IoT ハブの作成に関する記事の手順に従ってください。

  • 前述の一覧からリージョンを選択します。

  • [管理] -> [詳細設定] -> [トランスポート層セキュリティ (TLS)] -> [TLS の最小バージョン] で、1.2 を選択します。 この設定は、サポートされているリージョンで作成された IoT ハブにのみ表示されます。

    Screenshot showing how to turn on TLS 1.2 enforcement during IoT hub creation

ARM テンプレートを使用して作成するには、サポートされているリージョンのいずれかに新しい IoT ハブをプロビジョニングし、次のリソース仕様で minTlsVersion プロパティを 1.2 に設定します。

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources": [
        {
            "type": "Microsoft.Devices/IotHubs",
            "apiVersion": "2020-01-01",
            "name": "<provide-a-valid-resource-name>",
            "location": "<any-of-supported-regions-below>",
            "properties": {
                "minTlsVersion": "1.2"
            },
            "sku": {
                "name": "<your-hubs-SKU-name>",
                "tier": "<your-hubs-SKU-tier>",
                "capacity": 1
            }
        }
    ]
}

この構成を使用して作成された IoT Hub リソースは、TLS バージョン 1.0 および 1.1 を使用して接続を試みるデバイスとサービス クライアントを拒否します。 同様に、ClientHello メッセージにClientHelloが示されていない場合、TLS ハンドシェイクは拒否されます。

注意

minTlsVersion プロパティは読み取り専用であり、IoT Hub リソースの作成後は変更できません。 したがって、すべての IoT デバイスとサービスが TLS 1.2 および推奨される暗号と互換性があることを、事前に適切にテストし、検証する必要があります。

フェールオーバー時、IoT Hub の minTlsVersion プロパティは、フェールオーバー後に geo ペア リージョンで有効なままになります。

暗号スイート

TLS 1.2 のみを受け入れるように構成されている IoT Hub では、次の推奨される暗号スイートの使用も強制されます。

  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384

TLS 1.2 の強制が構成されていない IoT Hub では、TLS 1.2 は次の暗号スイートで引き続き動作します。

  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_RSA_WITH_AES_256_GCM_SHA384
  • TLS_RSA_WITH_AES_128_GCM_SHA256
  • TLS_RSA_WITH_AES_256_CBC_SHA256
  • TLS_RSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  • TLS_RSA_WITH_AES_256_CBC_SHA
  • TLS_RSA_WITH_AES_128_CBC_SHA
  • TLS_RSA_WITH_3DES_EDE_CBC_SHA(この暗号は 2022 年 10 月 1 日に非推奨となり、TLS ハンドシェイクには使用されなくなります)

クライアントからは、ClientHello の間、上位の暗号スイートの一覧を提案できます。 ただし、IoT Hub ではサポートされないものもあります (ECDHE-ECDSA-AES256-GCM-SHA384 など)。 その場合、IoT Hub はクライアントの設定に従おうとしますが、最終的には ServerHello と暗号化スイートをネゴシエートします。

SDK および IoT Edge 用の TLS 構成

次のリンクを使用して、IoT Hub クライアント SDK で TLS 1.2 および許可されている暗号を構成します。

Language TLS 1.2 をサポートするバージョン ドキュメント
C タグ 2019-12-11 以降 リンク
Python バージョン 2.0.0 以降 リンク
C# バージョン 1.21.4 以降 リンク
Java バージョン 1.19.0 以降 リンク
NodeJS バージョン 1.12.2 以降 リンク

IoT Edge デバイスは、IoT Hub との通信時に TLS 1.2 を使用するように構成できます。 このためには、IoT Edge ドキュメント ページを使用してください。

デバイスの認証

TLS ハンドシェイクに成功すると、IoT Hub では、対称キーか X.509 証明書を利用してデバイスを認証できます。 証明書ベースの認証の場合、ECC など、あらゆる X.509 証明書を利用できます。 IoT Hub では、指定した拇印または認証機関 (CA) を利用し、証明書の有効性を検証します。 詳細については、「サポートされている X.509 証明書」をご覧ください。

相互 TLS のサポート

相互 TLS 認証では、サーバー (IoT Hub) 証明書が本物であることをクライアントが "確認" し、X.509 クライアント証明書または X.509 拇印が本物であることをサーバー (IoT Hub) が "確認" します。 "権限付与" は "本物であることの確認" 完了後に IoT Hub によって実行されます。

AMQP プロトコルと MQTT プロトコルの場合、IoT Hub は初回の TLS ハンドシェイクでクライアント証明書を要求します。 クライアント証明書が与えられると、IoT Hub はそれが "本物であることを確認" し、クライアントは IoT Hub 証明書が "本物であることを確認" します。 このプロセスを相互 TLS 認証と呼ばれています。 IoT Hub が MQTT 接続パケットを受信するか、AMQP リンクが開くと、IoT Hub は要求元クライアントのための "権限付与" を実行し、クライアントに X.509 認証が必要か判断します。 相互 TLS 認証が完了し、デバイスとして接続する許可がクライアントに認められると、接続が可能になります。 ただし、クライアントが X.509 認証を必要とするとき、クライアント認証が TLS ハンドシェイク中に完了しなかった場合、IoT Hub は接続を拒否します。

HTTP プロトコルの場合、クライアントが最初の要求を行うと、IoT Hub はクライアントが X.509 認証を必要とするか確認し、クライアント認証が完了していた場合、IoT Hub は権限を付与します。 クライアント認証が完了していなかった場合、IoT Hub は接続を拒否します

証明書のピン留め

IoT Hub エンドポイントに関連する TLS サーバー証明書 (別名、リーフ証明書) および中間証明書の証明書ピン留めやフィルター処理は、Microsoft がこれらの証明書をほとんどあるいは全く予告なしに頻繁に切り替えるため、極力避けてください。 必要な場合は、この Azure IoT ブログ記事の説明に従ってルート証明書のみをピン留めしてください。

TLS 最大フラグメント長ネゴシエーション (プレビュー)

IoT Hub では、TLS 最大フラグメント長ネゴシエーションもサポートされています。これは、TLS フレーム サイズ ネゴシエーションと呼ばれることもあります。 この機能はパブリック プレビュー段階にあります。

この機能を使用すると、プレーンテキストの最大フラグメント長を、既定の 2^14 バイトより小さい値に指定できます。 ネゴシエートされると、IoT Hub とクライアントによってメッセージのフラグメント化が開始され、すべてのフラグメントがネゴシエートされた長さよりも確実に小さくなります。 この動作は、コンピューティングまたはメモリに制約があるデバイスに役立ちます。 詳細については、公式の TLS 拡張機能仕様を参照してください。

このパブリック プレビュー機能の公式 SDK サポートはまだ利用できません。 開始するには

  1. プレビュー モードをオンにした状態で新しい IoT ハブを作成します
  2. OpenSSL を使用する場合は、SSL_CTX_set_tlsext_max_fragment_length を呼び出して、フラグメントのサイズを指定します。
  3. クライアントをプレビュー IoT Hub に接続します。

次のステップ