AWS IoT Core で JITP を使用するにはどうすればよいですか?

最終更新日: 2022 年 3 月 21 日

AWS IoT Core に登録されたカスタムルート認証局 (CA) を持つジャストインタイムプロビジョニング (JITP) 環境を設定したいと考えています。AWS IoT Core で JITP を設定するにはどうすればよいですか?

簡単な説明

AWS IoT Core で JITP 環境をセットアップするには、まず CA を AWS IoT Core に登録します。その後、CA にプロビジョニングテンプレートをアタッチします。

解決方法

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

自己署名ルート CA と検証証明書を作成する

1.    OpenSSL をインストールします (インストールしていない場合)。

2.    次の OpenSSL コマンドを実行して、デバイスルート CA プライベートキーを作成します。

$ openssl genrsa -out deviceRootCA.key 2048

3.    VIM テキストエディタを使用して、カスタム OpenSSL.conf ファイルを作成します。カスタム OpenSSL.conf ファイルを作成および編集するには、次の手順を実行します。
次の VIM コマンドを実行して、カスタム OpenSSL.conf ファイルを作成します。

$ vi deviceRootCA_openssl.conf

キーボードの i キーを押して、.conf ファイルを編集します。その後、次の内容をコピーしてファイルに貼り付けます。

[ req ]
distinguished_name       = req_distinguished_name
extensions               = v3_ca
req_extensions           = v3_ca

[ v3_ca ]
basicConstraints         = CA:TRUE

[ req_distinguished_name ]
countryName              = Country Name (2 letter code)
countryName_default      = IN
countryName_min          = 2
countryName_max          = 2
organizationName         = Organization Name (eg, company)
organizationName_default = AMZ

キーボードの esc を押してから :wq! で .conf ファイルを保存します。その後、Enter キーを押してファイルを終了します。
注: OpenSSL.conf ファイルが作成されたことを確認するには、次の Linux コマンドを実行します。

$ cat deviceRootCA_openssl.conf

4.    次の OpenSSL コマンドを実行して、デバイスルート CA 証明書署名リクエスト (CSR) を作成します。

$ openssl req -new -sha256 -key deviceRootCA.key -nodes -out deviceRootCA.csr -config deviceRootCA_openssl.conf

5.    次の OpenSSL コマンドを実行して、デバイスルート CA 証明書を作成します。

$ openssl x509 -req -days 3650 -extfile deviceRootCA_openssl.conf -extensions v3_ca -in deviceRootCA.csr -signkey deviceRootCA.key -out deviceRootCA.pem

6.    次の AWS CLI コマンドを実行して、JITP を使用する AWS リージョンの登録コードを取得します。

重要: us-east-2 を、JITP を使用するリージョンに置き換えてください。

$ aws iot get-registration-code --region us-east-2

7.    次の OpenSSL コマンドを実行して、検証キーを作成します。

$ openssl genrsa -out verificationCert.key 2048

8.    次の OpenSSL コマンドを実行して、検証証明書 CSR を作成します。

$ openssl req -new -key verificationCert.key -out verificationCert.csr

その後、[Common Name] (共通名) フィールドに [Registration Code] (登録コード) を入力します。例: 共通名 (サーバーの FQDN またはお客様の名前) []: xxxxxxxx8a33da。他のフィールドは空白のままにしておきます。

9.    次の OpenSSL コマンドを実行して、検証証明書を作成します。

$ openssl x509 -req -in verificationCert.csr -CA deviceRootCA.pem -CAkey deviceRootCA.key -CAcreateserial -out verificationCert.crt -days 500 -sha256

重要: AWS IoT Core によって認証される検証証明書には、ルート CA のリージョンの登録コードが必要です。

詳細については、「ジャストインタイムプロビジョニング」を参照してください。

JITP テンプレートを作成する

1.    AWS IoT Core サービス用の AWS Identity and Access Management (IAM) ロールを作成し、JITPRole という名前を付けます。手順については、「ログ記録ロールの作成」(ステップ 1 および 2) をご参照ください。

重要: 次の JITP テンプレートには、IAM ロールの Amazon リソースネーム (ARN) を含める必要があります。

2.    VIM テキストエディタを使用して、以下を実行して JITP テンプレート JSON ファイルを作成します。
次の VIM コマンドを実行して、JITP テンプレート JSON ファイルを作成します。

$ vi jitp_template.json

重要: テンプレートを jitp_template.json というファイル名で保存してください。
キーボードの i キーを押して、JITP テンプレートを編集します。その後、次の JITP テンプレートをコピーしてファイルに貼り付けます。

{
 "templateBody":"{ \"Parameters\" : { \"AWS::IoT::Certificate::CommonName\" : { \"Type\" : \"String\" },\"AWS::IoT::Certificate::Country\" : { \"Type\" : \"String\" }, \"AWS::IoT::Certificate::Id\" : { \"Type\" : \"String\" }}, \"Resources\" : { \"thing\" : { \"Type\" : \"AWS::IoT::Thing\", \"Properties\" : { \"ThingName\" : {\"Ref\" : \"AWS::IoT::Certificate::CommonName\"}, \"AttributePayload\" : { \"version\" : \"v1\", \"country\" : {\"Ref\" : \"AWS::IoT::Certificate::Country\"}} } }, \"certificate\" : { \"Type\" : \"AWS::IoT::Certificate\", \"Properties\" : { \"CertificateId\": {\"Ref\" : \"AWS::IoT::Certificate::Id\"}, \"Status\" : \"ACTIVE\" } }, \"policy\" : {\"Type\" : \"AWS::IoT::Policy\", \"Properties\" : { \"PolicyDocument\" : \"{ \\\"Version\\\": \\\"2012-10-17\\\", \\\"Statement\\\": [ { \\\"Effect\\\": \\\"Allow\\\", \\\"Action\\\": [ \\\"iot:Connect\\\" ], \\\"Resource\\\": [ \\\"arn:aws:iot:us-east-2:<ACCOUNT_ID>:client\\\/${iot:Connection.Thing.ThingName}\\\" ] }, { \\\"Effect\\\": \\\"Allow\\\", \\\"Action\\\": [ \\\"iot:Publish\\\", \\\"iot:Receive\\\" ], \\\"Resource\\\": [ \\\"arn:aws:iot:us-east-2:<ACCOUNT_ID>:topic\\\/${iot:Connection.Thing.ThingName}\\\/*\\\" ] }, { \\\"Effect\\\": \\\"Allow\\\", \\\"Action\\\": [ \\\"iot:Subscribe\\\" ], \\\"Resource\\\": [ \\\"arn:aws:iot:us-east-2:<ACCOUNT_ID>:topicfilter\\\/${iot:Connection.Thing.ThingName}\\\/*\\\" ] } ] }\" } } } }",
 "roleArn":"arn:aws:iam::<ACCOUNT_ID>:role/JITPRole"
}

重要: AWS IoT Core サービスの roleArn 値を IAM ロール ARN に置き換えます。<ACCOUNT_ID> 値を AWS アカウント ID に置き換えます。us-east-2 を、使用している AWS リージョンに置き換えます。キーボードの esc を押してから :wq! で JITP テンプレートを保存します。Enter を押してファイルを終了します。

注: 以下の IAM ポリシーは、サンプル JITP テンプレートに含まれています。

ポリシーリンクを表示するには、AWS アカウントにサインインする必要があります。詳細については、「プロビジョニングテンプレート」を参照してください。

AWS IoT Core に自己署名ルート CA 証明書を登録する

次の register-ca-certificate AWS CLI コマンドを実行して、デバイスルート CA を CA 証明書として AWS IoT Core で登録します。

重要: us-east-2 を、JITP を使用するリージョンに置き換えてください。

$ aws iot register-ca-certificate --ca-certificate file://deviceRootCA.pem --verification-cert file://verificationCert.crt --set-as-active --allow-auto-registration --registration-config file://jitp_template.json --region us-east-2

注: パラメータ --registration-config を追加すると、作成した JITP テンプレートが CA 証明書にアタッチされます。コマンドレスポンスは、CA 証明書の ARN を返します。

詳細については、「CA 証明書の登録」を参照してください。

デバイス証明書を作成し、JITP を実行する

重要: 元のデバイスルート CA ファイルを作成したディレクトリと同じディレクトリを使用してください。

1.    RootCA1 をダウンロードし、awsRootCA.pem というファイル名で保存します。
注: RootCA1 は、AWS IoT Core への発行リクエストのサーバー側認証に使用されます。詳細については、「サーバー認証用の CA 証明書」を参照してください。

2.    次の OpenSSL コマンドを実行して、デバイスプライベートキーを作成します。

$ openssl genrsa -out deviceCert.key 2048

3.    次の OpenSSL コマンドを実行して、デバイス CSR を作成します。

$ openssl req -new -key deviceCert.key -out deviceCert.csr

重要: サンプル JITP テンプレートでは、ThingName 値が証明書の CommonName 値と等しい必要があります。また、テンプレートでは、CountryName 値が CA 証明書の Country 値と同じである必要があります。例:

Country Name (two-letter code) []:IN
Common Name (eg. server FQDN or YOUR name) []: DemoThing

この記事で提供されている JITP テンプレートでは、AWS::IoT::Certificate::Country 証明書パラメータも使用しますが、これには値を追加する必要があります。その他の潜在的な証明書パラメータは次のとおりです。AWS::IoT::Certificate::Country AWS::IoT::Certificate::Organization AWS::IoT::Certificate::OrganizationalUnit AWS::IoT::Certificate::DistinguishedNameQualifier AWS::IoT::Certificate::StateName AWS::IoT::Certificate::CommonName AWS::IoT::Certificate::SerialNumber AWS::IoT::Certificate::Id

4.    次の OpenSSL コマンドを実行して、デバイス証明書を作成します。

$ openssl x509 -req -in deviceCert.csr -CA deviceRootCA.pem -CAkey deviceRootCA.key -CAcreateserial -out deviceCert.crt -days 365 -sha256

5.    次のコマンドを実行して、ルート CA 証明書とデバイス証明書を結合します。

$ cat deviceCert.crt deviceRootCA.pem > deviceCertAndCACert.crt

6.    Eclipse Mosquitto を使用して AWS IoT Core へのテスト発行呼び出しを行い、JITP プロセスを開始します。

注: AWS Device SDK を使用して AWS IoT Core への発行呼び出しを行うこともできます。

Eclipse Mosquitto テスト発行呼び出しコマンドの例

重要: コマンドを実行する前に、a27icbrpsxxx-ats.iot.us-east-2.amazonaws.com を独自のエンドポイントに置き換えてください。独自のエンドポイントを確認するには、AWS IoT Core コンソールを開きます。その後、[Settings] (設定) を選択します。エンドポイントが [Custom endpoint] (カスタムエンドポイント) ペインに表示されます。

$ mosquitto_pub --cafile awsRootCA.pem --cert deviceCertAndCACert.crt --key deviceCert.key -h a27icbrpsxxx-ats.iot.us-east-2.amazonaws.com -p 8883 -q 1 -t  foo/bar -i  anyclientID --tls-version tlsv1.2 -m "Hello" -d

Eclipse Mosquitto テスト発行呼び出しコマンドのレスポンスの例

Client anyclientID sending CONNECT  
  Error: The connection was lost. // The error is expected for the first connect call

注: 初回のテスト発行呼び出しは失敗します。AWS IoT Core がテスト発行呼び出しを受信すると、[Certificate] (証明書)、[Policy] (ポリシー)、および [Thing] (モノ) が作成されます。また、[Policy] (ポリシー) を [Certificate] (証明書) にアタッチし、[Certificate] (証明書) を [Thing] (モノ) にアタッチします。次回 JITP を実行するときは、最初に作成された IoT ポリシーが使用されます。新しい IoT ポリシーは作成されません。

7.    次の手順を実行して、必要なリソースが作成されたことを確認します。AWS IoT Core コンソールを開きます。[Manage] (管理) を選択します。[Things] (モノ) を選択します。 [DemoThing] を選択します。
証明書が作成され、[ACTIVE] (アクティブ) 状態であることを確認します。
その後、[Policies] (ポリシー) を選択し、IAM ポリシーがアタッチされていることを確認します。

一般的な操作でデバイス証明書を使用する

注: 発行コマンドに追加される [Client ID] (クライアント ID) の値は、JITP プロセス中に作成された [ThingName] と同じである必要があります。発行コマンドに追加する [Topic Name] (トピック名) は、ThingName/* の形式にも従う必要があります。次の発行呼び出しでは、deviceCertAndCACert.crt の代わりに deviceCert.crt を使用できます。

1.    AWS IoT Core コンソールを開きます。

2.    [Test] (テスト) を選択します。

3.    [Subscription Topic] (サブスクリプショントピック) に、DemoThing/test と入力します。

4.    次の Eclipse Mosquitto 発行呼び出しコマンドを AWS IoT Core に実行します。

重要: コマンドを実行する前に、a27icbrpsxxx-ats.iot.us-east-2.amazonaws.com を独自のエンドポイントに置き換えてください。独自のエンドポイントを確認するには、AWS IoT Core コンソールを開きます。その後、[Settings] (設定) を選択します。エンドポイントが [Custom endpoint] (カスタムエンドポイント) ペインに表示されます。また、カスタムルート CA によって生成されたカスタムデバイス証明書を使用してください。

$ mosquitto_pub --cafile awsRootCA.pem --cert deviceCert.crt --key deviceCert.key -h a27icbrpsxxx-ats.iot.us-east-2.amazonaws.com -p 8883 -q 1 -t  DemoThing/test -i  DemoThing --tls-version tlsv1.2 -m "Hello" -d

コマンドを実行した後、メッセージが AWS IoT Core Test コンソールで受信されたことがわかります。

追加のデバイス証明書を作成する

さらにデバイス証明書を作成して AWS IoT Core に登録するには、「デバイス証明書の作成と JITP の実行」セクションで説明されている手順を繰り返します。

その他の JITP テンプレート

証明書の CommonName フィールドから ThingName 値を取得し、ポリシーで管理者アクセス権限を提供するには、次の JITP テンプレートを使用します。

{
 "templateBody":"{ \"Parameters\" : { \"AWS::IoT::Certificate::CommonName\" : { \"Type\" : \"String\" },\"AWS::IoT::Certificate::Country\" : { \"Type\" : \"String\" }, \"AWS::IoT::Certificate::Id\" : { \"Type\" : \"String\" }}, \"Resources\" : { \"thing\" : { \"Type\" : \"AWS::IoT::Thing\", \"Properties\" : { \"ThingName\" : {\"Ref\" : \"AWS::IoT::Certificate::CommonName\"}, \"AttributePayload\" : { \"version\" : \"v1\", \"country\" : {\"Ref\" : \"AWS::IoT::Certificate::Country\"}} } }, \"certificate\" : { \"Type\" : \"AWS::IoT::Certificate\", \"Properties\" : { \"CertificateId\": {\"Ref\" : \"AWS::IoT::Certificate::Id\"}, \"Status\" : \"ACTIVE\" } }, \"policy\" : {\"Type\" : \"AWS::IoT::Policy\", \"Properties\" : { \"PolicyDocument\" : \"{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":[{\\\"Effect\\\":\\\"Allow\\\",\\\"Action\\\":\\\"iot:*\\\",\\\"Resource\\\":\\\"*\\\"}]}\" } } } }",
 "roleArn":"arn:aws:iam::<ACCOUNT_ID>:role/JITPRole"
}

証明書の CommonName フィールドから ThingName 値を取得し、定義済みのポリシー名を提供するには、次の JITP テンプレートを使用します。

{
 "templateBody":"{ \"Parameters\" : { \"AWS::IoT::Certificate::CommonName\" : { \"Type\" : \"String\" },\"AWS::IoT::Certificate::Country\" : { \"Type\" : \"String\" }, \"AWS::IoT::Certificate::Id\" : { \"Type\" : \"String\" }}, \"Resources\" : { \"thing\" : { \"Type\" : \"AWS::IoT::Thing\", \"Properties\" : { \"ThingName\" : {\"Ref\" : \"AWS::IoT::Certificate::CommonName\"}, \"AttributePayload\" : { \"version\" : \"v1\", \"country\" : {\"Ref\" : \"AWS::IoT::Certificate::Country\"}} } }, \"certificate\" : { \"Type\" : \"AWS::IoT::Certificate\", \"Properties\" : { \"CertificateId\": {\"Ref\" : \"AWS::IoT::Certificate::Id\"}, \"Status\" : \"ACTIVE\" } }, \"policy\" :  {\"Type\" : \"AWS::IoT::Policy\", \"Properties\" : { \"PolicyName\" :  \"Policy_Name\"} } } }",
 "roleArn":"arn:aws:iam::<ACCOUNT_ID>:role/JITPRole"
}

重要: Policy_Name は、選択したポリシー名に置き換えてください。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?