DKIM署名によるメール認証と公開鍵・秘密鍵を用いた検証の仕組み

DKIM署名とは何か DKIM署名をわかりやすく解説する完全ガイド


著者: Ahona Rudra
翻訳: 古川 綾乃

この記事はPowerDMARCのブログ記事 What is a DKIM Signature: A Compete Guide to DKIM Signaturesの翻訳です。
Spelldataは、PowerDMARCの日本代理店です。
この記事は、PowerDMARCの許可を得て、翻訳しています。


DKIM(DomainKeys Identified Mail)は、メールの送信元ドメインを検証するためのメール認証方式です。
公開鍵暗号方式を用いてメールにデジタル署名を付与し、受信側がそのメールがドメイン所有者によって送信されたものであることを確認できるようにします。

受信者は、ドメインのDNSに公開されている公開鍵と照合することで、署名を検証できます。
この記事では、DKIMの仕組みと動作原理について詳しく解説します。

主なポイント

  1. DKIMは、ドメイン所有者がメッセージに署名できるようにすることでメールセキュリティを強化し、真正性を保証します。
  2. DKIM署名は、メールのヘッダーおよび本文のハッシュ情報をもとに生成され、メールが転送中に改竄されていないことを検証するために使用されます。
  3. DKIMでは公開鍵暗号方式により鍵ペアを生成し、公開鍵はDNSに公開され、秘密鍵は送信側で安全に管理されます。
  4. DKIM署名を検証することで、メールがスパムとして判定されるのを防ぎ、ドメインのなりすましのリスクを低減します。
  5. DKIMはメールの正当性を向上させますが、メール詐欺攻撃に効果的に対抗するためには、DMARCポリシーと組み合わせて使用する必要があります。

DKIM署名とは何か

DKIM署名とは、送信側のメールサーバが各メールメッセージに対して生成する暗号学的なデジタル署名であり、メールヘッダーに追加されます。
この署名により、そのメールが実際にドメイン所有者によって送信されたものであり、第三者によって送信されたものではないことを受信者が確認できます。

また、送信者から受信者に届くまでの途中で、メールの内容が改竄されていないことも検証できます。
署名の検証に失敗した場合、次のような可能性が考えられます。

  1. メッセージが送信途中で改変された
  2. 送信サーバの秘密鍵にアクセスできる第三者が、送信者になりすましてメールを送信した

このように署名の検証に失敗した場合、受信側のメールサーバはそのメールを不審なものとして扱う可能性があります。
なぜなら、そのメールが送信ドメインから送信された正当なメッセージであることを確認できないためです。

DKIM署名はどのように機能するのか

DKIMは、メールヘッダーにデジタル署名を追加することで動作します。
この署名は受信側のメールサーバによって検証され、メールが送信途中で改竄されていないかどうかを確認するために使用されます。
DKIMは公開鍵暗号方式を使用しており、秘密鍵と公開鍵からなる鍵のペアを利用します。

公開鍵はDNSに公開され、必要とする受信サーバが取得できるようになっています。
一方、秘密鍵は送信側のメールサーバで安全に管理されます。
メールを送信する際、送信サーバはまずメールヘッダーおよび本文の一部からハッシュ値を生成します。

その後、このハッシュ値を秘密鍵で署名し、その結果を DKIM-Signature ヘッダーとしてメールに追加します。
メールを受信したサーバは、送信ドメインのDNSから公開鍵を取得し、その公開鍵を使用して署名を検証します。
検証の結果、署名が正しいと判断された場合、そのメールは以下のことが確認できます。

DKIM署名の鍵

DKIM署名は、公開鍵と秘密鍵という2つの暗号鍵を使用して生成されます。

公開鍵
DNSに公開され、受信サーバが取得して署名の検証に使用する
秘密鍵
送信側のメールサーバが保持し、メールに署名するために使用する

メールに署名する際、送信サーバはメッセージの一部からハッシュ値を生成し、そのハッシュ値を秘密鍵で署名します。
受信サーバはDNSから公開鍵を取得し、その公開鍵を用いて署名を検証します。

DKIM署名の構成要素

DKIM署名は、ヘッダーと本文の2つの部分で構成されています。
ヘッダーには、送信者のメールアドレスや公開鍵など、送信者の識別情報が含まれます。
本文には、実際に送信されたメッセージの内容が含まれます。

  1. DKIM署名を計算するには、まずドメイン名(例えば「example.com」)のMD5ハッシュを取得します。
  2. 次に、ドメイン名をSHA1ハッシュ(例えば「sha1(example.com)」)と連結し、それを送信された元のメッセージに追加します。
  3. その後、この結合された文字列に対して再度MD5ハッシュ(例えば「md5(sha1(example.com))」)を計算します。 最後に、その値をヘッダーとしてメッセージの先頭に追加してから送信します。

DKIM署名に関わる手順

DKIMを設定する手順

DKIMを利用するには、まず送信ドメインに対して暗号鍵を作成し、DNSに公開鍵を登録する必要があります。
一般的な設定手順は次のとおりです。

秘密鍵と公開鍵のペアを生成する
秘密鍵は送信メールサーバで管理され、メールの署名に使用されます。
公開鍵をDNSに登録する
公開鍵は通常、次のような形式のDNS TXTレコードとして公開されます。
selector._domainkey.example.com
送信メールサーバに秘密鍵を設定する
メール送信時に、この秘密鍵を使用してDKIM署名が生成されます
DNSに登録された公開鍵を使用して受信側が署名を検証できるようにする。
DNSに公開された公開鍵を使用して、受信側のメールサーバがDKIM署名を検証できるようにします。

DKIM署名で使用されるタグの理解

これは、DKIM署名レコードがどのように見えるかを示す例です。

KIM-Signature: v=1;
a=rsa-sha256;

s=jun2005.eng;

c=relaxed/relaxed;

d=example.com;

s=dkim;

t=1526555738;

bh=mhU6OJb5ldZf+z/pX9+0Nc4tj/lmyYHWbR8LgI2Q=;

h=To:From:Subject:Date:Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding;

b=s1sdZCzdX9vxocsMSlT7cOrYixl1g8wfkdzrVe7BGN6ZdPV9xu2A
v=
このタグはDKIMのバージョンを示します。
a=
このタグは、署名者が公開鍵を生成するために使用したアルゴリズムを指定します。
使用できるアルゴリズムには、RSA1_5、RSA-SHA1、またはRSASSA-PSSがあります。
このタグが存在しない場合は、RSA-SHA1が使用されていると見なされます。
c=
このタグは、ヘッダーフィールドからハッシュを生成するために使用される正規化アルゴリズムを指定します。
ここには、1つ以上の正規化アルゴリズムをカンマ区切りで指定します(例:「c=relaxed」)。
このタグが省略された場合は、relaxed正規化が使用されます。
d=
このタグは、このサーバ(または別の受信者)から送信されるメッセージの署名を生成する際に使用されるドメイン名を指定します。
s=
「s」タグはセレクター文字列であり、受信サーバがどの公開鍵を使用して署名を検証するかを判断するために使用されます。
t=
このタグはタイムスタンプタグであり、署名が作成された時刻を記録します。
通常はUnixタイムスタンプ(1970年1月1日からの秒数)で表されます。
bh=
このタグは本文ハッシュを表し、メッセージ内容(ヘッダーを含む)の暗号化されたハッシュ値です。
これにより、DKIM署名後から受信者に届くまでの間にメッセージが改竄されることを防ぎます。
h=
このタグはヘッダーハッシュ値であり、すべてのヘッダーを完全な形で含みます。
ただし、除外リストに含めて明示的に除外されたヘッダーは含まれません。
この値はSHA-1またはMD5を使用して計算する必要があります。
b=
「b」タグは、メッセージ本文を正規化した後(MIMEエンコードを除去した後)の本文に対して計算された暗号学的ハッシュ関数を、Base64形式でエンコードした値です。

DKIM署名の生成

  1. 公開鍵と秘密鍵を生成します。
  2. DKIMヘッダーとフッターを生成します。
  3. 選択したアルゴリズム(例えばRSA-SHA256またはRSA-SHA512)を使用して、秘密鍵でメール内容に署名します。
  4. 選択したアルゴリズム(例えばdeflateまたはnone)を使用してメッセージを圧縮します。
  5. MIMEヘッダーより前の位置に、メッセージの先頭へDKIMヘッダーを挿入します。
  6. MIMEフッターの後にDKIMフッターを挿入します。

DKIM署名の有効性を確保する

DKIM署名が有効であることを確認するために、いくつかの手順を実行できます。

  1. 従来のDKIM署名アルゴリズムを使用するか、最適化されたアルゴリズムを使用するかを決定します。
  2. メッセージのヘッダーと本文のハッシュ値を計算します(通常はSHA-256を使用します)。
  3. 適切な署名アルゴリズム(RSAやECDSAなど)を選択します。
  4. 公開鍵が、ステップ1で指定したセレクターと一致していることを確認します(これはDNSを使用して行います)。
  5. 秘密鍵を使用してメッセージに署名し、その署名をBase64形式のASCII文字列としてメールヘッダー内に保存します(DNSにも配置します)。

DKIM署名の検証

DKIM署名の検証は複雑な仕組みです。。
設定や運用には高度な専門知識が必要です。また、SPFなどの他の認証技術と併用されることが多いですが、これらの仕組みも同様に複雑です。
そのため、多くのメールマーケターはDKIMレコードチェッカーなどの検証ツールを使用してDKIM署名を確認します。

このツールは、DNSに公開されている公開鍵と照合して、メールに付与された署名を検証します。
鍵が有効で信頼できる場合、そのメールは正規のメールであると確認されます。
これはいくつかの理由で重要です。

まず、ISPや受信者によってメールがスパムと判定されるのを防ぐのに役立ちます。
次に、他のドメインによって自分のドメインがブラックリストに登録されるのを防ぐことができます(これは「ドメインポイズニング」と呼ばれる問題です)。
最後に、メールが中間者攻撃のような攻撃に巻き込まれることを防ぐのに役立ちます。

まとめ

DKIMは、特に外部送信者から送られてくるメールの正当性を組織が検証するための有効な仕組みです。
メッセージング環境全体で一貫して適用することで、メールが送信ドメインの正規の代表者によって送信されたものであるという受信者に高い信頼性を示すことができます。

ただし、DKIMは検証の仕組みを提供するものの、なりすましやフィッシングなどのメールを利用した詐欺を防ぐには十分ではない点に注意が必要です。
そのためには、rejectポリシーを設定したDMARCの導入が不可欠です。

導入をご検討中の方へ

メール認証は、あらゆる企業のデジタルマーケティング戦略において重要な要素です。
毎日膨大な数のメールが送受信されているため、あなたのブランドのメールが埋もれてしまう可能性があります。

しかし、PowerDMARCのメール認証サービスを利用することで、あなたのメールが適切な相手に届くようにすることができます。
当社のメール認証ソリューションは次のことを支援します。