翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
デバイスを に接続する場合 AWS IoT Core、複数の認証タイプを使用できます。X.509 クライアント証明書を使用すると、クライアントとデバイス接続を認証したり、カスタムオーソライザーを定義して独自のクライアント認証と承認ロジックを管理したりできます。このトピックでは、X.509 クライアント証明書でカスタム認証を使用する方法について説明します。
X.509 証明書でカスタム認証を使用すると、X.509 証明書を使用してデバイスを既に認証していて、追加の検証とカスタム認証を実行したい場合に役立ちます。例えば、X.509 クライアント証明書にシリアル番号などのデバイスのデータを保存した場合、 AWS IoT Core が X.509 クライアント証明書を認証した後、カスタムオーソライザーを使用して、証明書の CommonName フィールドに保存されている情報に基づいて特定のデバイスを識別できます。X.509 証明書でカスタム認証を使用すると、デバイスを に接続する際のデバイスセキュリティ管理を強化 AWS IoT Core し、認証と認可ロジックをより柔軟に管理できます。 は、MQTT プロトコルと HTTPS プロトコルの両方で機能する X.509 証明書とカスタムオーソライザー認証タイプを使用した X.509 証明書でのカスタム認証 AWS IoT Core をサポートします。 AWS IoT Core デバイスエンドポイントがサポートする認証タイプとアプリケーションプロトコルの詳細については、「デバイス通信プロトコル」を参照してください。
注記
X.509 クライアント証明書によるカスタム認証は、 AWS GovCloud (US) リージョンではサポートされていません。
重要
[ドメイン設定] を使用して作成されたエンドポイントを使用する必要があります。さらに、クライアントは接続時に Server Name Indication (SNI)
X.509 クライアント証明書を使用したカスタム認証を使用してデバイスを認証するプロセスは、次のステップで構成されます。
ステップ 1: X.509 クライアント証明書を に登録する AWS IoT Core
これをまだ実行していない場合は、X.509 クライアント証明書を登録してアクティブ化します AWS IoT Core。それ以外の場合は、次のステップに進みます。
クライアント証明書を に登録してアクティブ化するには AWS IoT Core、次の手順に従います。
-
でクライアント証明書を直接作成 AWS IoTする場合。これらのクライアント証明書は自動的に に登録されます AWS IoT Core。
-
クライアント証明書をアクティブ化するには、以下の手順に従います。
ステップ 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
- [サーバー名表示 (SNI)]ホスト名文字列。 AWS IoT Core では、デバイスが SNI 拡張 を Transport Layer Security (TLS) に送信し、 host_name
フィールドに完全なエンドポイントアドレスを指定する必要があります。 -
x509CertificatePem
- PEM 形式の X.509 証明書。TLS 接続でのクライアント認証に使用されます。 -
principalId
- TLS 接続内のクライアントに関連付けられたプリンシパル識別子。
mqtt
- このオブジェクトは、MQTT プロトコルに関連する情報を保持します。-
clientId
- 文字列は、デバイスがこの値を送信するイベントにのみ含める必要があります。 -
username
- MQTT Connect パケットで指定されたユーザー名。 -
password
- MQTT Connect パケットで提供されたパスワード。
-
connectionMetadata
-
接続のメタデータ。
id
- ログ記録とトラブルシューティングに使用できる接続 ID。
注記
このイベントでは、JSON オブジェクト、x509CertificatePem
および principalId
はリクエスト内の 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 を返します。x509CertificatePem
の値は、TLS ハンドシェイクで提供されるクライアント証明書になります。詳細については、「 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
にする必要があり、applicationProtocol
の値は SECURE_MQTT
または HTTPS
にすることができます。
ドメイン設定 (CLI) で認証タイプとアプリケーションプロトコルを設定する
ドメイン設定がない場合は、create-domain-configuration コマンドを使用してドメイン設定を作成します。authenticationType
の値は CUSTOM_AUTH_X509
にする必要があり、applicationProtocol
の値は SECURE_MQTT
または HTTPS
にすることができます。
aws iot create-domain-configuration \ --domain-configuration-name
domainConfigurationName
\ --authentication-typeCUSTOM_AUTH_X509
\ --application-protocolSECURE_MQTT
\ --authorizer-config '{ "defaultAuthorizerName":my-custom-authorizer
}'
ドメイン設定が既にある場合は、update-domain-configuration コマンドの更新 authenticationType
と必要に応じて applicationProtocol
を使用します。デフォルトのエンドポイント (iot:Data-ATS
) では、認証タイプやプロトコルを変更できないことに注意してください。
aws iot update-domain-configuration \ --domain-configuration-name
domainConfigurationName
\ --authentication-typeCUSTOM_AUTH_X509
\ --application-protocolSECURE_MQTT
\ --authorizer-config '{ "defaultAuthorizerName":my-custom-authorizer
}'
domain-configuration-name
-
ドメイン構成の名前。
authentication-type
-
ドメイン設定の認証タイプ。詳細については、「認証タイプの選択」を参照してください。
application-protocol
-
デバイスが AWS IoT Coreとの通信に使用するアプリケーションプロトコル。詳細については、「アプリケーションプロトコルの選択」を参照してください。
--authorizer-config
-
ドメイン設定でオーソライザー設定を指定するオブジェクト。
defaultAuthorizerName
-
ドメイン構成のオーソライザー名。
詳細については、「AWS IoT API リファレンス」の「CreateDomainConfiguration」と「UpdateDomainConfiguration」を参照してください。ドメイン設定の詳細については、「ドメイン設定」を参照してください。