AWS IoTでデバイス証明書のジャストインタイム登録をやってみた

2020.03.31

Just-in-Time Registration(JITR)は、AWS IoTへ初回接続時にデバイス証明書を自動で登録する機能です。自前のデバイス証明書を使用することで証明書の管理がしやすく、証明書の登録が自動化されることによって運用コストを削減できます。

この投稿では、デバイス証明書の作成からジャストインタイム登録について説明します。

デバイス証明書の作成

AWS IoTにはデバイス証明書を作成する3つの方法が用意されています。ジャストインタイム登録では自前のデバイス証明書を使用します。デバイス証明書の作成方法について説明します。

デバイス証明書の作成

CA証明書を登録

デバイス証明書はAWS IoTに登録済みのCA証明書で署名されている必要があります。CA証明書はOpenSSLコマンドで作成できます。次のコマンドでCA証明書の作成と登録を実行します。

# キーペアを生成
openssl genrsa -out rootCA.key 2048

# CA証明書を生成
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem

# AWS IoTから登録コードを取得
aws iot get-registration-code

# プライベートキー検証証明書のキーペアを生成
openssl genrsa -out verificationCert.key 2048

# プライベートキー検証証明書のCSRを作成
# CommonNameには登録コードを入力
openssl req -new -key verificationCert.key -out verificationCert.csr

# プライベートキー検証証明書を作成
openssl x509 -req -in verificationCert.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out verificationCert.pem -days 500 -sha256

# AWS IoTにCA証明書を登録
aws iot register-ca-certificate --ca-certificate file://rootCA.pem --verification-cert file://verificationCert.pem

デバイス証明書の自動登録を有効化

AWS IoTにCA証明書を登録するとCertificateIdを取得できます。次のコマンドでCA証明書とデバイス証明書の有効化を実行します。

# CA証明書を有効化
aws iot update-ca-certificate --certificate-id <caCertificateID> --new-status ACTIVE

# デバイス証明書の自動登録を有効化
aws iot update-ca-certificate --certificate-id <caCertificateID> --new-auto-registration-status ENABLE

デバイス証明書を作成

先ほどのCA証明書を使用してデバイス証明書を作成します。

# キーペアを生成
openssl genrsa -out deviceCert.key 2048

# デバイス証明書のCSRを作成
openssl req -new -key deviceCert.key -out deviceCert.csr

# デバイス証明書を作成
openssl x509 -req -in deviceCert.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out deviceCert.pem -days 500 -sha256

ジャストインタイム登録

本題のジャストインタイム登録について説明します。AWS IoTへ初回接続時にデバイス証明書を自動登録するには、AWS IoTに登録されたCA証明書とCA証明書で署名されたデバイス証明書を含むファイルが必要です。

CA証明書とデバイス証明書を結合

CA証明書で署名されたデバイス証明書は上の手順で作成していますので、次のコマンドでCA証明書とデバイス証明書を結合したファイルを作成します。

cat deviceCert.pem rootCA.pem > deviceCertAndCACert.crt

AWS IoTに接続する際には、CA証明書とデバイス証明書を結合したdeviceCertAndCACert.crtを使用します。初回接続時にはデバイス証明書が自動で登録され、PENDING_ACTIVATIONの状態になります。

デバイス証明書のアクティベーション

ジャストインタイム登録後は、AWS IoTに接続するためにデバイス証明書のアクティベーションが必要です。具体的には証明書にポリシーやモノをアタッチして、ステータスをACTIVEに変更することになります。

ジャストインタイム登録

AWSのコンソールから手動で実施するのは大変なので、AWS IoTルールで自動化します。AWS IoTはデバイス証明書が自動で登録されると、次のMQTTトピックにメッセージをパブリッシュします。

$aws/events/certificates/registered/<caCertificateID>
{
  "certificateId": "certificateID",
  "caCertificateId": "caCertificateId",
  "timestamp": timestamp,
  "certificateStatus": "PENDING_ACTIVATION",
  "awsAccountId": "awsAccountId",
  "certificateRegistrationTimestamp": "certificateRegistrationTimestamp"
}

このメッセージをLambdaで受け取り、アクティベーションを実行します。

Lambda関数を作成

AWSのサンプルコードを参考にLambda関数を実装します。

IoTルールを作成

次のルールクエリステートメントでIoTルールを作成して、アクションにLambda関数を設定します。

SELECT * FROM '$aws/events/certificates/registered/<caCertificateID>'

デバイス証明書のジャストインタイム登録を実行

AWS IoTへ接続する際のエンドポイントをAWS IoTの設定画面から取得します。

AWS IoTのエンドポイント

AWS IoTのルートCA証明書を取得します。ファイル名はroot.certとして保存します。

MosquittoというMQTT Brokerを使用して、実際にAWS IoTへ接続をしてみます。

mosquitto_pub --cafile root.cert --cert deviceCertAndCACert.crt --key deviceCert.key -h <AWS IoT Endpoint> -p 8883 -q 1 -t foo/bar -i anyclientID --tls-version tlsv1.2 -m "Hello" -d

ポリシー反映前なのでパブリッシュには失敗しますが、AWS IoTの証明書画面でデバイス証明書を確認できれば成功です。

デバイス証明書

まとめ

このようにジャストインタイム登録を活用することで、デバイスに対して証明書の作成と登録を効率よく実装することができました。アクティベーションのLambda関数では、デバイス証明書ごとにポリシーを作成していますが、ポリシー変数を使用したポリシー管理の効率化もできそうです。

参考資料