Just in Time Registration

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

デバイス証明書を使用してAWS IoTに初めて接続すると、サービスは登録されたCAによって署名された不明な証明書を検出し、デバイス証明書を自動登録します。 登録が成功すると、AWS IoTは予約済みMQTTトピックに登録メッセージを発行し、クライアントを切断します。

このMQTT登録イベントにより、添付されたAWS Lambdaルールエンジンアクションがトリガーされ、証明書のプロビジョニングが完了します。 これらの手順が完了すると、デバイス証明書はAWS IoTに接続して認証できるようになります。

この演習では、独自のCAとAWS Lambda関数を使用してJITRをセットアップします。 デバイスを作成するとき、lambda関数は証明書IDをThing-nameおよびPolicy-nameとして使用します。

image

JITPの設定削除

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

cd ~/CA

3-4. Just in Time Provisioning を行った場合にのみ行ってください。3-4 を行っていない方は、ジャストインタイム登録の有効化からはじめてください。

最初にCAからJITPを削除する必要があります。

aws iot update-ca-certificate --certificate-id $CA_CERTIFICATE_ID \
  --remove-auto-registration \
  --new-auto-registration-status DISABLE

プロビジョニングテンプレートがCAから削除されていることを確認します。

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

ジャストインタイム登録の有効化

ジャストインタイム登録(JITR)を有効にします。

aws iot update-ca-certificate --certificate-id $CA_CERTIFICATE_ID \
  --new-auto-registration-status ENABLE

自動登録ステータス(autoRegistrationStatus) がENABLEに設定されていることを確認します。

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

登録イベントの作成

Lambda関数を作成します。 Lambda関数の作成に必要なロールはすでに作成されており、環境変数$ARN_LAMBDA_ROLEにコピーされています

# change to the directory where the lambda is stored
cd ~/lambda

# create the lambda function
aws lambda create-function \
    --region $AWS_REGION \
    --function-name jitr-$NAME \
    --zip-file fileb://lambda_function.zip \
    --role $ARN_LAMBDA_ROLE \
    --handler lambda_function.lambda_handler \
    --runtime python3.7 \
    --timeout 30 \
    --memory-size 128

# verify that the lambda has been created
aws lambda list-functions

IoTトピックルールを作成します。 このルールでは、デバイス証明書が自動登録されるときに、先ほど作成したLambda関数が呼び出されます

# to create the topic rule we need to have the arn of the Lambda function
# Store the Lambda function arn in a shell variable
ARN_LAMBDA=$(aws lambda get-function --function-name jitr-$NAME | jq -r '.Configuration.FunctionArn')

# verify the variable content
echo $ARN_LAMBDA

# create the IoT topic rule
aws iot create-topic-rule --rule-name JITRRule_$NAME \
  --topic-rule-payload "{
    \"sql\": \"SELECT * FROM '\$aws/events/certificates/registered/#' WHERE certificateStatus = \\\"PENDING_ACTIVATION\\\"\",
    \"description\": \"Rule for JITR\",
    \"actions\": [
            {
                \"lambda\": {
                    \"functionArn\": \"$ARN_LAMBDA\"
                }
            }
        ]
     }"

トピックルールが作成されたことを確認する

aws iot get-topic-rule --rule-name JITRRule_$NAME

AWS IoTが関数を呼び出すことができるように、ラムダにアクセス許可を追加します。 権限を追加するには、トピックルールarnが必要であり、それをシェル変数に格納します

# get you AWS account id
ACCOUNT_ID=$(aws sts get-caller-identity | jq -r '.Account')

# verify that the variable has been set
echo $ACCOUNT_ID

# store topic rule arn
ARN_TOPIC_RULE=$(aws iot get-topic-rule --rule-name JITRRule_$NAME | jq -r '.ruleArn')

# verify that the variable has been set
echo $ARN_TOPIC_RULE

# add permissions to the Lambda
aws lambda add-permission --function-name jitr-$NAME \
  --region $AWS_REGION --principal iot.amazonaws.com \
  --source-arn $ARN_TOPIC_RULE --source-account $ACCOUNT_ID \
  --statement-id Id-123 --action "lambda:InvokeFunction"

# verify the permissions of the function
aws lambda get-policy --function-name jitr-$NAME

JITPの場合と同じ方法でデバイス証明書を作成しますが、deviceCertには別の名前を使用します

certsディレクトリに移動します

cd ~/CA

デバイス証明書に名前をつけます。

deviceCert=deviceJITRCert

このワークショップのJITPセクションで行ったように、Thing Keyと証明書を作成し、AWS IoTに接続します。

AWS IoTに接続してJITRプロセスを開始する

鍵と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-jitr-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

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

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

メッセージを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/tr \
  -i  $deviceCert --tls-version tlsv1.2 -m '{"let-me": "in"}' -d

JITRが成功したかどうかを確認するには、次のことを行う必要があります。

デバイスのレジストリに jitr- から始まる名前のモノが作成されていることを確認します

aws iot list-things
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/tr -i $deviceCert \
  --tls-version tlsv1.2 -m '{"let-me": "in"}' -d