CrescPia

DKIM の検証処理は何をしている?

Gmail ではメール認証がないメールは配信されなくなりました。
おかげでスパムメールも減ったように思います。

Email sender guidelines - Google Workspace Admin Help


メール認証は、ユーザーとしてメールを利用している限りではあまり目にすることはありません。
以前メールサーバーを立てたときに、SPF や DKIM なんていうメール認証の用語を知りました。
これを設定しないと Gmail に送信できないので・・・。


ちょっとややこしい方の DKIM についての素朴な疑問です。
DKIM で行っている電子署名とはどういうもので、どうやって検証するのか?

DKIM とは

DKIM は電子署名を使ってメール内容の改ざんを検知する仕組みです。
大雑把なフローは以下のような感じです。

1.事前準備
  • 秘密鍵・公開鍵を生成し、公開鍵を DNS の TXT レコードに登録しておく
2.メール送信
  • 秘密鍵で作成した電子署名をつけてメール送信する
3.メール受信
  • DNSから公開鍵を取得し、受信したメールの電子署名を検証する

電子署名の検証とは何をやっている?

送信側で作成される電子署名はメールのハッシュ値に秘密鍵で署名したものです。
メールのハッシュ値は、メールの本文とヘッダーから生成されます。
まず本文のハッシュ値を計算し、それをヘッダーと一緒にもう一度ハッシュ化するという2段階になっています。


受信側では実際に受信しているメールの本文とヘッダーから送信側と同じ方法でハッシュ値を生成します。
そして公開鍵を使って、電子署名がそのハッシュ値に対する正しい署名かどうかを検証します。
検証に成功すれば認証 OK ということになります。


もう少しだけ具体的に見ていきます。
実際のメールのヘッダーに DKIM の情報があります。
Gmail で確認するには 1 つメールを開いて、右端の「・・・」(その他ボタン)から「原文を表示」を選択するとヘッダーも見ることが出来ます。
gmail original

表示された原文から「DKIM-Signature」ヘッダーを探すと以下のような内容になっています。(見やすいように各タグごとに改行しています。)

DKIM-Signature: 
v=1; 
a=rsa-sha256; 
c=relaxed/relaxed; 
d=example.com; 
s=myselector1; 
t=1748001318; 
x=1748606118; 
h=to:from:subject:message-id:feedback-id:date:mime-version:from:to:cc:subject:date:message-id:reply-to; 
bh=B2ES6...[メール本文をハッシュ化したデータ]; 
b=TPfnUSQ...[電子署名のデータ]

公開鍵の取得

  • d= タグは送信側のドメイン。
  • s= タグはセレクタ。
  • 公開鍵は、[セレクタ]._domainkey.[ドメイン] の DNS の TXT レコードから取得します。
    公開鍵の確認にはこんなサービスが利用できます。Dig (DNS lookup) google toolbox

受信側での検証

検証は2段階で行われます。メール本文の検証とメールヘッダーの検証です。

1. メール本文の検証
  • bh= タグはメール本文をハッシュ化したデータです。送信側で設定された値です。
  • 受信したメール本文のハッシュを計算して bh= の値と一致することを確認します。
2. メールヘッダーの検証
  • h= タグは送信側で署名の計算に含めるものとして選択されたヘッダーです。
  • b= タグは電子署名のデータです。h= タグで選択したヘッダーと DKIM-Signature ヘッダー(b= タグの値は除く)をつなげた文字列のハッシュを計算し、秘密鍵で署名したもの。
    DKIM-Signature には bh= タグも含まれているのでメール本文の内容も含んでいることになります。
    なので、メール本文自体も署名の対象になっている。
  • 受信側でも同様に h= タグで指定されたヘッダーと DKIM-Signature ヘッダーからハッシュ値を計算します。
  • 取得した公開鍵を使って、b= タグの署名が受信側で計算したハッシュ値に対して正しいことを検証します。

まとめ

DKIM の電子署名はメールの本文と、h= タグで選択されたヘッダーを元に作成されるものです。
受信側で実際の本文とヘッダーと比較することで改ざんされていないことを検証できるというものでした。

参考

RFC 6376 - DomainKeys Identified Mail (DKIM) Signatures

  • 3.7. Computing the Message Hashes
  • 5. Signer Actions
  • 6. Verifier Actions
PR
PR