AWS Certificate Manager へインポートした外部のDV証明書でも有効期限を CloudWatch でモニタリング可能なのか検証した

Let's Encryptで発行したDV証明書をACMへインポートして確認してみました。
2021.06.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

以下の記事で紹介されていますとおり、AWS Certificate Manager(ACM)で管理されている証明書の有効期限をCloudWatchから確認でき、有効期限に対してアラート設定ができます。

ACMで発行した証明書の有効期限をCloudWatchで確認できることはわかりました。疑問は外部で発行した証明書をインポートした場合も同様なのでしょうか?

こちらが元となるアップデート記事からの引用です。

例えば、ACM は、インポートされたサードパーティーの証明書の更新を試みることはありません。また、管理者は、証明書の発行後に何らかの理由でレコードが削除された場合、DNS 検証を使用する証明書の欠落している DNS レコードを再設定する必要があります。メトリクスとイベントは、更新プロセスを続行するために介入が必要な証明書を可視化します。

むしろ、外部の証明書をインポートしたときに有用ですと謳っているように思えます。しかし、確証を得られなかったので検証します。

検証結果

  • 外部で発行した証明書をACMにインポートしても有効期限をCloudWatchでモニタリングできる
  • Let's Encryptで発行したドメイン検証(Domain Validation; DV)型の証明書でのみ確認

有効期限まで残り89日の表示例

検証手順

Let's Encryptで証明書発行

まずACM以外で発行する証明書が必要です。無償で証明書を発行できるLet's Encrytを利用します。下記の記事を参考に証明書を発行しました。Let's Encryptで発行できる証明書はDV証明書のみです。当検証はOV証明書、EV証明書のチェックしておりません。

ACMへ証明書をインポート

証明書を発行すると下記パスの配下に証明書ファイル類が保存されます。

/etc/letsencrypt/archive/[DominName]

発行した証明書のドメイン名のディレクト配下にACMへインポートで必要な証明書本文、プライベートキー、証明書チェーンのファイル名を確認できます。

ディレクトリ内容

[DomainName]/
├── cert1.pem       # 証明書本文に該当
├── chain1.pem      # 証明書チェーンに該当
├── fullchain1.pem  # ACMへインポートでは使わない
└── privkey1.pem    # 証明書のプライベートキーに該当

ACMの証明書インポート画面から該当のファイル内容を貼り付けます。

ACMのダッシュボードから確認すると種類がインポート済みとなり、ACMで発行した証明書と違いがあります。

有効期限は89日とACMの画面から確認できます。

CloudWatchで有効期限が表示されるか確認

ACM画面で確認できたからと言っても顧客が本当に必要だったものは有効期限が迫るとメールやSlackなどで通知が欲しいのではないでしょうか。それはACM単体では実現できないことです。CloudWatchを確認してみましょう。

89と残り日数を確認できました。AWSさんは顧客が本当に必要だったものを理解されていました。ありがとうございます。

※ インポートしてからCloudWatchに値が表示されるまで3時間待ちました。

アラートの設定方法は冒頭で紹介した記事に紹介されております。

おわりに

当初はCerbotのためにWebサーバを入れるのが面倒くさくてLEGOを利用して証明書を発行しました。ACMへ証明書のインポートを試みましたが上手くいかず詰みました。この記事を読んだ方が同じく時間をムダにしないように書き残しておきます。

LEGOで証明書発行すると下記のファイルが保存されます。

$ lego --version
lego version 4.4.0 linux/amd64

$ lego --accept-tos \
    --path=/home/ec2-user/work \
    --email="xxx@xxxx" \
    --dns="route53" \
    --domains="*.[DomainName]" \
    run

ACMインポート時に登場する用語へ直すとこんな感じです。証明書本文が必要なため.crt.issuer.crtの差分から証明書本文を部分を確認しました。

certificates/
├── _.[DomainName].crt        # 証明書本文と証明書チェーンのマージ
├── _.[DomainName].issuer.crt # 証明書チェーン
├── _.[DomainName].json
└── _.[DomainName].key        # 証明書のプライベートキーに該当

いざ、ACMへインポートすると下記のエラーで弾かれます。証明書チェーンに不備があるようです。

Could not validate the certificate with the certificate chain.

以下のドキュメントより証明書チェーン内に証明書本文があってもよいが証明書の並び順に規則があること、証明書間にブランクは不要であることを知りました。 順序は中間証明書2 -> 中間証明書1 -> ルート証明書(証明書本文)となっている必要があります。

.crtファイルは証明書本文が一番上に来ていたことと、証明書間にブランクがあったため修正しました。エラーは解消されませんでした。中間証明書に関してはどちから1番か2番か判断つきませんでしたので、一応並び替えて試しましたがエラーは解消せず、時間の関係で断念しました。

Cerbotで発行した証明書はそのままACMへインポートできてあっさり検証が終了しました。もし同じ検証をしたい場合はCerbotでの証明書発行をオススメします。検証用途以外にLet's Encryptで発行した証明書をACMへインポートしないのではないかと思いますが、LEGOの証明書をACMへインポート方法わかる方いらっしゃればご連絡いただきたいです。

参考