(復旧できました)AWS IoTで作成した証明書を誤って削除して復旧を試みた話

(復旧できました) AWS IoTで作成した証明書を誤って 削除して復旧を試みた話サムネイル

誤ってAWSIoTで作成した証明書を削除してしまいました。事前にローカルにバックアップとして証明書をダウンロードしておいたのでこれを再度AWSIoTCoreに取り込んで復旧できないかを調査したので記事にします。

本記事は初版を2022年12月に記載しましたが、結果が変わったので2024年7月にリライトしています。

結果的にインポートすることができました!

目次

結論 再度IoTCoreに証明書をインポートできなかった できました!

残念ながらAWSIoTCoreで作成した証明書はダウンロードしたとしてもインポート機能は使えないです。

AWS IoTCoreで作成した証明証明書をダウンロードした場合、CLI(aws iot register-certificate-without-ca)でインポートすることによりインポートできました。(本記事の読者様より情報提供いただきました。誠にありがとうございました!)

注意点

AWS CLIコマンドによるクライアント証明書登録コマンドは2つあります。1つはAWS外部の証明機関(CA)より入手した証明書、もう一つは証明機関(CA)を持たない証明書を登録するコマンドです。

手順再現 再度IoTCoreに証明書をインポートする

証明書インポートを再現する以下に手順を説明します。

STEP1 AWS IoTで証明書作成

SDKやCLIから作成してもよいですし、マネジメントコンソールから作成することもできます。

今回の検証対象は外部からインポートした証明書ではなくAWS IoTが発行した証明書です。

マネジメントコンソールで証明祖を発行する画面
マネジメントコンソールでのIoT証明書発行

その際、デフォルトになっている[新しい証明書の自動生成 (推奨)]を選択します。

新しい証明書の自動生成 (推奨)

STEP2 バックアップのために作成した証明書をダウンロード

コンソールにダウンロードボタンがあるのでローカルにダウンロードしておきます。「.pem.crt」のファイルが落ちてきます。

IoTの証明書をダウンロードする画面
証明書のダウンロード

STEP3 AWS IoTから証明書を削除

コンソールから削除してみます。削除前に「無効化」を押下して無効化します。

無効化しないと削除を押せないようになっています。

証明書を削除する画面
図3 証明書削除(削除前に無効化)

STEP4 バックアップした証明書をAWS IoTにインポートを試行

成功パターン register-certificate-without-ca を使用する場合

リライト時に本節を記載しているため、証明書IDが変わっています。

CLIでregister-certificate-without-caを使います。

aws iot register-certificate-without-ca --certificate-pem file://654d8153d214469440e63eaaf2f3ee26b2588413f29460bef75170230ccc9d02-certificate.pem.crt

実行すると以下のように成功レスポンスが返却されます。

{
    "certificateArn": "arn:aws:iot:ap-northeast-1:123456789012:cert/654d8153d214469440e63eaaf2f3ee26b2588413f29460bef75170230ccc9d02",
    "certificateId": "654d8153d214469440e63eaaf2f3ee26b2588413f29460bef75170230ccc9d02"
}

マネジメントコンソールで確認したところ、ちゃんと取り込めています。

念のため、取り込み前後で比較してみました。コンソール上は違いが無さそうだったのでdescribe-certificateコマンドを使って取り込み前後を比較してみました。

登録日、生成日、更新日が更新されているのは問題ないとして、1点certificateModeが変更されていることが気になります。

certificateModeがDEFAULTからSNI_ONLYに変更されていました。

この差分はregister-certificate-without-caを使用したことによりAWS IoTで証明されたという情報が欠けたのだと思われます。register-certificate-without-caのリファレンスによると以下の通り。

Register a certificate that does not have a certificate authority (CA). For supported certificates, consult Certificate signing algorithms supported by IoT .

↓日本語訳

証明機関 (CA) を持たない証明書を登録します。サポートされている証明書については、IoT でサポートされている証明書署名アルゴリズムを参照してください。

register-certificate-without-caリファレンス

certificateModeについてはdescribe-certificateのリファレンスに以下説明があります。

DEFAULT : A certificate in DEFAULT mode is either generated by Amazon Web Services IoT Core or registered with an issuer certificate authority (CA) in DEFAULT mode. Devices with certificates in DEFAULT mode aren’t required to send the Server Name Indication (SNI) extension when connecting to Amazon Web Services IoT Core. However, to use features such as custom domains and VPC endpoints, we recommend that you use the SNI extension when connecting to Amazon Web Services IoT Core.

SNI_ONLY : A certificate in SNI_ONLY mode is registered without an issuer CA. Devices with certificates in SNI_ONLY mode must send the SNI extension when connecting to Amazon Web Services IoT Core.

↓日本語訳

DEFAULT: モードの証明書は、DEFAULTAmazon Web Services IoT Core によって生成されるか、DEFAULTモードで発行者の証明機関 (CA) に登録されます。DEFAULTモードの証明書を持つデバイスは、Amazon Web Services IoT Core に接続するときに Server Name Indication (SNI) 拡張機能を送信する必要はありません。ただし、カスタム ドメインや VPC エンドポイントなどの機能を使用するには、Amazon Web Services IoT Core に接続するときに SNI 拡張機能を使用することをお勧めします。

SNI_ONLY:SNI_ONLYモードの証明書は発行元 CA なしで登録されています。SNI_ONLYモードの証明書を持つデバイスは、Amazon Web Services IoT Core に接続するときに SNI 拡張を送信する必要があります。

describe-certificateリファレンス

取り込み後の証明書を利用するには「Amazon Web Services IoT Core に接続するときに SNI 拡張を送信する必要があります。」とのことです。

失敗パターン register-certificate を使用する場合

AWSCLIを使ってみます。こちらのコマンドを使います。
register-certificate

aws iot register-certificate --certificate-pem file://1bc689578436a69681542be88a1186ad92fd2f7eb88cfddac1ac0d07d7405114-certificate.pem.crt --ca-certificate-pem file://AmazonRootCA1.pem --no-verify


実行するとこんな実行結果になります。エラーになり、取り込めませんでした。

urllib3\connectionpool.py:1045: InsecureRequestWarning: Unverified HTTPS request is being made to host 'iot.ap-northeast-1.amazonaws.com'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
An error occurred (CertificateStateException) when calling the RegisterCertificate operation: No CA certificate exists for the given certificate

register-certificateのエラー結果についてAWSに問い合わせてみた。

CLIのリファレンスを確認しましたが、実行方法は間違っていなさそうです。何がダメなのさっぱりわからなかったのでサポートに泣きつきました。

  • バックアップでダウンロードした証明書を削除後再び取り込む方法はないのか。
  • 実行したCLIコマンドregister-certificateの使い方はあっているのか
について確認してみました。

以下のような回答をいただきました。

  • AWS IoT 上で作成した証明書はAWS CLI コマンドによるインポート利用不可
  • AWS CLIコマンドによる証明書インポートコマンドはAWS IoT 外部の認証機関より入手した証明書をインポートするためのものであって、AWSで作成した証明書をインポートするためのものではない。
  • AWS IoT 上で作成した証明書をローカルからAWSに取り込む手段はない。
    (サポートが誤っていたのか、CLIが新しくなったのかはわかりませんが)→register-certificate-without-caを使えば取り込むことは可能!でした

register-certificateコマンドは以下の用途で使うということですね。
– 自前の証明書を使用する – AWS IoT

AWS IoT は、任意のルートまたは中間認証局 (CA) によって署名されたクライアント証明書をサポートします。AWS IoT は、証明書の所有権を確認するために CA 証明書を使用します。Amazon の CA ではない CA によって署名されたデバイス証明書を使用するには、デバイス証明書の所有権を確認できるように、その CA の証明書を AWS IoT に登録する必要があります。

AWS IoT は、独自の証明書の持ち込み (BYOC) を実現するための複数の方法をサポートしています。

独自のクライアント証明書を作成する

まとめ

本記事では、AWS IoTで誤って削除した証明書を復旧する手順について解説しました。

  1. 証明書の復旧方法: バックアップしていた証明書を使用し、register-certificate-without-caコマンドを利用することで再インポートが可能です。
  2. 注意点: register-certificateコマンドは外部のCA証明書用であり、AWS IoTが発行した証明書には適していません。

最新情報を提供してくださった読者様には非常に感謝しております。ありがとうございました。

以上です。

PR
当ブログはWordPressテーマSWELLを使用しています。非常に使いやすく、簡単にプロのようなデザインを使えるのでお勧めです!!

SWELL – シンプル美と機能性両立を両立させた、圧巻のWordPressテーマ

ランキング

ランキングに参加しています。クリックして応援いただけると嬉しいです。
にほんブログ村 IT技術ブログ クラウドコンピューティングへ
にほんブログ村
AWSランキング
AWSランキング

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次