DKIMについて整理してみた
2025-03-22
DKIMについて
DKIM
DKIM(DomainKeys Identified Mail)は、電子署名方式の送信ドメイン認証です。
メールを送信する際に送信元が電子署名を行い、受信者がそれを検証することで、送信者のなりすましやメールの改ざんを検証する仕組み。
公開鍵の登録
メールに付加されている電子署名の検証は、送信元のDNSサーバに設定されているDNSレコードを参照して行われます。
また公開鍵はFQDNの形式でTXTレコードとして下記のように登録されます。
selector._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3...(以下略)"
上記のように、レコード名は<セレクタ名>._domainkey.<送信元ドメイン>で構成されます。
<セレクタ名>は後述するDKIM-Signatureヘッダのsタグに記載されたラベルになります。
また<送信元ドメイン>は、DKIM-Signatureヘッダのdタグに記載されたドメインとなります。
ちなみに同じドメインに対して複数の異なるセレクタを使用することで、同じドメインで複数のDKIMキーを使用することができます。
DNSレコードの値として登録されているv=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3...(以下略)が、実際のDKIMの公開鍵や設定内容を表します。
この値は;で区切られたタグの集合体で、各タグの役割は以下の通りです。
v=DKIM1: DKIMのバージョンになります。省略時はDKIM1となります。省略することは可能ですが、設定することが推奨されています。k=rsa: 電子署名作成時に使用する暗号化アルゴリズムを指定します。DKIMではrsaのみサポートされており、省略時もrsaとなります。p=...: 公開鍵データで、Base64でエンコードされてます。必須タグです。
DKIMの電子署名
DKIMでは送信側で電子メールに電子署名を付加しますが、その際にはDKIM-Signatureヘッダとして追加します。
公開鍵と同様に、DKIM-Signatureヘッダの値も;で区切られたタグの集合体です。
以下が、DKIM-Signatureヘッダの例です。
DKIM-Signature: v=1; a=rsa-sha256; d=example.com; s=selector;
c=simple/simple; q=dns/txt; t=1617123456;
h=From:To:Subject:Date:Sender;
bh=2jUSOH9Nh...(以下略);
b=AuUoFEfDxT...(以下略)
上記のDKIM-Signatureヘッダの例における各タグの役割は以下の通りです。
v=1: 使用しているDKIMのバージョンを示します。a=rsa-sha256: 電子署名作成時に使用したアルゴリズムを示します。利用できるアルゴリズムはrsa-sha1とrsa-sha256のみです。d=example.com: 署名を行った送信元ドメイン名を示します。公開鍵を参照するドメインの一部となります。s=selector: 公開鍵を参照するドメインの一部となるセレクタ名を示します。dタグに記載されたドメイン名と組み合わせて、公開鍵を参照するドメイン名を構成します。c=simple/simple: 電子署名作成時に利用する正規化処理に利用するアルゴリズムを示します。simple・relaxedを<ヘッダ>/<本文>それぞれに指定可能です。省略した場合はsimple/simpleとなります。h=From:To:Subject:Date:Sender: 電子署名作成時に含まれていたヘッダを示します。:で区切ることで複数のヘッダを列挙できます。From:とSender:は必ず電子署名に含める必要があります。bh=2jUSOH9Nh...(以下略): 電子署名の対象とした本文をハッシュ値に変換した値を示します。b=AuUoFEfDxT...(以下略): 電子署名データでBase64にエンコードして指定します。
その他にもいくつかタグがあります。
lタグ: 電子署名を行ったメール本文の先頭からの文字長をバイト単位で指定します。省略された場合は本文すべてを署名対象とします。
DKIMの正規化処理
電子メール配送において、メール転送エージェント(MTA)や各種セキュリティフィルタ、受信メールサーバによって電子メールのデータが変更されることがあります。
DKIMの電子署名の検証において、これらの変更をある程度許容できるようにするための仕組みが正規化処理です。
DKIM-Signatureヘッダのcタグにヘッダと本文それぞれに正規化処理アルゴリズムを指定します。
指定可能なアルゴリズムは以下の通りです。
simple: この正規化アルゴリズムでは、最小の変更のみ許容されます。配送途中の電子メールのデータ変更を許容したくない場合に使用します。relaxed: この正規化アルゴリズムは、simpleよりも配送途中の電子メールのデータ変更をある程度許容し、送信ドメインの認証処理を最優先します。そのため、本文行内に空行を追加したり、ヘッダ名の大文字・小文字が変化する」といった変更をある程度許容する場合に使用します。
送信時の処理方法
DKIM認証を実施する場合、メール送信側は、次の手順で署名を行って、DKIM-Signatureヘッダを追加します。
- DKIM署名対象のメールか確認する。
- 署名対象のヘッダを決定し、
hタグに列挙する。 - メール本文の
lタグに指定した長さを取り出し、正規化処理を実施する。 - ヘッダ、正規化したメール、DKIM-Signatureヘッダ(署名データを除いた部分をつなげたもの)を結合したデータに対してハッシュを作成し、
bhタグに追加する。 - 4.のハッシュに対して電子署名を作成し、DKIM-Signatureの
bタグに追加したのち、DKIM-Signature自身をメールに追加する。
受信時の処理方法
受信時は、DKIM-Signatureヘッダを参照し次の手順で処理が行われます。
- DKIM-Signatureヘッダの
dタグ・sタグから、公開鍵を参照するドメイン名を取得する。 - 1.のドメイン名から公開鍵を取得する。
hタグに指定されているヘッダとメール本文、DKIM-Signatureヘッダ(署名データを除いた部分をつなげたもの)を結合したデータに対してハッシュを作成する。- 3.のハッシュを電子署名を作成する。
- 2.で取得した公開鍵を用いてDKIM-Signatureヘッダの
bタグに登録されている電子署名を取得する。 - 4.と5.の電子署名を比較し一致すれば、DKIM認証成功となる。
DKIM ADSP
Author Domain Signing Practice(ADSP)は、DKIMの認証結果をどのように扱うべきかを記載したポリシーを送信側で公開するものです。
現在は代わりにDMARCが利用されているため、利用は推奨されてません。
まとめ
DKIMはメールを送信する際に送信元が電子署名(DKIM-Signatureヘッダ)を付加し、受信者がそれを検証することで、送信者のなりすましやメールの改ざんを検証する仕組みのことです。
本当はSPFやDMARCもまとめたいところですが、それらはまた別の記事でまとめることにします。 ではまた。