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 キー付きサーバー証明書が接続元のクライアントに提示されます。 グローバル Azure クラウド内のすべての IoT ハブでは、DigiCert Global Root G2 によって発行された TLS 証明書が使用されます。
また、DigiCert Global Root G2 が予期せず廃止された場合の中断を防ぐために、Microsoft RSA Root Certificate Authority 2017 証明書をデバイスに追加することもお勧めします。 ルート CA の移行はまれですが、最新のセキュリティ環境での回復性のために、ルート CA が侵害されたり、緊急でルート CA の移行が必要な場合に備えて IoT シナリオを準備する必要があります。
すべてのデバイスで、次のルート CA を信頼することを強くお勧めします。
- DigiCert Global G2 ルート CA
- Microsoft RSA ルート CA 2017
これらの証明書をダウンロードするためのリンクについては、「Azure 証明機関の詳細」を参照してください。
SDK での証明書の信頼
Azure IoT device SDK は、デバイスを Azure IoT サービスに接続して認証します。 さまざまな SDK は、言語とバージョンに応じてさまざまな方法で証明書を管理しますが、ほとんどの場合、コードベースで証明書を直接ピン留めするのではなく、デバイスの信頼された証明書ストアに依存します。 この方法では、ルート証明書の今後の変更に対応するための柔軟性と回復性が提供されます。
次の表は、信頼された証明書ストアをサポートする SDK のバージョンをまとめたものです。
Azure IoT device SDK | サポートされているバージョン |
---|---|
C | 現在サポートされているすべてのバージョン |
C# | 現在サポートされているすべてのバージョン |
Java | バージョン 2.x.x 以降 |
Node.js | 現在サポートされているすべてのバージョン |
Python | 現在サポートされているすべてのバージョン |
証明書のピン留め
IoT Hub エンドポイントに関連する TLS サーバー証明書 (リーフ証明書とも呼ばれます) および中間証明書の証明書ピン留めやフィルター処理は、Microsoft がこれらの証明書をほとんどあるいは全く予告なしに頻繁にロールするため、推奨されません。 必要な場合は、ルート証明書のみをピン留めします。
楕円曲線暗号 (ECC) サーバー TLS 証明書 (プレビュー)
IoT Hub ECC サーバー TLS 証明書は、パブリック プレビューとして提供されています。 ECC 証明書の検証 (ECC のみの暗号スイートを使用) を使用すると、RSA 証明書と同様のセキュリティが提供されると同時に、コンピューティング、メモリ、および帯域幅の使用が最大 40% 削減されます。 このような削減は、IoT デバイスにとって重要です。そのプロファイルおよびメモリのサイズが小さくなるためであり、ネットワーク帯域幅が制限された環境でのユース ケースに対応することができます。
ECC を使用するすべてのデバイスは、次の 2 つのルート CA を信頼することを強くお勧めします。
- DigiCert Global G3 ルート CA
- Microsoft RSA ルート CA 2017
これらの証明書をダウンロードするためのリンクについては、「Azure 証明機関の詳細」を参照してください。
IoT Hub の ECC サーバー証明書をプレビューするには、次のようにします。
- プレビュー モードをオンにした状態で新しい IoT ハブを作成します。
- 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
- クライアントをプレビュー 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 ハブにのみ表示されます。
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
メッセージに推奨される暗号が示されていない場合、TLS ハンドシェイクは拒否されます。
Note
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 は接続を拒否します
TLS 最大フラグメント長ネゴシエーション (プレビュー)
IoT Hub では、TLS 最大フラグメント長ネゴシエーションもサポートされています。これは、TLS フレーム サイズ ネゴシエーションと呼ばれることもあります。 この機能はパブリック プレビュー段階にあります。
この機能を使用すると、プレーンテキストの最大フラグメント長を、既定の 2^14 バイトより小さい値に指定できます。 ネゴシエートされると、IoT Hub とクライアントによってメッセージのフラグメント化が開始され、すべてのフラグメントがネゴシエートされた長さよりも確実に小さくなります。 この動作は、コンピューティングまたはメモリに制約があるデバイスに役立ちます。 詳細については、公式の TLS 拡張機能仕様を参照してください。
このパブリック プレビュー機能の公式 SDK サポートはまだ利用できません。 開始するには
- プレビュー モードをオンにした状態で新しい IoT ハブを作成します。
- OpenSSL を使用する場合は、SSL_CTX_set_tlsext_max_fragment_length を呼び出して、フラグメントのサイズを指定します。
- クライアントをプレビュー IoT Hub に接続します。
次のステップ
- IoT Hub のセキュリティおよびアクセス制御の詳細については、「IoT Hub へのアクセスの制御」を参照してください。
- デバイス認証に X509 証明書を使用する方法の詳細については、「X.509 CA 証明書を使用したデバイス認証」を参照してください。