DKIM の検証処理は何をしている?
Gmail ではメール認証がないメールは配信されなくなりました。
おかげでスパムメールも減ったように思います。
Email sender guidelines - Google Workspace Admin Help
メール認証は、ユーザーとしてメールを利用している限りではあまり目にすることはありません。
以前メールサーバーを立てたときに、SPF や DKIM なんていうメール認証の用語を知りました。
これを設定しないと Gmail に送信できないので・・・。
ちょっとややこしい方の DKIM についての素朴な疑問です。
DKIM で行っている電子署名とはどういうもので、どうやって検証するのか?
DKIM とは
DKIM は電子署名を使ってメールの送信者のなりすましや内容の改ざんを検知する仕組みです。
大雑把なフローは以下のような感じです。
1.事前準備
- 秘密鍵・公開鍵を生成し、公開鍵を DNS の TXT レコードに登録しておく
2.メール送信
- 秘密鍵で作成した電子署名をつけてメール送信する
3.メール受信
- DNSから公開鍵を取得し、受信したメールの電子署名を検証する
電子署名の検証とは何をやっている?
送信側で作成される電子署名はメールのハッシュ値を秘密鍵で暗号化したものです。
メールのハッシュ値とは、メールの本文とヘッダーから生成されます。
受信側では電子署名を公開鍵を使って復号化し、元のハッシュ値を得ます。
そして実際に受信しているメールの本文とヘッダーから送信側と同じ方法でハッシュ値を生成します。
電子署名のハッシュ値と受信側で計算したハッシュ値が同じなら認証 OK ということになります。
もう少しだけ具体的に見ていきます。
実際のメールのヘッダーに DKIM の情報があります。
Gmail で確認するには 1 つメールを開いて、右端の「・・・」(その他ボタン)から「原文を表示」を選択するとヘッダーも見ることが出来ます。
表示された原文から「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)
受信側での検証
検証は2段階で行われます。メール本文の検証とメールヘッダーの検証です。
1. メール本文の検証
bh=タグはメール本文をハッシュ化したデータです。送信側で設定された値です。- 受信したメール本文のハッシュを計算して
bh=の値と一致することを確認します。
2. メールヘッダーの検証
h=タグは送信側で署名の計算に含めるものとして選択されたヘッダーです。b=タグは電子署名のデータです。h=タグで選択したヘッダーと DKIM-Signature ヘッダー(b=タグの値は除く)をつなげた文字列のハッシュを計算し、秘密鍵で暗号化したもの。
DKIM-Signature にはbh=タグも含まれているのでメール本文の内容も含んでいることになります。
なので、メール本文自体も署名の対象になっている。- 受信側でも同様に
h=タグで指定されたヘッダーと DKIM-Signature ヘッダーからハッシュ値を計算します。 - 取得した公開鍵により
b=タグの値を復号化してハッシュ値を得ます。 - 受信側で計算したハッシュ値と復号化したハッシュ値が一致することを確認します。
まとめ
DKIM の電子署名はメールの本文とヘッダーを元に作成されるものです。
受信側で実際の本文とヘッダーと比較することで改ざんされていないことを検証できるというものでした。
参考
RFC 6376 - DomainKeys Identified Mail (DKIM) Signatures
- 3.7. Computing the Message Hashes
- 5. Signer Actions
- 6. Verifier Actions