2026年6月8日

2026年6月8日

DANE が動作しない場合のトラブルシューティング(SMTP の TLSA レコード)

DANE(DNS-Based Authentication of Named Entities)が動かない原因は、ほとんどが「TLSA レコードと実際の証明書が一致していない」か「TLSA レコードが DNSSEC で検証できていない」のどちらかです。特に証明書を自動更新した直後に TLSA が古いまま残り、DANE に対応した送信側のメールサーバーが配送を保留する、という形のトラブルがよく起こります。この記事では、メールサーバー(SMTP)での DANE を対象に、症状の見方、原因の順番、確認コマンドと直し方を説明します。

前提:DANE は主に SMTP で使われている

DANE は、DNS に置いた TLSA レコードで「このサーバーの正しい証明書(または公開鍵)はこれです」と宣言する仕組みです。TLSA レコードそのものが偽装されないように、DNSSEC での署名が前提になっています。

現在、実際に広く使われているのはメールサーバー間の通信(SMTP、RFC 7672)です。主要な Web ブラウザは HTTPS での DANE 検証に対応していないので、Web サイトの TLSA を設定しても閲覧者側の動作は変わりません。この記事も SMTP を前提に進めます。

SMTP の DANE で TLSA を置く場所は、ドメインそのものではなく MX レコードが指すメールサーバーのホスト名です。

; MX が mx1.example.com を指している場合
example.com.              IN MX   10 mx1.example.com.
_25._tcp.mx1.example.com. IN TLSA 3 1 1 (公開鍵の SHA-256 ハッシュ)

3 1 1 は「サーバー自身の証明書(3)の公開鍵部分(1)を SHA-256 でハッシュしたもの(1)」という意味で、SMTP では最もよく使われる組み合わせです。

症状の見え方

DANE が壊れたときに困るのは、受信側(TLSA を公開している側)です。DANE に対応した送信側のサーバーは、TLSA と証明書が一致しないと「なりすましの可能性がある」と判断して配送を保留し、再試行を繰り返します。送信側のログには、証明書の照合に失敗した旨のメッセージが残ります。DANE に対応していない送信元からのメールは普通に届くため、「特定の相手からのメールだけ遅れる、届かない」という症状になりがちです。

自分のサーバーが送信側として DANE を検証している場合(Postfix で smtp_tls_security_level = dane など)は、相手先の TLSA の不備で自分の送信が保留されることもあります。この場合はログで相手のホスト名を確認し、相手の管理者に知らせるのが基本です。

ステップ1:TLSA レコードが DNSSEC で検証されているか

TLSA があっても、ゾーンが DNSSEC で検証できなければ DANE は使われません(送信側は TLSA を無視するか、検証できない状態として扱います)。まず、検証するリゾルバに問い合わせて ad フラグを確認します。

# MX を確認する
dig example.com MX +short

# MX ホストの TLSA を、検証するリゾルバで引く
dig _25._tcp.mx1.example.com TLSA @1.1.1.1 +dnssec

flags: に ad があり、ANSWER SECTION に TLSA が返れば合格です。ad が付かないなら、MX ホストのゾーンが署名されていない、または DS が親に登録されていません。MX ホストが別のドメイン(ホスティング事業者のドメインなど)にある場合は、そちらのゾーンが DNSSEC に対応している必要があります。SERVFAIL が返るなら DNSSEC 自体の検証失敗なので、先にそちらを直します。

ステップ2:TLSA の値と実際の証明書を照合する

次に、メールサーバーが実際に提示している証明書から公開鍵のハッシュを計算し、TLSA の値と比べます。

# サーバーが STARTTLS で提示する証明書を取り出す
openssl s_client -starttls smtp -connect mx1.example.com:25 -servername mx1.example.com </dev/null 2>/dev/null \
  | openssl x509 -outform PEM > live.pem

# 「3 1 1」用のハッシュ(公開鍵 → DER → SHA-256)を計算する
openssl x509 -in live.pem -noout -pubkey \
  | openssl pkey -pubin -outform DER \
  | openssl dgst -sha256

出力された16進数の文字列が TLSA の最後の値と一致すれば正常です(大文字・小文字の違いは関係ありません)。一致しなければ、TLSA が古いか、サーバーが想定と違う証明書を提示しています。

Postfix を使っている場合は、付属の posttls-finger で送信側と同じ考え方の検証を試せます。posttls-finger -t30 -T180 -c -l dane example.com のように実行すると、TLSA の取得から証明書の照合までの結果が表示されます。オプションの詳細はお使いの版のマニュアルで確認してください。外部から一通り確認したい場合は、internet.nl のメールテストのように DANE の判定を含むサービスも使えます。

原因1:証明書の更新で鍵が変わった(最も多い)

3 1 1 は公開鍵に結びついているので、証明書を更新しても鍵が同じなら TLSA を変える必要はありません。問題は、更新のたびに新しい鍵を作る設定になっている場合です。Let's Encrypt の certbot は、既定では更新時に新しい鍵を作ります。

対処には2つの考え方があります。

  • 鍵を再利用する:certbot の --reuse-key オプションのように、更新時に同じ鍵を使い続ける設定にします。TLSA の変更は鍵を意図的に替えるときだけで済みます。
  • 次の鍵を先に公開する:現在の鍵と次に使う鍵の両方の TLSA を並べて公開しておき、TLSA の TTL が過ぎてから証明書を切り替えます。切り替え後、古い鍵の TLSA を外します。

いずれの場合も、「証明書を差し替えてから TLSA を直す」順番は避けます。新しい TLSA が DNS のキャッシュに行き渡る前に証明書が変わると、その間は照合に失敗します。

原因2:2 1 1(認証局の鍵を指定)で中間証明書が変わった

TLSA の先頭を 2(信頼の起点となる認証局)にして中間証明書の公開鍵を指定する方式は、サーバーの鍵を更新しても TLSA を変えずに済む利点があります。ただし、認証局が中間証明書を切り替えると一致しなくなります。Let's Encrypt のように、複数の中間証明書を使い分けたり、定期的に入れ替えたりする認証局もあります(2026年10月現在)。

この方式を使うなら、発行されうる中間証明書の候補をすべて TLSA に並べる、あるいは 3 1 1 と組み合わせて片方が外れても照合できるようにする、といった備えが要ります。サーバーが中間証明書をチェーンに含めて送っていないと、2 系の照合はできない点にも注意してください。

原因3:TLSA を置く名前やポートが違う

よくある設定ミスは次のとおりです。

  • ドメインの頂点(_25._tcp.example.com)に置いていて、MX が指すホスト名に置いていない
  • MX が複数あるのに、一部のホストにしか TLSA がない(その MX に配送されるときだけ照合が行われない、または失敗する)
  • ポートが 25 ではなく 587 や 465 になっている(サーバー間の配送は 25 番です)
  • MX が CNAME を指している(MX の値に CNAME を使うこと自体が規格上の誤りで、照合以前に問題を起こします)

dig example.com MX +short の結果すべてについて、_25._tcp.<ホスト名> の TLSA を確認してください。

原因4:STARTTLS が提供されていない・使用法 0 / 1 の TLSA

TLSA を公開しているのに、サーバーが STARTTLS を提供していないと、DANE に対応した送信側は配送を保留します。メールサーバーの設定変更で TLS を一時的に止めた場合などに起こります。openssl s_client -starttls smtp が TLS のハンドシェイクまで進むかを確認します。

また、TLSA の先頭(証明書の使用法)が 0 や 1 の場合、SMTP 向けの規格(RFC 7672)では公開しないことが推奨されており、送信側によっては使えないレコードとして扱われます。SMTP では 3 1 1 か 2 1 1 を使うのが一般的です。

変更作業の前に

TLSA を書き換える前に、現在のレコードと証明書、鍵のバックアップを取っておきます。秘密鍵はパーミッションを絞り、Web から見える場所や Git リポジトリに置かないでください。変更は TTL を意識して段階的に行い、作業後はステップ1・2のコマンドで照合結果を確認します。

まとめ

  • SMTP の DANE は、MX が指すホストの _25._tcp に置いた TLSA と、DNSSEC の検証が前提
  • まず dig +dnssec で ad フラグと TLSA の有無を確認し、次に openssl で証明書のハッシュを照合する
  • 最も多い原因は、証明書の更新で鍵が変わったのに TLSA が古いままになっていること
  • 鍵の再利用か、次の鍵の TLSA を先に公開する運用で、更新時の不一致を防げる
  • 2 1 1 を使う場合は中間証明書の入れ替えに備え、MX が複数あれば全ホストを確認する

お気軽にご相談ください

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