← RFC Reference

DKIM — DomainKeys Identified Mail

Internet Standard Email Authentication Published March 2026
ELI5: DKIMを手紙の改ざん防止用の封ろうだと考えてください。送信前に、メールサーバーはメッセージに独自の封印(暗号署名)を押します。到着時に、受信者はDNSに公開されている公開鍵に対して封印を確認できます。封印が無傷なら、メッセージは転送中に改ざんされておらず、そのドメインの秘密鍵にアクセスできる誰かから本当に来たものです。

このRFCが存在する理由

SPFはメッセージが認可されたIPアドレスから送信されたことを確認しますが、メッセージのコンテンツについては何も保証しません。メッセージはSPFに合格しても、その後に侵害されたリレーによって変更される可能性があります。また、メールが転送される場合、送信IPが変わるためSPFは機能しなくなります。

DKIMはこの両方の問題を解決します。メッセージ自体に暗号署名を付加することで、転送後も有効なドメインレベルのID主張(署名はメッセージとともに移動)を提供し、コンテンツの整合性を保証します(変更があれば署名は無効になります)。

2011年に公開されたRFC 6376が現在のDKIM仕様です。RFC 4871を廃止し、正規化、鍵管理、署名セマンティクスの改善を導入しました。これはSPFおよびDMARCと並んで、最新のメール認証の基盤となっています。

動作方法

署名(送信者側)

  1. 送信メールサーバー(またはアップストリームの署名エージェント)は、どのヘッダーとボディに署名するかを選択します。
  2. simpleまたはrelaxedアルゴリズムを使用して選択されたコンテンツを正規化し、空白とケーシングを正規化します。
  3. 正規化されたボディのハッシュを計算してから、選択されたヘッダープラスボディハッシュのハッシュを計算します。
  4. ドメインの秘密鍵(RSAまたはEd25519)を使用してヘッダーハッシュに署名します。
  5. メッセージにDKIM-Signatureヘッダーを追加します。このヘッダーには署名、署名ドメイン(d=)、セレクタ(s=)、署名内容についてのメタデータが含まれます。

検証(受信者側)

  1. 受信者はDKIM-Signatureヘッダーからd=(ドメイン)とs=(セレクタ)の値を抽出します。
  2. <selector>._domainkey.<domain>のDNSで公開鍵をクエリします。
  3. 署名で指定されたのと同じアルゴリズムを使用して、署名されたヘッダーとボディを再度正規化します。
  4. 公開鍵に対して署名を検証します。有効な場合、結果はpassです。

DKIM-Signatureヘッダーの例

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; s=mtg20240101; h=from:to:subject:date:message-id:mime-version:content-type; bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=; b=LjIEJLNOTAREALSIGh8gAiGVQOr3K7...truncated...

DNS公開鍵レコード

mtg20240101._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEB...truncated..."

主要な技術詳細

正規化

メールは転送中に微妙に変更される可能性があります(末尾の空白が削除、ヘッダーが再折り返される)。正規化はハッシュ化前にコンテンツを正規化するため、問題のない変更によって署名が破損することはありません。ヘッダーとボディに対して別々に指定される2つのアルゴリズムが利用可能です。

アルゴリズム ヘッダー ボディ
simple ヘッダー値の末尾の空白を除いて変更なし 末尾の空行を除いて変更なし
relaxed ヘッダー名を小文字化、行を展開、空白を圧縮 空白を圧縮、1行ごとの末尾の空白を削除

最も一般的な設定はc=relaxed/relaxedであり、転送中の最も一般的な変更を許容します。

鍵タイプ

RFC 6376はRSA署名を定義しました。RFC 8463はその後Ed25519サポートを追加しました。RSA鍵は少なくとも2048ビットである必要があります。1024ビット鍵は暗号学的に弱いと見なされ、一部の受信者に拒否されます。Ed25519鍵はより小さく(DNS内で44文字)、検証が高速です。

セレクタ

セレクタ(s=タグ)により、ドメインは複数のDKIM鍵を同時に公開できます。これは鍵ローテーションに不可欠です。新しいセレクタの下に新しい鍵を公開し、それで署名を開始してから、移行期間後に古いセレクタのDNSレコードを削除します。

l=タグ(ボディ長制限)

オプションのl=タグは、署名されるボディのバイト数を制限します。これはメーリングリストがフッターを追加する際に署名を破損させないようにするための意図でしたが、実際には署名の脆弱性を生み出します。攻撃者は署名された部分の後に悪意のあるコンテンツを追加できます。セキュリティ意識の高い実装のほとんどはl=を使用しません。

ヘッダー署名

h=タグは、署名に含まれるヘッダーを列挙します。ベストプラクティスは少なくとも以下に署名することです。FromToSubjectDateMessage-IDMIME-VersionContent-TypeFromヘッダーは仕様により必須です。存在しないヘッダーに署名すると、署名後にそれが追加されるのを防ぎます(重要なリプレイ対策)。

一般的なミス

配信性への影響

Related RFCs