Just in Time Provisioning

このセクションを進めるためには、3-3. CAの登録 の手順をあらかじめ実施してください。

デバイスが最初にAWS IoTに接続しようとしたときに、デバイスのプロビジョニングを行います。ジャストインタイムプロビジョニング(JITP)設定は、CA証明書に対して行います。自動登録を有効にし、プロビジョニングテンプレートを、デバイスのプロビジョニングに使用するデバイス証明書の署名に使用されるCA証明書に関連付けます。

image

このセクションでは、独自のCAを作成してAWS IoTに登録し、Just-in-time provisioning用のテンプレートを準備して、AWS IoTに接続するだけで新しいデバイスを登録できるようにします。

JITPの設定

CA用のディレクトリに移動します。

cd ~/CA

CAにプロビジョニングテンプレートをアタッチして、CAのJITPを有効にします。必要な証明書IDは、前のコマンドで環境変数に代入したものを利用します。JITPに必要なロールarnは、シェル変数$ARN_IOT_PROVISIONING_ROLEに格納されています

TB="{ \\\"Parameters\\\" : { \\\"AWS::IoT::Certificate::Id\\\" : { \\\"Type\\\" : \\\"String\\\" }, \\\"AWS::IoT::Certificate::CommonName\\\" : { \\\"Type\\\" : \\\"String\\\" }, \\\"AWS::IoT::Certificate::Country\\\" : { \\\"Type\\\" : \\\"String\\\" } }, \\\"Resources\\\" : { \\\"thing\\\" : { \\\"Type\\\" : \\\"AWS::IoT::Thing\\\", \\\"Properties\\\" : { \\\"ThingName\\\" : {\\\"Ref\\\" : \\\"AWS::IoT::Certificate::CommonName\\\"}, \\\"AttributePayload\\\" : { \\\"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\\\": \\\"$IOT_POLICY\\\" } } } }"
echo $TB

aws iot update-ca-certificate --certificate-id $CA_CERTIFICATE_ID \
  --no-remove-auto-registration \
  --new-auto-registration-status ENABLE \
  --registration-config "{\"templateBody\": \"$TB\",\"roleArn\": \"$ARN_IOT_PROVISIONING_ROLE\"}"

CA証明書に関する情報を取得し、プロビジョニングテンプレートが添付されていることを確認します。templateBody に先ほどのプロビジョニングテンプレートが登録されていることを確認できます。

aws iot describe-ca-certificate --certificate-id $CA_CERTIFICATE_ID

deviceJITPCertというデバイス証明書の名前を環境変数として登録します。

deviceCert=deviceJITPCert

鍵とCSRを作成します。

openssl req -nodes -new -newkey rsa:2048 \
            -keyout private/$deviceCert.key \
            -out csrs/$deviceCert.csr \
            -config iot-dm-ws-ssl.cnf

次に示すように、いくつかの情報の入力を求められます。 :のあとに表記がないものについては、そのままEnterを押して次に進みます。

Country Name (2 letter code) [JP]:
State or Province Name (full name) [Tokyo]:
Locality Name (eg, city) [Tokyo]:
Organization Name (eg, company) [IoT]:
Organizational Unit Name (eg, section) [Workshop]:
Common Name (eg, your name or your server's hostname) []:my-jitp-device
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

デバイス証明書を作成します。

openssl ca -in csrs/$deviceCert.csr \
           -out certs/$deviceCert.crt \
           -config iot-dm-ws-ssl.cnf

デバイス証明書とCA証明書を結合したファイルを作成します

クライアントは、TLS ハンドシェイクの一部として AWS IoT への初回接続を試みるときに、登録された CA 証明書と CA 証明書によって署名されたクライアント証明書の両方を含むファイルを提示する必要があります。 https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/auto-register-device-cert.html

cat certs/$deviceCert.crt cacert.pem > certs/${deviceCert}AndCACert.crt

AWS IoT Coreコンソールで、$aws/events/#をサブスクライブします`

image

メッセージをPublishしてデバイスを自動登録する

mosquitto_pub --cafile ~/root.ca.bundle.pem \
  --cert certs/${deviceCert}AndCACert.crt \
  --key private/$deviceCert.key \
  -h $IOT_ENDPOINT -p 8883 -q 1 -t  ji/tp \
  -i  $deviceCert --tls-version tlsv1.2 -m '{"let-me": "in"}' -d

コマンドは次のようなエラーメッセージを生成します。

Client [device_name] sending CONNECT
Error: The connection was lost.

デバイスの自動登録が開始されると、AWS IoTはクライアントを切断するため、これは正常な動作です。

デバイスがAWS IoT Coreコンソールまたはコマンドラインで作成されたかどうかを確認します。

aws iot list-things

AWS IoTコンソールでji/tpをサブスクライブして、上記のメッセージを再度パブリッシュします。これでデバイスがプロビジョニングされ、動作する準備ができました。

mosquitto_pub --cafile ~/root.ca.bundle.pem \
  --cert certs/${deviceCert}AndCACert.crt \
  --key private/$deviceCert.key \
  -h $IOT_ENDPOINT -p 8883 -q 1 -t  ji/tp -i $deviceCert \
  --tls-version tlsv1.2 -m '{"let-me": "in"}' -d