診断 · 出典付きの回答
DKIMエラー「body hash did not verify」の原因と診断方法
DKIMの「body hash did not verify」エラーは、DKIM署名が付与された後にメール本文が変更された場合に発生します。受信サーバーは受け取った本文のハッシュを再計算し、それがDKIM-Signatureヘッダーに保存されたハッシュと一致しないことを検出するため、検証に失敗します。
本文が変更される原因
最も一般的な原因は、途中のメールサーバーやセキュリティアプライアンスによるメッセージ内容の変更です。これには、末尾の空白の追加、トラッキングピクセルの挿入、法的な免責事項の追記、改行コードのCRLFからLFへの変更などが含まれます。本文やMIME構造がたった1文字変わっただけでも暗号学的ハッシュは無効になり、fail判定になります。
正規化(canonicalization)の設定
DKIMは正規化アルゴリズムを使って、どの程度の変更までならハッシュが失敗しないかを決めます。simple正規化は厳格で、どんな変更でも失敗します。relaxed正規化は、一部の空白の変更やヘッダーの大文字・小文字の違いを無視します。メッセージがリレーによって頻繁に変更される場合は、relaxed正規化に切り替えることで不要な失敗を防げます。
MIMEとエンコーディングの問題
Content-Transfer-Encodingの扱いが正しくないと、ハッシュの不一致が発生することがあります。リレーがメッセージをquoted-printableから8bitに変換したり文字セットを変更したりすると、結果として本文のハッシュが変わります。本文の完全性を保つため、署名エージェントとトランスポート層がRFC 2045で定められた標準に準拠していることを確認してください。
診断の手順
この問題を解決するには、失敗したメッセージの生のヘッダーを調べます。送信した元の本文と受信した本文を比較し、どこで変更が発生したかを正確に特定します。SendHQやその無料ツール(https://sendhq.cc/tools)を使って、現在のDKIMレコードの設定を確認し、公開鍵がDNSに正しく公開されていることを確かめられます。
予防策
内容を変更するメールリレーの使用は避けてください。フッターを追記するサービスをどうしても使う必要がある場合は、配信経路の最後のホップで署名が行われるようにします。あるいは、ARC(Authenticated Received Chain)を導入して複数のホップをまたいで元の認証結果を保持し、最終的な受信者が元の署名を信頼できるようにする方法もあります。
よく寄せられる質問
ボディハッシュの失敗はSPFに影響しますか?
いいえ、SPFとDKIMは互いに独立しています。DKIMのボディハッシュが失敗してもSPFのpassは無効になりませんが、DKIMが主な認証手段だった場合はDMARCのアライメントに影響する可能性があります。
フッターの追加でこのエラーが発生することはありますか?
はい、メッセージの署名後に企業の免責事項やメーリングリストのフッターを追加すると本文の内容が変わり、DKIMのボディハッシュが無効になります。
simple正規化とrelaxed正規化の違いは何ですか?
simpleは厳格で、どんな変更でも失敗します。relaxedは空白やヘッダーの大文字・小文字のわずかな変更を許容するため、リレーによる変更に強くなります。
件名を変更するとボディハッシュが失敗しますか?
いいえ、件名はヘッダーの一部です。件名を変更した場合はヘッダーハッシュの失敗が発生し、ボディハッシュの失敗にはなりません。
一次情報源
- RFC 6376:DomainKeys Identified Mail(DKIM)の仕様 — RFC Editor
- RFC 2045:MIME 第1部:インターネットメッセージ本文の形式 — RFC Editor
- RFC 8617:認証済み受信チェーン(ARC) — RFC Editor