DKIM
メールに電子署名を付け、DNSで公開された署名ドメインの公開鍵で検証する送信ドメイン認証方式である。署名したドメインを確認し、署名で保護された部分の改ざんを検出する。
イマシルちゃんの解説
DKIMは、メールに署名したドメインを確かめる送信ドメイン認証の方式だよ。
署名する側は外へ出さない秘密鍵を使って、メールに電子署名という検証用のデータを付けるんだ。
受け取る側は、ドメインの情報を調べるDNSから検証用の公開鍵を取り出すよ。
その鍵で署名を調べて、本当にそのドメインの署名かを確認するの。
署名で保護された部分の改ざんも調べられるから、受け取ったメールを信用するか判断する手掛かりになるんだ。
ただし、画面に表示された送信者本人の身元まで保証するわけではないよ。
この解説はわかりやすかったですか?
より深い解説
定義
DKIM(DomainKeys Identified Mail)は、RFC 6376で定められた送信ドメイン認証の技術である。送信側は、選んだメールヘッダーと本文のハッシュ値を保護する電子署名を、DKIM-Signatureヘッダーとして付ける。検証に使う公開鍵は、署名ドメインのDNSのTXTレコードで公開する。
仕組み
| 段階 | 送信側 | 受信側 |
|---|---|---|
| 準備 | 鍵のペアを作り、公開鍵をDNSに登録する | − |
| 送信 | 本文のハッシュ値と対象ヘッダーを基に秘密鍵で署名し、DKIM-Signatureヘッダーを付ける | − |
| 受信 | − | 署名ヘッダーのドメインとセレクタから、DNSに公開鍵を問い合わせる |
| 検証 | − | 本文のハッシュ値を確認し、公開鍵で署名を検証する |
公開鍵は、「セレクタ._domainkey.署名ドメイン」という名前のTXTレコードで公開される。セレクタを変えることで、複数の鍵を使い分けたり、鍵を切り替えたりできる。
メールに付く署名ヘッダー
DKIM-Signatureには、名前=値という形のタグをセミコロンで区切って記録する。
| タグ | 内容 |
|---|---|
| d | 署名したドメイン |
| s | 検証用の鍵を選ぶセレクタ |
| h | 署名対象に選んだヘッダー名の一覧 |
| bh | 本文のハッシュ値をBase64で表した値 |
| b | 署名値をBase64で表した値 |
例えば d=example.net; s=mail2026 なら、受信側はmail2026._domainkey.example.netのTXTレコードを調べる。bに入るのは署名値であり、秘密鍵やメール本文ではない。
署名対象のヘッダーはhで指定する。本文は、空白や改行などの扱いをそろえる正規化を行ってからハッシュ値を求める。したがって、検証成功が保証する範囲は署名対象と正規化の規則に従って保護された部分である。配送途中で追加された署名対象外のヘッダーまで、元から存在したものだと保証するわけではない。
DNSで公開する鍵の情報
DNS側のレコードにもタグがあるが、メールの署名ヘッダーとは別の形式である。
| タグ | 内容 | 値の例 |
|---|---|---|
| v | DKIM鍵レコードのバージョン | DKIM1 |
| k | 鍵の種類 | rsa |
| p | Base64で表した公開鍵のデータ | 鍵ごとの文字列 |
| t | 鍵の利用に関するフラグ | y、s |
t=y はテストモードを示す。t=s は、署名ヘッダーのi=で示す識別情報のドメインを、d= のドメインと完全に同一に制限する指定である。サブドメインを許さないための制限であり、「本番運用」を示す値ではない。フラグを省略しただけで t=s と同じ制限になるわけでもない。
SPFとの比較
| SPF | DKIM | |
|---|---|---|
| 確認するもの | 送信元サーバのIPアドレス | メールに付けた電子署名 |
| 改ざんの検出 | できない | できる |
| メールの転送 | 失敗しやすい | 内容が変わらなければ成功する |
| 送信側の準備 | DNSにSPFレコードを登録する | 鍵を作り、メールサーバで署名し、公開鍵をDNSに登録する |
DKIMは、署名がメールに付いて運ばれるため、転送されても(内容が変更されなければ)検証に成功する。この点で、転送に弱いSPFを補う。
S/MIMEとの違い
DKIMとS/MIMEは、どちらも電子署名を使うが、目的と署名する主体が異なる。
| DKIM | S/MIME | |
|---|---|---|
| 署名する主体 | 送信側のメールサーバ(ドメイン) | 送信者個人 |
| 検証用の鍵の配布 | DNS | デジタル証明書 |
| 目的 | 送信ドメインの認証(なりすまし対策) | 送信者本人の認証、暗号化 |
| 利用者の操作 | 不要(サーバが自動で行う) | 利用者が証明書を取得・設定する |
DKIMの限界
DKIMで確認できるのは、「d= に書かれたドメインが署名した」ことである。攻撃者が自分で取得したドメインで正しく署名すれば、検証には成功する。そのため、利用者が見るヘッダーのFromのドメインと、署名のドメインが対応しているかを、DMARCで確認する必要がある。