ACM の DNS 認証を Route 53 以外で設定するときに覚えておくと良いこと:値のアンダースコア(「_」)は無くてもOKです!

2018.09.23

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

TL;DR

  • ACM の DNS 認証では、指定された CNAME レコードを DNS に登録しておく必要があります
  • ところが CNAME レコードの値は先頭が必ずアンダースコア(_)で始まるため、一部のDNSサーバ・サービスでは設定することができません
  • 実は値のアンダースコアは、省略しても認証が通ります

背景

先日(9/21)、AWS の公式フォーラムに下記のアナウンスが流れました。

曰く、ACM (AWS Certificate Manager)の DNS 認証を行うために設定する CNAME レコードですが、値として設定する内容には必ずアンダースコア(_)が含まれているものの、これは省略が可能だとのことです。

アナウンスには特に「新しくそうなった」とは書いてないのですが、このドキュメントは日本語版はまだありません('18 9/23現在)。また下記の公式ドキュメントを参照しますと、

英語版のドキュメントには、日本語訳版にはない下記の一文があります。

If your DNS providor does not support CNAME values with leading underscore, see Troubleshoot DNS Validation Problems.

なので、少なくともそんなに昔からある仕様ではなさそうです。

何故こんな仕様が?

アナウンス文にもありますが、「 一部の DNS 実装は、CNAMEの値の部分にアンダースコアを記述することができない 」ためとのことです。ちょっと調べたところ、例えば「お名前.com」の DNS サービスではアンダースコアは TXT レコード以外で使用できないような記述がみつかりました。

そもそも、DNS のホスト名部分ではアンダースコアを使うことは、RFC 上推奨されない状態です1。上述したサービス以外にも、アンダースコアを設定できない DNS サービスは少なくはない模様です。

こういった DNS を利用しているゾーンで ACM を使う場合には、これまでは DNS 認証は使えなかった(E-mail 認証のみ)のですが、今回ご紹介する仕様を使えば設定も可能になると思われます。

試してみる

実際やってみましょう。ACM にて証明書をリクエストし、DNS 認証のためのレコードで _ を抜いた名前を登録して、検証が成功するかどうかを確認します。

DNS 認証での ACM 証明書申請については下記の記事もご参照ください。

Certificate Manager (ACM) がDNSの検証をサポートしました

ACM のコンソールからパブリック証明書をリクエストし、検証の画面まで来ました。

通常ですとここにあるように、先頭に「_」が含まれる値を CNAME リソースレコードとして設定することになります。ここで表示された内容をそのままではなく、値のアンダースコアなしで設定してみます。

先のドキュメント によるとポイントは以下のふたつで、

  • 値の先頭のアンダースコアのみ削除。それ以外はそのまま記述する
  • 名前のほうのアンダースコアは省略できない

こちらに従って、既存の DNS にレコードを設定してみました。dig でクエリした結果は以下の通りで、確かにアンダースコアなしになっています。

この状態でしばらく待つと、見事 ACM 側で検証が成功しました!

まとめ

ドキュメントに書いてあるように、アンダースコアがない値でも DNS 認証が成功することができました。これまでこの制約によって ACM が使えなかった方々も、是非あらためて検討してみてください。

注釈


  1. この辺りは歴史的な経緯もあって非常に複雑なのですが、DNS が登場する以前のホスト名では明確に使用不可とされていました(RFC 952)。その後の RFC(1034,1035,2181)では明示されていませんが、RFC 1912 では「ホスト名に使えるのは英数字とハイフンだけだ」と明記されています。実際問題としては、使えるかも知れないが使えない実装もあり、どんな問題がでてくるか分からないので、使わないほうが無難、というところになるでしょうか。