2026年6月16日

2026年6月16日

DoT (DNS over TLS) と CAAレコード を併用する設定|自前の DoT サーバーの証明書を CAA で守り、更新とピン留めを両立する

自分で DoT サーバーを公開する場合、端末はサーバーのホスト名(例 dns.example.com)の証明書を見て接続先を確かめます。言い換えると、そのホスト名の証明書を第三者に発行されてしまえば、成りすましの DoT サーバーを作られる余地が生まれます。CAA レコードでそのホスト名の証明書を発行できる認証局・ACME アカウント・認証方式を絞り込むと、この危険を小さくできます。この記事では、DoT サーバーの運用者の立場で、証明書の取得方法の決め方、ホスト名への CAA の書き方、更新とピン留めの扱い、発行の監視までを説明します。

利用者として DoT の名前解決を使いながら CAA を確かめる方法は、同じサイトの別記事で扱っています。この記事は、DoT サーバーを提供する側の設定です。

CAA は DoT のどこを守るのか

まず、2つの仕組みの関係を整理します。

  • DoT:端末と DoT サーバーの間の名前解決を TLS で暗号化し、証明書で接続先を確かめます。ホスト名で照合する方式(Android のプライベート DNS など)では、公的な認証局が発行した、名前の一致する証明書なら受け入れられます。
  • CAA:あるホスト名について、どの認証局が証明書を発行してよいかを DNS で宣言します。認証局は発行の直前に CAA を確かめ、許可されていなければ発行を断ります。

CAA は DoT の通信そのものには関与しません。守るのは「DoT サーバーのホスト名の証明書が、意図しない経路で発行されること」です。発行の制限は CAA、発行されてしまった証明書の発見は証明書の透明性(CT)ログの監視、という分担で考えます。

手順1:証明書の取得方法と認証方式を決める

DoT サーバーは TCP 853番で待ち受けるため、Web サーバーを置かない構成もよくあります。ACME の認証方式ごとに必要な条件が異なるので、先に決めておきます。

  • http-01:TCP 80番で認証用のファイルを返す必要があります。certbot の --standalone を使えば、取得や更新の間だけ80番を一時的に開く運用もできます。
  • dns-01:DNS に TXT レコードを書いて認証します。ポートを開ける必要はありませんが、DNS サービスの API の認証情報をサーバーに置くことになるため、その権限を最小限にします。
  • tls-alpn-01:TCP 443番で認証します。853番では使えない点に注意してください。

ここで決めた方式を、次の手順の validationmethods に書きます。

手順2:DoT のホスト名に CAA を書く

CAA は、問い合わせた名前に CAA が無ければ親のドメインへさかのぼって探されます。逆に、ホスト名そのものに CAA があれば、親の CAA は使われません。この性質を使うと、ドメイン全体の設定を変えずに、DoT のホスト名だけを厳しく絞り込めます。

dns.example.com.  3600  IN  CAA  0 issue "letsencrypt.org; accounturi=https://acme-v02.api.letsencrypt.org/acme/acct/123456789; validationmethods=http-01"
dns.example.com.  3600  IN  CAA  0 issuewild ";"
dns.example.com.  3600  IN  CAA  0 iodef "mailto:security@example.com"
  • accounturi と validationmethods は RFC 8657 の拡張で、発行を依頼できる ACME アカウントと認証方式を限定します。Let's Encrypt は両方に対応しています。対応状況は認証局ごとに異なるため、他の認証局を使う場合はその資料で確かめてください。
  • アカウントの URI は、certbot なら新しい版の certbot show_account や、/etc/letsencrypt/accounts/ 配下の regr.json で確認できます。値は例なので、自分のアカウントの URI に置き換えます。
  • 最初は TTL を短めにし、次の更新が通ることを確かめてから延ばすと、誤りに気づいたときに戻しやすくなります。

設定後は、DNS の応答で確かめます。

dig +short CAA dns.example.com

ゾーンを DNSSEC で署名していれば、CAA の応答が途中で書き換えられる危険も小さくなります。署名していない場合でも CAA は機能しますが、併用を検討する価値があります。

手順3:証明書を DoT のサービスに読み込ませる

Unbound で DoT を提供する例です。Unbound の設定では、証明書と秘密鍵のファイル、853番での待ち受けを指定します。

# /etc/unbound/unbound.conf の一部(例)
server:
    interface: 0.0.0.0@853
    tls-port: 853
    tls-service-pem: "/etc/unbound/dot-fullchain.pem"
    tls-service-key: "/etc/unbound/dot-privkey.pem"

certbot が保存するファイルは root しか読めない権限になっていることが多いため、更新のたびに Unbound が読める場所へ写し、サービスを再起動するフックを置きます。

#!/bin/sh
# /etc/letsencrypt/renewal-hooks/deploy/unbound-dot.sh(例。実行権限を付ける)
set -e
case " $RENEWED_DOMAINS " in
  *" dns.example.com "*) ;;
  *) exit 0 ;;
esac
install -m 0640 -o root -g unbound "$RENEWED_LINEAGE/privkey.pem" /etc/unbound/dot-privkey.pem
install -m 0644 -o root -g unbound "$RENEWED_LINEAGE/fullchain.pem" /etc/unbound/dot-fullchain.pem
systemctl restart unbound

再読み込み(reload)で証明書を読み直せるかは Unbound の版や権限の設定によって異なるため、この例では再起動にしています。再起動の間は名前解決が一瞬途切れるので、利用者が多い場合は複数台で順に行う構成を検討します。dnsdist を使う場合は、コンソールの reloadAllCertificates() で証明書を読み直せます。設定ファイルを書き換える前には、現在のファイルをバックアップしておいてください。

手順4:ピン留めする利用者がいる場合の鍵の扱い

Stubby などで公開鍵のハッシュ(SPKI ピン)を登録している利用者がいる場合、証明書の更新で鍵が変わると接続できなくなります。CAA は認証局とアカウントを制限するだけで、鍵には関与しないため、ここは別に考えます。

  • certbot の --reuse-key を使うと、更新の際に同じ秘密鍵を使い続けられます。
  • 鍵を入れ替えるときは、次の鍵のピンを事前に告知し、利用者が2つのピンを登録できる期間を設けます。

一方、認証局を変えるときは CAA の書き換えが先です。新しい認証局を issue に追加し、新しい証明書に切り替えてから、古い認証局の行を外します。順序を逆にすると、新しい認証局での発行が CAA で拒否されます。

手順5:発行の結果と CT ログを確かめる

最後に、実際に配信している証明書の発行者が CAA で許可したものかを確かめます。

openssl s_client -connect dns.example.com:853 -servername dns.example.com </dev/null 2>/dev/null \
  | openssl x509 -noout -issuer -enddate

kdig @dns.example.com +tls-ca +tls-hostname=dns.example.com example.com A

あわせて、crt.sh などの CT ログの検索サービスで dns.example.com を定期的に確かめ、自分が依頼していない証明書が出ていないかを見ます。CAA は認証局が守ることを前提にした仕組みなので、CT ログの監視と組み合わせることで、万一の発行にも気づけるようになります。CT ログの監視サービスは複数あり、提供内容や条件は変わることがあります(2026年10月現在)。

まとめ

  • CAA は DoT の通信ではなく、DoT サーバーのホスト名の証明書が意図せず発行されることを防ぐ。
  • 853番の DoT では tls-alpn-01 が使えないため、http-01 か dns-01 を選び、その方式を validationmethods に書く。
  • ホスト名に CAA を置けば親の CAA は使われないので、DoT のホスト名だけを accounturi まで含めて絞り込める。
  • 更新のフックで DoT のサービスに新しい証明書を読み込ませ、ピン留めの利用者がいれば鍵を再利用するか事前に告知する。
  • 認証局を変えるときは CAA を先に書き換え、CT ログの監視で意図しない発行がないかを確かめる。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲