2026年5月23日
2026年5月23日
DKIM署名を検証する方法|DNSの公開鍵・受信ヘッダー・dkimverifyで確かめる
DKIM(DomainKeys Identified Mail)は、送信側のメールサーバーがメールのヘッダーと本文に秘密鍵で署名し、受信側が DNS に公開された公開鍵でその署名を検証する仕組みです。署名が検証できれば、そのメールが署名したドメインから送られ、途中で書き換えられていないことを確認できます。
DKIM を設定したあとは、「署名が付いているか」だけでなく「受信側で検証に通っているか」を確かめる必要があります。この記事では、次の4つの方法で検証します。コマンドは 2026年10月時点の Debian 13 のパッケージ(OpenDKIM 2.11、dkimpy 1.1)で動作を確認しています。
| 確かめること | 方法 |
|---|---|
| 公開鍵が DNS に正しく載っているか | dig で TXT レコードを見る |
| サーバーの秘密鍵と DNS の公開鍵が対になっているか | opendkim-testkey |
| 実際に届いたメールで検証に通ったか | 受信メールの Authentication-Results ヘッダー |
| 保存したメールの署名を手元で検証する | dkimverify |
ステップ1: 署名のドメインとセレクターを調べる
DKIM の公開鍵は セレクター._domainkey.ドメイン という名前の TXT レコードに置かれます。セレクターとドメインは、送ったメールの DKIM-Signature ヘッダーに書かれています。
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=example.com;
i=@example.com; q=dns/txt; s=mail2026; t=1794292820; h=from : to :
subject : date : message-id : from;
bh=zS7KNTV0HyeorkDDGwxB1AV6enuRKzO5rthkhdHIRnY=;
b=OcUaLkqzb7uLy8QpVE5/N7YlnKWxLacc+0Exb7hqlrEYPHcwoxaghxRcA19hMCkiqwzW5...
| タグ | 意味 | この例 |
|---|---|---|
d= |
署名したドメイン | example.com |
s= |
セレクター(鍵の名前) | mail2026 |
h= |
署名の対象にしたヘッダー | from, to, subject など |
bh= |
本文のハッシュ値 | |
b= |
署名そのもの |
この例なら、公開鍵は mail2026._domainkey.example.com にあります。ヘッダーに DKIM-Signature が無ければ、送信側で署名されていません。
ステップ2: DNSの公開鍵を確認する
dig +short TXT mail2026._domainkey.example.com
次のような値が返れば、公開鍵は公開されています。
"v=DKIM1; h=sha256; k=rsa; " "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7kT9..." "...IDAQAB"
- 値が
"…" "…"のように複数の文字列に分かれていても問題ありません。1つの文字列は255文字までなので、2048ビットの鍵は分けて登録され、検証する側がつなげて読みます。 p=の後ろが空(p=)なら、その鍵は失効しています。使わなくなったセレクターを無効にするための書き方で、この鍵での署名は検証に通りません。- 何も返らない場合は、セレクター名かドメイン名が違う、レコードがまだ反映されていない、のどちらかです。
example.com._domainkeyのように順番を逆にしていないかも確認してください。
DNS の変更直後は、キャッシュのために古い結果が返ることがあります。権威 DNS サーバーに直接問い合わせると、反映されたかどうかを切り分けられます。
dig +short NS example.com
dig +short TXT mail2026._domainkey.example.com @ns1.example-dns.jp
ステップ3: 秘密鍵と公開鍵が対になっているか確かめる
OpenDKIM で署名しているサーバーなら、opendkim-testkey で DNS の公開鍵とサーバーの秘密鍵が対になっているかを確かめられます。Debian / Ubuntu では opendkim-tools パッケージに入っています。
sudo apt install opendkim-tools
sudo opendkim-testkey -d example.com -s mail2026 \
-k /etc/opendkim/keys/example.com/mail2026.private -vvv
-k には、OpenDKIM の設定(KeyFile や KeyTable)で指定している秘密鍵のパスを書きます。結果の読み方は次のとおりです。
| 表示 | 意味 |
|---|---|
key OK |
公開鍵を取得でき、秘密鍵とも一致した |
key not secure |
DNSSEC で保護された応答ではない、という意味。DNSSEC を使っていなければ表示されるもので、鍵の誤りではない |
record not found |
公開鍵の TXT レコードが見つからない |
keys do not match |
DNS の公開鍵とサーバーの秘密鍵が対になっていない(鍵を作り直したのに DNS を更新していない、など) |
Revoked key |
p= が空で、鍵が失効している |
秘密鍵のファイルがほかのユーザーから読める状態だと、opendkim-testkey は警告を出します。秘密鍵の所有者を opendkim ユーザーにし、パーミッションを 600 にしておいてください。
送信のたびに署名できているかは、メールのログでも確認できます。Debian / Ubuntu では /var/log/mail.log、systemd の journal だけの環境では journalctl -u opendkim で見ます。
sudo grep "DKIM-Signature field added" /var/log/mail.log | tail -5
# ... opendkim[1234]: 4XyZ12abc: DKIM-Signature field added (s=mail2026, d=example.com)
ステップ4: 受信したメールのヘッダーで検証結果を見る
実際に外部のメールアドレス(Gmail など)へテストメールを送り、受信側の判定を確認します。受信側のサーバーは、検証の結果を Authentication-Results ヘッダーに書き込みます。
Authentication-Results: mx.example.net;
dkim=pass header.i=@example.com header.s=mail2026 header.b=OcUaLkqz;
spf=pass smtp.mailfrom=example.com;
dmarc=pass header.from=example.com
dkim= の値が判定です。
| 値 | 意味 |
|---|---|
pass |
署名を検証できた |
fail |
署名はあるが検証に失敗した(本文やヘッダーの書き換え、鍵の不一致など) |
none |
署名が無い |
neutral |
署名はあるが、書式の誤りなどで処理できなかった(公開鍵が見つからない場合にこの値を使う受信サーバーもある) |
temperror |
DNS の一時的なエラーなどで検証できなかった |
permerror |
必要なヘッダーが無いなど、時間をおいても直らないエラー |
Gmail では、メールを開き、返信アイコンの横にある「その他」アイコンから[メッセージのソースを表示]を選ぶと、DKIM の判定とメールのヘッダー全体が表示されます。
header.i や header.d に出るドメインが、差出人(From)のドメインと一致しているかも見てください。DKIM が pass でも、ドメインが一致していないと DMARC の判定には使われません。
ステップ5: 保存したメールをdkimverifyで検証する
受信したメールを .eml ファイルとして保存しておけば、手元で何度でも検証できます。dkimverify は Python の DKIM ライブラリー dkimpy に付属するコマンドで、Debian / Ubuntu では python3-dkim パッケージに入っています。
sudo apt install python3-dkim
dkimverify < message.eml
# signature ok
検証に通れば signature ok(終了コード 0)、通らなければ signature verification failed(終了コード 1)と表示されます。署名が複数ある場合は、--index 1 のように何番目の署名を検証するかを指定します。
注意点が2つあります。
- 受信したままの形で保存してください。 メールソフトによっては、保存時に改行コードや文字コードを変えるため、本来は正しい署名でも検証に失敗します。Gmail なら[メッセージのソースを表示]の画面から元のメッセージをダウンロードできます。
- dkimverify も DNS から公開鍵を取得します。 鍵を失効させたあとや、セレクターを削除したあとでは、過去のメールも検証に失敗します。
検証用の環境で、署名したメールの本文を1文字だけ変えると、同じ鍵でも検証に失敗することを確認しています。
検証に失敗するよくある原因
| 症状 | よくある原因 | 確かめ方 |
|---|---|---|
dkim=none |
送信サーバーで署名されていない。WordPress のメールが別の経路(PHP の mail() や外部の SMTP)から出ている |
受信メールに DKIM-Signature ヘッダーがあるか |
neutral・permerror など(受信側によって異なる) |
セレクター名の誤り、TXT レコードの登録漏れ、ホスト名の重複(._domainkey.example.com.example.com のようになる) |
ステップ2の dig |
fail(直接送ったメール) |
DNS の公開鍵と署名に使った秘密鍵が対になっていない | ステップ3の opendkim-testkey |
fail(メーリングリストや転送を通ったメール) |
途中で件名に接頭辞が付いた、本文に署名やフッターが足された | 直接送ったメールでは pass になるか |
pass なのに DMARC が fail |
署名のドメイン(d=)と差出人(From)のドメインが一致していない |
header.i / header.d と From を比べる |
なお、milter-greylist はグレイリスティング(初めての送信元を一時的に拒否する迷惑メール対策)のソフトで、DKIM の検証には使いません。DKIM の署名と検証は OpenDKIM や rspamd などのソフトが行います。
まとめ
DKIM の検証は、受信メールの DKIM-Signature からセレクターとドメインを調べ、dig で公開鍵、opendkim-testkey で鍵の対応、受信側の Authentication-Results で実際の判定、dkimverify で保存したメールを確かめる、という順で進めると、どこに問題があるかを切り分けられます。pass になったら、d= のドメインが差出人のドメインと一致しているかも確認しておきます。
関連記事: