AWS IoT Core 証明書プロバイダーを使用したセルフマネージド証明書の署名
AWS IoT フリートプロビジョニングで証明書署名リクエスト (CSR) に署名する AWS IoT Core 証明書プロバイダーを作成できます。証明書プロバイダーは、Lambda 関数とCreateCertificateFromCsrフリートプロビジョニング の MQTT API を参照します。Lambda 関数は CSR を受け入れ、署名付きクライアント証明書を返します。
AWS アカウント に証明書プロバイダーがない場合、CreateCertificateFromCsr MQTT API はフリートプロビジョニングで呼び出され、CSR から証明書を生成します。証明書プロバイダーを作成すると、CreateCertificateFromCsr MQTT API の動作が変更され、この MQTT API へのすべての呼び出しは証明書プロバイダーを呼び出して証明書を発行します。
AWS IoT Core 証明書プロバイダーを使用すると、AWS Private CA などのプライベート認証機関 (CA)、他のパブリックに信頼された CA、または独自のパブリックキーインフラストラクチャ (PKI) を使用して CSR に署名するソリューションを実装できます。さらに、証明書プロバイダーを使用して、有効期間、署名アルゴリズム、発行者、拡張機能などのクライアント証明書のフィールドをカスタマイズできます。
重要
作成できる証明書プロバイダーは、AWS アカウント ごとに 1 つだけです。署名動作の変更は、AWS アカウント から証明書プロバイダーを削除するまで CreateCertificateFromCsr MQTT API を呼び出すフリート全体に適用されます。
このトピックの内容
フリートプロビジョニングでのセルフマネージド証明書署名の仕組み
主要なコンセプト
以下の概念は、AWS IoT フリートプロビジョニングでのセルフマネージド証明書署名の仕組みを理解するのに役立つ詳細を提供します。詳細については、「フリートプロビジョニングを使用したデバイス証明書がないデバイスのプロビジョニング」を参照してください。
- AWS IoT フリートプロビジョニング
-
AWS IoT フリートプロビジョニング (フリートプロビジョニング略) を使用することで、AWS IoT Core は、初めて AWS IoT Core に接続するときにデバイス証明書をデバイスに安全に配信できます。フリートプロビジョニングを使用して、デバイス証明書のないデバイスを AWS IoT Core に接続できます。
- 証明書署名リクエスト (CSR)
-
フリートプロビジョニングの過程で、デバイスはフリートプロビジョニング MQTT API を介して AWS IoT Core にリクエストします。このリクエストには、クライアント証明書を作成するために署名される証明書署名リクエスト (CSR) が含まれます。
- AWS フリートプロビジョニングでのマネージド証明書署名
-
AWS マネージドは、フリートプロビジョニングでの証明書署名のデフォルト設定です。AWS マネージド証明書の署名では、AWS IoT Core は独自の CA を使用して CSR に署名します。
- フリートプロビジョニングでのセルフマネージド証明書署名
-
セルフマネージドは、フリートプロビジョニングで証明書に署名するためのもう 1 つのオプションです。セルフマネージド証明書署名では、CSR に署名するための AWS IoT Core 証明書プロバイダーを作成します。セルフマネージド証明書署名を使用して、AWS プライベート CA、その他のパブリックに信頼された CA、または独自のパブリックキーインフラストラクチャ (PKI) によって生成された CA を使用して CSR に署名できます。
- AWS IoT Core 証明書プロバイダー
-
AWS IoT Core 証明書プロバイダー (証明書プロバイダーの略) は、フリートプロビジョニングでのセルフマネージド証明書署名に使用されるカスタマーマネージドリソースです。
図
次の図は、AWS IoT フリートプロビジョニングでの自己証明書署名の仕組みを簡略化したものです。
-
新しい IoT デバイスが製造またはフリートに導入された場合、AWS IoT Core で自己認証するにはクライアント証明書が必要です。
-
フリートプロビジョニングプロセスの一環として、デバイスはフリートプロビジョニング MQTT API を通じてクライアント証明書の AWS IoT Core にリクエストを行います。このリクエストには、証明書署名リクエスト (CSR) が含まれます。
-
AWS IoT Core は証明書プロバイダーを呼び出し、CSR を入力としてプロバイダーに渡します。
-
証明書プロバイダーは CSR を入力として受け取り、クライアント証明書を発行します。
AWS マネージド証明書署名の場合、AWS IoT Core は独自の CA を使用して CSR に署名し、クライアント証明書を発行します。
-
発行されたクライアント証明書により、デバイスはフリートのプロビジョニングを継続し、AWS IoT Core との安全な接続を確立します。
証明書プロバイダーの Lambda 関数入力
AWS IoT Core は、デバイスを登録するときに、次のオブジェクトを Lambda 関数に送信します。certificateSigningRequest の値は、CreateCertificateFromCsr リクエストで提供されるプライバシー強化メール (PEM) 形式の CSR です。principalId は、CreateCertificateFromCsr リクエストの実行時に AWS IoT Core に接続するために使用されるプリンシパルの ID です。clientId は MQTT 接続に設定されたクライアント ID です。
{ "certificateSigningRequest": "string", "principalId": "string", "clientId": "string" }
証明書プロバイダーの Lambda 関数の戻り値
Lambda 関数は、certificatePem 値を含むレスポンスを返す必要があります。以下は、成功したレスポンスの例です。AWS IoT Core は戻り値 (certificatePem) を使用して証明書を作成します。
{ "certificatePem": "string" }
登録が成功すると、CreateCertificateFromCsr は CreateCertificateFromCsr レスポンスで同じ certificatePem を返します。詳細については、CreateCertificateFromCsr のレスポンスペイロードの例を参照してください。
Lambda 関数の例
証明書プロバイダーを作成する前に、CSR に署名するための Lambda 関数を作成する必要があります。次のコードは、Python での Lambda 関数の例です。この関数は AWS Private CA を呼び出して、プライベート CA と SHA256WITHRSA 署名アルゴリズムを使用して入力 CSR に署名します。返されたクライアント証明書は 1 年間有効です。AWS Private CA およびプライベート CA の作成方法の詳細については、「AWS プライベート CA とは」および「プライベート CA の作成」を参照してください。
import os import time import uuid import boto3 def lambda_handler(event, context): ca_arn = os.environ['CA_ARN'] csr = (event['certificateSigningRequest']).encode('utf-8') acmpca = boto3.client('acm-pca') cert_arn = acmpca.issue_certificate( CertificateAuthorityArn=ca_arn, Csr=csr, Validity={"Type": "DAYS", "Value": 365}, SigningAlgorithm='SHA256WITHRSA', IdempotencyToken=str(uuid.uuid4()) )['CertificateArn'] # Wait for certificate to be issued time.sleep(1) cert_pem = acmpca.get_certificate( CertificateAuthorityArn=ca_arn, CertificateArn=cert_arn )['Certificate'] return { 'certificatePem': cert_pem }
重要
-
Lambda 関数によって返される証明書には、証明書署名リクエスト (CSR) と同じサブジェクト名とパブリックキーが必要です。
-
Lambda 関数の実行は 5 秒で完了する必要があります。
-
Lambda 関数は、証明書プロバイダーリソースと同じ AWS アカウント および リージョンにある必要があります。
-
AWS IoT サービスプリンシパルには、Lambda 関数への呼び出しアクセス許可を付与する必要があります。混乱した代理問題を回避するため、 呼び出しアクセス許可には
sourceArnとsourceAccountを設定することをお勧めします。詳細については、クロスサービスでの混乱した代理処理を防止するを参照してください。
Lambda の次のリソースベースのポリシー例では、Lambda 関数を呼び出すアクセス許可を AWS IoT に付与します。
フリートプロビジョニング用のセルフマネージド証明書署名
AWS CLI または AWS マネジメントコンソール を使用して、フリートプロビジョニング用のセルフマネージド証明書署名を選択できます。
セルフマネージド証明書署名を選択するには、フリートプロビジョニングで CSR に署名する AWS IoT Core 証明書プロバイダーを作成する必要があります。AWS IoT Core は証明書プロバイダーを呼び出し、CSR を入力として受け取り、クライアント証明書を返します。証明書プロバイダーを作成するには、CreateCertificateProvider API オペレーションまたは create-certificate-provider CLI コマンドを使用します。
注記
証明書プロバイダーを作成すると、CreateCertificateFromCsrフリートプロビジョニング用の API の動作が変更され、CreateCertificateFromCsr へのすべての呼び出しが証明書プロバイダーを呼び出して証明書を作成します。この動作は、証明書プロバイダーの作成後に変更されるまでに数分かかる場合があります。
aws iot create-certificate-provider \ --certificateProviderNamemy-certificate-provider\ --lambdaFunctionArnarn:aws:lambda:us-east-1:123456789012:function:my-function-1\ --accountDefaultForOperations CreateCertificateFromCsr
次は、このコマンドの出力の例を示しています。
{ "certificateProviderName": "my-certificate-provider", "certificateProviderArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider:my-certificate-provider" }
詳細については、「AWS IoT API リファレンス」の「CreateCertificateProvider」を参照してください。
AWS マネジメントコンソール を使用してセルフマネージド証明書署名を選択するには、次の手順に従います。
-
[AWS IoT コンソール]
に移動します。 -
左のナビゲーションペインの [セキュリティ] で、[証明書] を選択します。
-
[証明書署名] ページで、[証明書署名の詳細] で [証明書署名方法の編集] を選択します。
-
[証明書署名方法の編集] ページで、[証明書署名方法] で [セルフマネージド] を選択します。
-
[セルフマネージド設定] セクションで、証明書プロバイダーの名前を入力し、Lambda 関数を作成または選択します。
-
[証明書署名を更新] を選択します。
証明書プロバイダーの AWS CLI コマンド
証明書プロバイダーを作成する
証明書プロバイダーを作成するには、CreateCertificateProvider API オペレーションまたは create-certificate-provider CLI コマンドを使用します。
注記
証明書プロバイダーを作成すると、CreateCertificateFromCsrフリートプロビジョニング用の API の動作が変更され、CreateCertificateFromCsr へのすべての呼び出しが証明書プロバイダーを呼び出して証明書を作成します。この動作は、証明書プロバイダーの作成後に変更されるまでに数分かかる場合があります。
aws iot create-certificate-provider \ --certificateProviderNamemy-certificate-provider\ --lambdaFunctionArnarn:aws:lambda:us-east-1:123456789012:function:my-function-1\ --accountDefaultForOperations CreateCertificateFromCsr
次は、このコマンドの出力の例を示しています。
{ "certificateProviderName": "my-certificate-provider", "certificateProviderArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider:my-certificate-provider" }
詳細については、「AWS IoT API リファレンス」の「CreateCertificateProvider」を参照してください。
証明書プロバイダーを更新する
証明書プロバイダーを更新するには、UpdateCertificateProvider API オペレーションまたは update-certificate-provider CLI コマンドを使用します。
aws iot update-certificate-provider \ --certificateProviderNamemy-certificate-provider\ --lambdaFunctionArnarn:aws:lambda:us-east-1:123456789012:function:my-function-2\ --accountDefaultForOperations CreateCertificateFromCsr
次は、このコマンドの出力の例を示しています。
{ "certificateProviderName": "my-certificate-provider", "certificateProviderArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider:my-certificate-provider" }
詳細については、「AWS IoT API リファレンス」の「UpdateCertificateProvider」を参照してください。
証明書プロバイダーを記述する
証明書プロバイダーを記述するには、DescribeCertificateProvider API オペレーションまたは describe-certificate-provider CLI コマンドを使用します。
aws iot describe-certificate-provider --certificateProviderNamemy-certificate-provider
次は、このコマンドの出力の例を示しています。
{ "certificateProviderName": "my-certificate-provider", "lambdaFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function", "accountDefaultForOperations": [ "CreateCertificateFromCsr" ], "creationDate": "2022-11-03T00:15", "lastModifiedDate": "2022-11-18T00:15" }
詳細については、「AWS IoT API リファレンス」の「DescribeCertificateProvider」を参照してください。
証明書プロバイダーを削除する
証明書プロバイダーを削除するには、DeleteCertificateProvider API オペレーションまたは delete-certificate-provider CLI コマンドを使用します。証明書プロバイダーリソースを削除すると、CreateCertificateFromCsr の動作が再開され、AWS IoT は CSR からの AWS IoT によって署名された証明書を作成します。
aws iot delete-certificate-provider --certificateProviderNamemy-certificate-provider
このコマンドでは、出力が生成されません。
詳細については、「AWS IoT API リファレンス」の「DeleteCertificateProvider」を参照してください。
証明書プロバイダーを一覧表示する
AWS アカウント 内の証明書プロバイダーを一覧表示するには、ListCertificateProviders API オペレーションまたは list-certificate-providers CLI コマンドを使用します。
aws iot list-certificate-providers
次は、このコマンドの出力の例を示しています。
{ "certificateProviders": [ { "certificateProviderName": "my-certificate-provider", "certificateProviderArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider:my-certificate-provider" } ] }
詳細については、「AWS IoT API リファレンス」の「ListCertificateProvider」を参照してください。