X.509 クライアント証明書を使用したカスタム認証 - AWS IoT Core

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

X.509 クライアント証明書を使用したカスタム認証

デバイスを に接続する場合 AWS IoT Core、複数の認証タイプを使用できます。X.509 クライアント証明書を使用すると、クライアントとデバイス接続を認証したり、カスタムオーソライザーを定義して独自のクライアント認証と承認ロジックを管理したりできます。このトピックでは、X.509 クライアント証明書でカスタム認証を使用する方法について説明します。

X.509 証明書でカスタム認証を使用すると、X.509 証明書を使用してデバイスを既に認証していて、追加の検証とカスタム認証を実行したい場合に役立ちます。例えば、X.509 クライアント証明書にシリアル番号などのデバイスのデータを保存した場合、X.509 クライアント証明書を AWS IoT Core 認証した後、カスタムオーソライザーを使用して、証明書の CommonName フィールドに保存されている情報に基づいて特定のデバイスを識別できます。X.509 証明書でカスタム認証を使用すると、デバイスを に接続する際にデバイスのセキュリティ管理を強化 AWS IoT Core し、認証ロジックと認可ロジックをより柔軟に管理できます。 は、プロトコルとMQTTプロトコルの両方で動作する X.509 証明書とカスタムオーソライザー認証タイプを使用して X.509 証明書でのカスタム認証 AWS IoT Core をサポートしますHTTPS。デバイスエンドポイントがサポートする AWS IoT Core 認証タイプとアプリケーションプロトコルの詳細については、「デバイス通信プロトコル」を参照してください。

注記

X.509 クライアント証明書によるカスタム認証は、 AWS GovCloud (US) リージョンではサポートされていません。

重要

ドメイン設定 を使用して作成されたエンドポイントを使用する必要があります。さらに、クライアントは に接続するときにサーバー名表示 (SNI) 拡張機能を提供する必要があります AWS IoT Core。

ステップ 1: X.509 クライアント証明書を に登録する AWS IoT Core

これをまだ実行していない場合は、X.509 クライアント証明書を に登録してアクティブ化します AWS IoT Core。それ以外の場合は、次のステップに進みます。

でクライアント証明書を登録してアクティブ化するには AWS IoT Core、次の手順に従います。

  1. でクライアント証明書を直接作成 AWS IoTする場合。これらのクライアント証明書は、 に自動的に登録されます AWS IoT Core。

  2. 独自のクライアント証明書を作成する場合は、以下の手順に従って に登録します AWS IoT Core

  3. クライアント証明書をアクティブ化するには、以下の手順に従います。

ステップ 2: Lambda 関数を作成する

AWS IoT Core は、カスタムオーソライザーを使用してカスタム認証と認可スキームを実装します。カスタムオーソライザーは、デバイスが認証されているかどうか、およびデバイスが実行できるオペレーションを決定する Lambda 関数に関連付けられます。デバイスが に接続すると AWS IoT Core、 はオーソライザー名と関連する Lambda 関数を含むオーソライザーの詳細 AWS IoT Core を取得し、Lambda 関数を呼び出します。Lambda 関数は、デバイスの X.509 クライアント証明書データを含むJSONオブジェクトを含むイベントを受信します。Lambda 関数は、このイベントJSONオブジェクトを使用して認証リクエストを評価し、実行するアクションを決定し、レスポンスを返します。

Lambda 関数イベントの例

次のJSONオブジェクトの例には、含めることができるすべてのフィールドが含まれています。実際のJSONオブジェクトには、特定の接続リクエストに関連するフィールドのみが含まれます。

{ "token": "aToken", "signatureVerified": true, "protocols": [ "tls", "mqtt" ], "protocolData": { "tls": { "serverName": "serverName", "x509CertificatePem": "x509CertificatePem", "principalId": "principalId" }, "mqtt": { "clientId": "myClientId", "username": "myUserName", "password": "myPassword" } }, "connectionMetadata": { "id": "UUID" } }
signatureVerified

オーソライザーの Lambda 関数を呼び出す前に、オーソライザーで設定されたトークン署名を検証するかどうかを示すブール値。オーソライザーがトークン署名を無効にするように設定されている場合、このフィールドは false になります。

protocols

リクエストに予期されるプロトコルを含む配列。

protocolData

接続で使用されるプロトコルの情報を含むオブジェクト。認証、認可などに役立つプロトコル固有の詳細を提供します。

tls - このオブジェクトには、 TLS (Transport Layer Security) プロトコルに関連する情報が含まれます。

  • serverName - Server Name Indication (SNI) ホスト名文字列。 AWS IoT Core では、デバイスがSNI拡張機能を Transport Layer Security (TLS) プロトコルに送信し、 host_name フィールドに完全なエンドポイントアドレスを指定する必要があります。

  • x509CertificatePem - TLS接続でのクライアント認証に使用される PEM形式の X.509 証明書。

  • principalId - TLS接続内のクライアントに関連付けられたプリンシパル識別子。

mqtt - このオブジェクトには、 TLS (Transport Layer Security) プロトコルに関連する情報が含まれます。

  • clientId - 文字列は、デバイスがこの値を送信するイベントにのみ含める必要があります。

  • username - MQTT Connect パケットで指定されたユーザー名。

  • password - MQTT Connect パケットで提供されるパスワード。

connectionMetadata

接続のメタデータ。

id - ログ記録とトラブルシューティングに使用できる接続 ID。

注記

このイベントJSONオブジェクトでは、 x509CertificatePemprincipalIdはリクエスト内の 2 つの新しいフィールドです。の値は、 の値と同じprincipalIdですcertificateId。詳細については、「証明書」を参照してください。

Lambda 関数のレスポンスの例

Lambda 関数は、イベントJSONオブジェクトからの情報を使用して受信接続を認証し、接続で許可されるアクションを決定する必要があります。

次のJSONオブジェクトには、Lambda 関数が送信できるレスポンスの例が含まれています。

{ "isAuthenticated": true, "principalId": "xxxxxxxx", "disconnectAfterInSeconds": 86400, "refreshAfterInSeconds": 300, "policyDocuments": [ { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Publish", "Resource": "arn:aws:iot:us-east-1:123456789012:topic/customauthtesting" } ] } ] }

この例では、この関数は、次の値を含むレスポンスを送信する必要があります。

isAuthenticated

リクエストが認証されているかどうかを示すブール値。

principalId

カスタム認証リクエストによって送信されるトークンの識別子として機能する英数字文字列。値は、1 文字以上 128 文字以下の英数字文字列である必要があります。ログ内の接続を識別します。の値は、principalIdイベントJSONオブジェクトの の値 (X.509 証明書 certificateId の値) と同じprincipalIdである必要があります。

policyDocuments

JSON形式の AWS IoT Core ポリシードキュメントのリスト。値はオプションで、モノのポリシー変数証明書ポリシー変数 をサポートしています。ポリシードキュメントの最大数は 10 です。各ポリシードキュメントでは最大 2,048 文字を使用できます。クライアント証明書と Lambda 関数に複数のポリシーがアタッチされている場合、アクセス許可はすべてのポリシーのコレクションです。 AWS IoT Core ポリシーの作成の詳細については、「 ポリシー」を参照してください。

disconnectAfterInSeconds

AWS IoT Core ゲートウェイへの接続の最大時間 (秒単位) を指定する整数。最小値は 300 秒、最大値は 86,400 秒です。 disconnectAfterInSecondsは接続の存続期間中であり、連続するポリシー更新では更新されません。

refreshAfterInSeconds

ポリシーの更新間隔を指定する整数。この間隔が過ぎると、 は Lambda AWS IoT Core 関数を呼び出して、ポリシーの更新を許可します。最小値は 300 秒で、最大値は 86,400 秒です。

Lambda 関数の例

以下は、Node.js Lambda 関数のサンプルです。この関数は、クライアントの X.509 証明書を調べ、シリアル番号、フィンガープリント、件名などの関連情報を抽出します。抽出された情報が期待値と一致する場合、クライアントには接続するためのアクセス許可が付与されます。このメカニズムにより、有効な証明書を持つ承認されたクライアントのみが接続を確立できます。

const crypto = require('crypto'); exports.handler = async (event) => { // Extract the certificate PEM from the event const certPem = event.protocolData.tls.x509CertificatePem; // Parse the certificate using Node's crypto module const cert = new crypto.X509Certificate(certPem); var effect = "Deny"; // Allow permissions only for a particular certificate serial, fingerprint, and subject if (cert.serialNumber === "7F8D2E4B9C1A5036DE8F7C4B2A91E5D80463BC9A1257" // This is a random serial && cert.fingerprint === "F2:9A:C4:1D:B5:E7:08:3F:6B:D0:4E:92:A7:C1:5B:8D:16:0F:E3:7A" // This is a random fingerprint && cert.subject === "allow.example.com") { effect = "Allow"; } return generateAuthResponse(event.protocolData.tls.principalId, effect); }; // Helper function to generate the authorization response. function generateAuthResponse(principalId, effect) { const authResponse = { isAuthenticated: true, principalId, disconnectAfterInSeconds: 3600, refreshAfterInSeconds: 300, policyDocuments: [ { Version: "2012-10-17", Statement: [ { Action: ["iot:Connect"], Effect: effect, Resource: [ "arn:aws:iot:us-east-1:123456789012:client/myClientName" ] }, { Action: ["iot:Publish"], Effect: effect, Resource: [ "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName" ] }, { Action: ["iot:Subscribe"], Effect: effect, Resource: [ "arn:aws:iot:us-east-1:123456789012:topicfilter/telemetry/myClientName" ] }, { Action: ["iot:Receive"], Effect: effect, Resource: [ "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName" ] } ] } ] }; return authResponse; }

前述の Lambda 関数は、想定されるシリアル、フィンガープリント、およびサブジェクトを含む証明書JSONを受信すると、以下を返します。の値は、TLSハンドシェイクで提供されるクライアント証明書x509CertificatePemになります。詳細については、「Lambda 関数の定義」を参照してください。

{ "isAuthenticated": true, "principalId": "principalId in the event JSON object", "policyDocuments": [ { "Version": "2012-10-17", "Statement": [ { "Action": "iot:Connect", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:123456789012:client/myClientName" }, { "Action": "iot:Publish", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName" }, { "Action": "iot:Subscribe", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/telemetry/myClientName" }, { "Action": "iot:Receive", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName" } ] } ], "disconnectAfterInSeconds": 3600, "refreshAfterInSeconds": 300 }

ステップ 3: カスタムオーソライザーを作成する

Lambda 関数 を定義したら、カスタムオーソライザーを作成して、独自のクライアント認証および承認ロジックを管理します。ステップ 3: カスタマーオーソライザーリソースとその承認 の詳細な指示に従ってください。詳細については、「オーソライザーの作成」を参照してください。

カスタムオーソライザーを作成するプロセスでは、作成後に Lambda 関数を呼び出すアクセス許可を付与 AWS IoT する必要があります。詳細な手順については、「Lambda 関数 AWS IoT を呼び出す許可」を参照してください。

ステップ 4: ドメイン設定で認証タイプとアプリケーションプロトコルを設定する

X.509 クライアント証明書によるカスタム認証を使用してデバイスを認証するには、ドメイン設定で認証タイプとアプリケーションプロトコルを設定し、SNI拡張機能を送信する必要があります。の値は にauthenticationTypeする必要がありCUSTOM_AUTH_X509、 の値は SECURE_MQTTまたは にapplicationProtocolすることができますHTTPS

ドメイン設定で認証タイプとアプリケーションプロトコルを設定する (CLI)

ドメイン設定がない場合は、 create-domain-configuration コマンドを使用してドメイン設定を作成します。の値は にauthenticationTypeする必要がありCUSTOM_AUTH_X509、 の値は SECURE_MQTTまたは にapplicationProtocolすることができますHTTPS

aws iot create-domain-configuration \ --domain-configuration-name domainConfigurationName \ --authentication-type CUSTOM_AUTH_X509 \ --application-protocol SECURE_MQTT \ --authorizer-config '{ "defaultAuthorizerName": my-custom-authorizer }'

既にドメイン設定がある場合は、 update-domain-configuration コマンドの更新authenticationTypeapplicationProtocol必要に応じて を使用します。デフォルトのエンドポイント () では、認証タイプやプロトコルを変更できないことに注意してくださいiot:Data-ATS

aws iot update-domain-configuration \ --domain-configuration-name domainConfigurationName \ --authentication-type CUSTOM_AUTH_X509 \ --application-protocol SECURE_MQTT \ --authorizer-config '{ "defaultAuthorizerName": my-custom-authorizer }'
domain-configuration-name

ドメイン構成の名前。

authentication-type

ドメイン設定の認証タイプ。詳細については、「認証タイプの選択」を参照してください。

application-protocol

デバイスが との通信に使用するアプリケーションプロトコル AWS IoT Core。詳細については、「アプリケーションプロトコルの選択」を参照してください。

--authorizer-config

ドメイン設定でオーソライザー設定を指定するオブジェクト。

defaultAuthorizerName

ドメイン設定のオーソライザーの名前。

詳細については、 リファレンス UpdateDomainConfigurationCreateDomainConfiguration「」および「」を参照してください。 AWS IoT API ドメイン設定の詳細については、「ドメイン設定」を参照してください。