テックメモ

技術的に気になったことをメモしていきます

ACMでDNSによるドメイン検証が可能になりました(自動更新が個人的に楽になった)

はじめに

AWSACMに関する以下のリリースを発表しました。

https://aws.amazon.com/jp/about-aws/whats-new/2017/11/aws-certificate-manager-easier-certificate-validation-using-dnsaws.amazon.com

今まで、ACMドメイン検証をする場合は、メール受信による検証だけだったのですが、これにDNSレコードの登録(CNAMEレコード)による検証が加わりました。

正直、今まではこれだけのためにメール受信環境を構築することもあり、TerraformとかCloud Formation等でテンプレ化をしていても面倒だったのでかなり嬉しいリリースです。

DNSレコード検証の自動更新プロセスについて詳細な内容にアップデートをしました (1/22)

何が嬉しいか

メールの受信環境を構築しなくて良いのは楽ですね。

また、DNSレコード検証専用の自動更新プロセスも誕生しました。

実は私はこちらの自動更新プロセスの方が嬉しいです。
メール検証の場合、証明書の自動更新の際に以下のプロセスが発生していました。

  1. ACMから対象ドメインの対してHTTPSの接続要求による検証を行う
  2. HTTPSの接続が確認できなかった場合はドメインオーナーに対して確認用Eメールを送付する

ACMからの接続による検証が通ると勝手に更新されていて、ACM最高だわ!となるのですが、そもそもSGなどで接続を制限している環境で運用をしていると、更新時にメール検証の一手間が発生してしまい、あー。ってなっていました。

では、DNSレコード検証ではどのようなプロセスとなるのか。

DNS を使用したドメインの所有権の検証 - AWS Certificate Manager

証明書は使用中で CNAME レコードが残っている状態であれば、証明書は ACM によって自動的に更新されます。

とあります。つまり以下の2点をクリアできれば自動的に更新されます。

  1. CNAMEレコードによる検証を行う
  2. 証明書が使用中であるか検証を行う

また「証明書が使用中」であることは以下のいずれかで確認可能です。

  • コンソールで確認したときに「使用中?」が「はい」になっている
  • describe-certificate コマンド InUseBy に何かしらのARNが存在する

上記で検証が失敗した場合はAWS Accountに対して確認用Eメールが送付されます。

Eメール認証で取得した証明書からドメイン認証へ乗り換える方法

これはよくある質問に答えが載っていました。

既存の証明書を E メールでの検証から DNS での検証に変更できますか?
できません。しかし、無料の証明書を新たに ACM からリクエストして、この新しいものに対して DNS での検証を選択できます。

つまり、Eメール認証で取得したドメイン名の証明書をDNS認証で新しく取得して、各AWSリソースとの紐づけを順次切り替えていけば良いです。

ACMで自動更新ができない件について調べてみた

はじめに

先日クラスメソッドさんのこちらのブログでAWS ACMで自動更新に失敗するケースがあることを知りました。

dev.classmethod.jp

自動更新に失敗することがあると聞いた事はありつつも、詳しい条件は知らなかった為なるほどなぁーとつらつらと眺めていると衝撃的な一文を目にしました。

纏めると次の条件に当てはまる証明書は自動更新が実施されません。 ワイルドカード証明書を利用している

まじか!それは面倒くさいよ!と思い調査をしたところ、AWSのドキュメントがアップデートされており少し状況が変わっている事が判明しました。

ACMで自動更新されない条件(2017/7/3版)

サクッと紹介します。

まず、ACMで自動更新を有効にする条件を見ていきましょう。 参照したドキュメントは以下になります。

docs.aws.amazon.com

証明書を自動的に更新するには、以下の条件が満たされている必要があるとあります。

  • ACM によって証明書の各ドメインHTTPS 接続を確立できる必要があります。
  • 各接続では、返される証明書が ACM が更新している証明書と一致する必要があります。

さらに更新の可能性を高める為には次の操作を行うようにとあります。

  • AWS リソースで証明書を使用すること
  • インターネットからの HTTPS リクエストを許可するようにリソースを設定します
  • ドメイン名を ACM 証明書をホストするリソースにルーティングするように DNS を設定すること

ここまではクラスメソッドさんのブログにある通りだと思います。

ACMワイルドカード証明書を自動更新させる条件(2017/7/3版)

次にACMドメイン検証の仕組みを確認しましょう。 参照したドキュメントは以下になります。

docs.aws.amazon.com

おそらく、ここに関するドキュメントがアップデートされたのだと思います。 自動ドメイン検証の仕組みには以下の記載があります。

ACM は、ワイルドカードドメイン名 (*.example.com など) を親ドメインと同じく処理します。次の表の例を参照してください。

肝心の表を参照してみると・・・・

証明書のドメイン ACM 自動検証に使用するドメイン
example.com example.com / www.example.com
www.example.com www.example.com / example.com
*.example.com example.com / www.example.com

なんとワイルドカードドメインにも自動検証に使用するドメインが記載されています!

念のためAWSサポートの方にも確認したところ、ワイルドカードドメイン証明書の場合は表の通りapexまたはwwwドメインに対して検証を行うとの事でした。
(ただしワイルドカードのみの証明書の場合はRFC 6125に違反する為、不正な証明書とみなされるので注意!!)

つまり、ワイルドカード証明書の場合は以下3点の条件を満たしていれば自動更新される事になります。

  1. 証明書がELBやCloudFrontに設定されている
  2. インターネットからそのリソースに対してアクセスができる
  3. www.もしくはapexドメインでそのリソースにアクセスできるようにDNSでルーティングされている

ELBだと固定費がかかるので、なるべく安く自動更新する為にはS3+CloudFrontのような構成で自動検証をクリアするのが良いかもしれませんね。

CloudFrontでACMを利用する場合はus-east-1で証明書を作成する必要がありました。そのため、東京リージョンで取得したACMの証明書は上記の構成で自動検証をクリアすることができませんでした。
us-east-1以外のリージョンで自動更新を通過させるためには、現状はELBに証明書をセットするしか手がなさそうです。