DKIM署名
DKIM署名とは、メールのヘッダー(DKIM-Signatureヘッダー)に追加される暗号学的な署名で、受信者がメッセージを送信ドメインによって認可され、転送中に改ざんされていないことを検証できるようにします。主要なタグには d(ドメイン)、s(セレクター)、b(署名)、bh(本文ハッシュ)があります。
このガイドは、DKIMに関する完全ガイドの一部です。関連: DKIMレコード、DKIMが失敗する理由。
DKIM署名とは、メールのヘッダーに追加される暗号学的な署名(DKIM-Signatureヘッダーに含まれる)で、受信サーバーがメッセージを送信ドメインによって認可され、転送中に改ざんされていないことを検証できるようにするものです。 署名は送信者が保持する秘密鍵で生成され、DNSに公開された対応する公開鍵と照合してチェックされます。
DKIM-Signatureヘッダーの見た目
署名は、メッセージの先頭に付加される単一のヘッダーフィールドとして移動します。受信者が必要とするすべて、すなわち署名ドメイン、セレクター、どのヘッダーが署名されたか、本文のハッシュ、そして署名そのものを、セミコロンで区切られた一連のtag=valueペアに詰め込みます。
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=example.com; s=selector1; t=1700000000;
h=from:to:subject:date;
bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=;
b=Cg5Xje8kY0m5xT1pW2qL4vN8rH6dF3aZ9cU7bE0iQoR2sT4uV6wX8yZ1
aB3cD5eF7gH9jK2lM4nP6qR8sT0uV2wX4yZ6aB8cD0eF2gH4jK6l=
このヘッダーは、メッセージがドメインを離れる前に送信者のメールサーバーによって挿入されます。改行とインデントは折り返しのためだけのもので、値は論理的には1つの連続した文字列です。
DKIM署名のタグ
各タグは、検証というパズルの1ピースを運びます。署名者がこれらの値を選び、検証者はそれらを読み返して署名を再構築しチェックします。
| タグ | 名前 | 目的 |
|---|---|---|
v | バージョン | DKIMバージョン。常に1。 |
a | アルゴリズム | ハッシュと署名のアルゴリズム。例: rsa-sha256やed25519-sha256。 |
d | ドメイン | 署名ドメイン — DKIMが認証するアイデンティティ。 |
s | セレクター | ドメインのDNSからどの公開鍵を取得するかを指定する。 |
h | 署名ヘッダー | 署名の対象となるヘッダーフィールドのコロン区切りリスト。 |
bh | 本文ハッシュ | (正規化された)メッセージ本文のハッシュ。 |
b | 署名 | 実際の暗号学的署名、base64エンコードされたもの。 |
c | 正規化 | ハッシュ化前にヘッダー/本文をどう標準化するか。例: relaxed/relaxed。 |
t / x | タイムスタンプ | tはメッセージが署名された時刻。xは署名が失効する時刻。 |
署名の仕組み(送信時)
メッセージが送信サーバーを離れるとき、DKIMは2つのことを行います。まず本文を正規化してハッシュ化し、その結果をbhに格納します。次に、hで指定されたヘッダー(およびDKIM-Signatureヘッダー自体を空のbとともに)を正規化し、そのブロックをハッシュ化して、そのハッシュをドメインの秘密鍵で署名します。結果として得られる署名がbの値になります。秘密鍵は送信者から決して外に出ないため、真のドメイン所有者だけが、検証を通過する署名を生成できます。
検証の仕組み(受信時)
受信サーバーはDKIM-Signatureヘッダーを読み取り、ドメイン(d)とセレクターを把握します。<selector>._domainkey.<domain>でDNSを照会し、DKIMレコードから公開鍵を取得します。そして送信者の作業を繰り返します。本文を正規化してハッシュ化し、それをbhと比較し、署名されたヘッダーを正規化してハッシュ化し、公開鍵を使ってbをそのヘッダーハッシュと照合してチェックします。本文ハッシュが一致し、かつ署名が検証されれば、DKIMは通過します。bhのチェックこそが、メッセージ本文への改ざんを検出するものです。たった1文字の変更でも異なるハッシュを生成し、チェックに失敗します。
署名が失敗するとき
DKIM署名は、受信者が見るメッセージが、送信者が署名したものと一致しなくなったときに常に失敗します。最もよくある原因は次のとおりです。
- 転送中の改変 — メーリングリスト、転送機能、一部のゲートウェイが件名を書き換えたり、フッターを追加したり、本文を再エンコードしたりして、本文ハッシュを壊す。
- 本文ハッシュの不一致 — 署名された本文部分への変更は
bhを変えるため、鍵が正しくても検証が失敗する。 - 誤ったまたは欠落した鍵 — セレクターが、存在しない、失効した、または誤った公開鍵を保持するDNSレコードを指している。
原因と修正のより詳しい内訳については、DKIMが失敗する理由を参照してください。また、無料のDKIMルックアップツールを使って、セレクターの公開鍵が公開され、正しい形式であることを確認してください。
よくある質問
DKIM署名とは何ですか?
DKIM署名とは、メールのヘッダーのDKIM-Signatureフィールドに追加される暗号学的な署名です。送信者は、選択したヘッダーと本文のハッシュに対して秘密鍵でこれを生成します。受信者はDNSにある公開鍵と照合して検証し、メッセージがそのドメインから送られ、改変されていないことを証明します。
DKIM署名のb=タグは何を意味しますか?
b=タグは実際の署名を保持します。これは、正規化された署名ヘッダーのハッシュを送信ドメインの秘密鍵で署名して生成された、base64エンコードされた値です。受信者はそれをデコードし、DNSから取得した公開鍵と照合して検証します。署名されたヘッダーが転送中に変わっていれば、b=のチェックは失敗します。
転送後にDKIM署名が失敗するのはなぜですか?
転送機能やメーリングリストは、しばしばメッセージを改変します。フッターを追加したり、件名を書き換えたり、本文を再エンコードしたりします。DKIMは正確な本文と選択したヘッダーに署名するため、そのような変更はどれも計算されるハッシュを変え、署名されたbhやヘッダーハッシュと一致しなくなります。その結果、元は有効だった署名も検証に失敗します。
DKIMにおける本文ハッシュ(bh)とは何ですか?
bh=タグは、正規化後のメッセージ本文のハッシュで、aで指定されたアルゴリズムで計算されます。受信時、検証者は本文ハッシュを再計算してbhと比較します。不一致は本文が転送中に改変されたことを意味し、b=の暗号学的署名がチェックされる前に、署名は拒否されます。