AWS IoT コアで JITP を使用する方法を教えてください。

所要時間6分
0

AWS IoT Core に登録されたカスタムルート認証局 (CA) を持つジャストインタイムプロビジョニング (JITP) 環境を設定したいです。

簡単な説明

AWS IoT Core を使用して JITP 環境をセットアップするには、まず AWS IoT Core に CA 証明書を登録します。次に、プロビジョニングテンプレートを CA にアタッチします。

解決策

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

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

前提条件:

OpenSSL をインストールします。

自己署名ルート CA と検証証明書を作成するには、次の操作を行います。

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

    $ openssl genrsa -out deviceRootCA.key 2048
  2. VIM テキストエディタを開き、カスタム OpenSSL.conf ファイルを作成します。VIM テキストエディタの詳細については、Vim Tips Wiki のウェブサイトで「チュートリアル」を参照してください。

  3. カスタム OpenSSL.conf ファイルを作成するには、次の VIM コマンドを実行します。

    $ vi deviceRootCA_openssl.conf
  4. .conf ファイルを編集するために、キーボードの i キーを押します。次に、以下をコピーしてファイルに貼り付けます。

    [ 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 (e.g., company)
    organizationName_default = AMZ
  5. .conf ファイルを保存するには、キーボードの Esc キーを押してから、:wq! キーを押します。ファイルを閉じるには、Enter キーを押します。

  6. OpenSSL.conf ファイルが作成されたことを確認するには、次の Linux コマンドを実行します。

    $ cat deviceRootCA_openssl.conf
  7. デバイスルート CA 証明書署名要求 (CSR) を作成します。次の OpenSSL コマンドを実行します。

    $ openssl req -new -sha256 -key deviceRootCA.key -nodes -out deviceRootCA.csr -config deviceRootCA_openssl.conf
  8. デバイスルート CA 証明書を作成します。次の OpenSSL コマンドを実行します。

    $ openssl x509 -req -days 3650 -extfile deviceRootCA_openssl.conf -extensions v3_ca -in deviceRootCA.csr -signkey deviceRootCA.key -out deviceRootCA.pem
  9. JITP を使用する AWS リージョンの登録コードを取得します。その後、次の AWS CLI コマンドを実行します。

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

    注: us-east-2 は、JITP を使用するリージョンに置き換えます。

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

$ openssl genrsa -out verificationCert.key 2048
  1. 検証証明書の CSR を作成します。次の OpenSSL コマンドを実行します。
$ openssl req -new -key verificationCert.key -out verificationCert.csr

次に、[共通名] フィールドに登録コードを入力します。例: 共通名 (サーバーの FQDN または独自の名前) []: xxxxxxxx8a33da

他のフィールドは空白のままにします。

  1. 検証証明書を作成します。次の 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 という名前をつけます。手順については、「ログ記録ロールを作成する」を参照してください。

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

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

  3. JITP テンプレートの JSON ファイルを作成します。次の VIM コマンドを実行します。

    $ vi jitp_template.json

    注: テンプレートは必ず jitp_template.json というファイル名で保存してください。

  4. JITP テンプレートを編集するために、キーボードの i キーを押します。その後、次の 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"
    }

    注: roleArn 値は、お使いの AWS IoT Core サービスの IAM ロール ARN に置き換えます。値を AWS アカウント ID に置き換えます。us-east-2 は、お使いの AWS リージョンに置き換えます。

  5. JITP テンプレートファイルを保存するには、キーボードの Esc キーを押してから :wq! を押します。。

  6. **Enter ** を選択してファイルを閉じます。

注: JITP テンプレートの例には、次の IAM ポリシーが含まれています。

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

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

  1. デバイスルート CA を AWS IoT Core の CA 証明書として登録します。

  2. 次の AWS CLI コマンド register-ca-certificate を実行します。

    $ 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

    注: us-east-2 は、JITP を使用するリージョンに置き換えます。

注: --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. CSR デバイスを作成します。次の OpenSSL コマンドを実行します。

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

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

    Country Name (two-letter code) []:IN
    Common Name (e.g. 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 コンソールを開きます。次に、[設定] を選択します。エンドポイントが [カスタムエンドポイント] ペインに表示されます。

    $ 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 はテスト公開呼び出しを受け取ると、証明書、ポリシー、Thing を作成します。さらに、ポリシー証明書にアタッチした後、その証明書Thing にアタッチします。次回 JITP を実行するときには、最初に作成した AWS IoT Core ポリシーを使用します。新しい AWS IoT Core ポリシーは作成されません。

  7. 以下を実行して、必要なリソースが作成されたことを確認します。
    AWS IoT Core コンソールを開きます。
    [管理] を選択します。
    [Things] を選択します。
    [DemoThing] を選択します。

  8. 証明書が作成され、ACTIVE 状態であることを確認します。次に、[ポリシー] を選択し、IAM ポリシーがアタッチされていることを確認します。

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

注: パブリッシュコマンドに追加される クライアント ID の値は、JITP プロセス中に作成された ThingName と一致する必要があります。パブリッシュコマンドに追加されるトピック名も、ThingName/* の形式に従う必要があります。次回のパブリッシュ呼び出しでは、deviceCertAndCACert.crt ではなく、deviceCert.crt を使用できます。

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

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

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

  4. 次の Eclipse Mosquitto パブリッシュ呼び出しコマンドを AWS IoT Core に対して実行します。

    重要: コマンドを実行する前に、a27icbrpsxxx-ats.iot.us-east-2.amazonaws.com を独自のエンドポイントに置き換えます。独自のエンドポイントを確認するには、AWS IoT Core コンソールを開きます。次に、[設定] を選択します。エンドポイントが [カスタムエンドポイント] ペインに表示されます。カスタムルート 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 テストコンソールに受信されます。

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

デバイス証明書をさらに作成して 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 は、使用するポリシーの名前に置き換えます。

コメントはありません

関連するコンテンツ