AWS IoTでデバイス証明書のジャストインタイム登録をやってみた
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のルート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関数では、デバイス証明書ごとにポリシーを作成していますが、ポリシー変数を使用したポリシー管理の効率化もできそうです。