

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

# X.509 クライアント証明書を使用したカスタム認証
<a name="custom-auth-509cert"></a>

デバイスを に接続するときは AWS IoT Core、複数の[認証タイプ](protocols.md#connection-protocol-auth-mode)を使用できます。[X.509 クライアント証明書](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html)を使用すると、クライアントとデバイス接続を認証したり、[カスタムオーソライザー](https://docs.aws.amazon.com//iot/latest/developerguide/custom-authentication.html)を定義して独自のクライアント認証と承認ロジックを管理したりできます。このトピックでは、X.509 クライアント証明書でカスタム認証を使用する方法について説明します。

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

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

**重要**  
[[ドメイン設定]](iot-custom-endpoints-configurable.md) を使用して作成されたエンドポイントを使用する必要があります。さらに、クライアントは接続時に [Server Name Indication (SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) 拡張機能を提供する必要があります AWS IoT Core。

**Topics**
+ [ステップ 1: X.509 クライアント証明書を に登録する AWS IoT Core](#custom-auth-509cert-client)
+ [ステップ 2: Lambda 関数を作成する](#custom-auth-509cert-lambda)
+ [ステップ 3: カスタムオーソライザーを作成する](#custom-auth-509cert-authorizer)
+ [ステップ 4: ドメイン設定で認証タイプとアプリケーションプロトコルを設定する](#custom-auth-509cert-domainconfig)

## ステップ 1: X.509 クライアント証明書を に登録する AWS IoT Core
<a name="custom-auth-509cert-client"></a>

これをまだ実行していない場合は、[X.509 クライアント証明書](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html)を登録してアクティブ化します AWS IoT Core。それ以外の場合は、次のステップに進みます。

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

1. [でクライアント証明書を直接作成 AWS IoT](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-create.html)する場合。これらのクライアント証明書は、 に自動的に登録されます AWS IoT Core。

1. [独自のクライアント証明書を作成する](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-your-own.html)場合は、[以下の手順に従って登録します AWS IoT Core](https://docs.aws.amazon.com//iot/latest/developerguide/register-device-cert.html)。

1. クライアント証明書をアクティブ化するには、[以下の手順](https://docs.aws.amazon.com//iot/latest/developerguide/activate-or-deactivate-device-cert.html)に従います。

## ステップ 2: Lambda 関数を作成する
<a name="custom-auth-509cert-lambda"></a>

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

### Lambda 関数のイベントの例
<a name="custom-auth-509cert-event"></a>

次の 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)]](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) ホスト名文字列。 AWS IoT Core では、デバイスが [SNI 拡張](https://www.rfc-editor.org/rfc/rfc3546#section-3.1)を 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` の値と同じです。詳細については、「[証明書](https://docs.aws.amazon.com//iot/latest/apireference/API_Certificate.html)」を参照してください。

### Lambda 関数のレスポンスの例
<a name="custom-auth-509cert-response"></a>

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 ポリシードキュメントのリスト。値はオプションで、[モノのポリシー変数](https://docs.aws.amazon.com//iot/latest/developerguide/thing-policy-variables.html)と[証明書のポリシー変数](https://docs.aws.amazon.com//iot/latest/developerguide/cert-policy-variables.html)をサポートしています。ポリシードキュメントの最大数は 10 です。各ポリシードキュメントでは最大 2,048 文字を使用できます。クライアント証明書と Lambda 関数に複数のポリシーがアタッチされている場合、アクセス許可はすべてのポリシーのコレクションです。 AWS IoT Core ポリシーの作成の詳細については、[「 ](https://docs.aws.amazon.com//iot/latest/developerguide/iot-policies.html)ポリシー」を参照してください。

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

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

### Lambda 関数の例
<a name="custom-auth-509cert-js-example"></a>

次に示すのは、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 関数の定義](https://docs.aws.amazon.com//iot/latest/developerguide/config-custom-auth.html#custom-auth-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: カスタムオーソライザーを作成する
<a name="custom-auth-509cert-authorizer"></a>

[Lambda 関数 を定義した](#custom-auth-509cert-lambda)後、カスタムオーソライザーを作成して、独自のクライアント認証および承認ロジックを管理します。[ステップ 3: カスタマーオーソライザーリソースとその承認を作成する](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html#custom-auth-tutorial-authorizer)の詳細な指示に従ってください。詳細については、「[オーソライザーの作成](https://docs.aws.amazon.com//iot/latest/developerguide/config-custom-auth.html)」を参照してください。

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

## ステップ 4: ドメイン設定で認証タイプとアプリケーションプロトコルを設定する
<a name="custom-auth-509cert-domainconfig"></a>

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

### ドメイン設定 (CLI) で認証タイプとアプリケーションプロトコルを設定する
<a name="custom-auth-509cert-cli"></a>

ドメイン設定がない場合は、[https://docs.aws.amazon.com//cli/latest/reference/iot/create-domain-configuration.html](https://docs.aws.amazon.com//cli/latest/reference/iot/create-domain-configuration.html) コマンドを使用してドメイン設定を作成します。`authenticationType` の値は `CUSTOM_AUTH_X509` にする必要があり、`applicationProtocol` の値は `SECURE_MQTT` または `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
    }'
```

ドメイン設定が既にある場合は、[https://docs.aws.amazon.com//cli/latest/reference/iot/update-domain-configuration.html](https://docs.aws.amazon.com//cli/latest/reference/iot/update-domain-configuration.html) コマンドの更新 `authenticationType` と必要に応じて `applicationProtocol` を使用します。デフォルトのエンドポイント (`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`  
ドメイン設定の認証タイプ。詳細については、「[認証タイプの選択](protocols.md#connection-protocol-auth-mode)」を参照してください。

`application-protocol`  
デバイスが AWS IoT Coreとの通信に使用するアプリケーションプロトコル。詳細については、「[アプリケーションプロトコルの選択](protocols.md#protocol-selection)」を参照してください。

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

`defaultAuthorizerName`  
ドメイン構成のオーソライザー名。

詳細については、「*AWS IoT API リファレンス*」の「[CreateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateDomainConfiguration.html)」と「[UpdateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_UpdateDomainConfiguration.html)」を参照してください。ドメイン設定の詳細については、「[ドメイン設定](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable.html)」を参照してください。