量産メモ帳

忘れっぽいのでメモを残しています。浅く適当に書きます。

DKIMキーの長さを調べて、メールが成り済ましかどうかを見極める。

スポンサーリンク

つい先日、話題なった以下の記事を読み、他人事のように「へー!」と感心していた。

その一方で、つい最近、利用している某サイトから送られてくる複数種のメールを受け取るためのアドレスを一括で変更したのに、
数日経っても一部のメールだけしか新しいアドレスに送られて来なくて、それ以外は古いアドレスに送らて来るという問題が起きていた。


「どうせ設定変更処理がバグっていて変更が反映されていないんだろう。」と思いつつ、カスタマーサポートに問い合わせると、
「そんなメールは送っていません。全て新しいアドレスに送っているはずです。」という予想外の回答をもらった。
「絶対嘘!コイツは何も分かっていない!」と思いつつも、それと同時に Wired に書かれていた Google の事件を思い出してしまい、
「もしかして、古いアドレスに送られてくるメールは成り済まし?」という疑いが湧いてきて、自分でも DKIM キーのビット長を調べてみようということになった。


ちなみに私はネットワークやセキュリティに関して疎い方で、DKIM なんて今まで知らなかったぐらいなので、自分の調査方法が正しいかどうか自信はない。


そんな素人な私は以下の手順で確認した。

  1. メールのヘッダにある DKIM-Signature からドメイン名とセレクタ値を見つける。
  2. ドメイン名とセレクタ値からホスト名を導き出す。
  3. ホスト名を dig コマンドに渡して、DKIM キー(公開鍵)をテキスト表示する。
  4. テキスト表示した公開鍵をファイルに保存する。
  5. 公開鍵を記したファイルを openssl コマンドに渡して、DKIM キー(暗号鍵)のビット長を調べる。



以下、Google の例を使って、より具体的な方法を記す。


(1) まず、DKIM-Signature からドメイン名とセレクタ値を見つける方法は割りと簡単。

  1. 受信メールのヘッダを全表示にする。
  2. ヘッダの中にある DKIM-Signature のドメイン名(d)タグとセレクタ(s)タグの値を取得する。
    • (例) d=google.com; s=20120113



(2) 次に、取得したドメイン名とセレクタ値からホスト名を導き出す方法は以下の通り。



(3) dig コマンドの実行方法はこんな感じ。例に用いた 8.8.8.8 は Google Public DNS のアドレス。

  • dig @DNSサーバー名 ホスト名 txt +tcp
    • (例) dig @8.8.8.8 20120113._domainkey.google.com txt +tcp



Windows には標準で dig コマンドがないので、以下のサイトからダウンロードさせていただいた。



コマンドの実行例はこんな感じ。


>dig @8.8.8.8 20120113._domainkey.google.com txt +tcp

; <<>> DiG 9.3.2 <<>> @8.8.8.8 20120113._domainkey.google.com txt +tcp
; (1 server found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1143
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;20120113._domainkey.google.com. IN TXT

;; ANSWER SECTION:
20120113._domainkey.google.com. 43198 IN TXT "k=rsa\; p= ((長いので改行した。))
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp5kQ31/aZDreQqR9/ikNe00ywRvZBFHod6dja+Xdui4C1y8SVrkUMQQL
OO49UA+ROm4evxAru5nGPbSl7WJzyGLl0z8Lt+qjGSa3+qxf4ZhDQ2chLS+2g0Nnzi6coUpF8r" "juvuWHWXnzpvLxE5TQdfgp8
yziNWUqCXG/LBbgeGqCIpaQjlaA6GtPbJbh0jl1NcQLqrOmc2Kj2urNJAW+UPehVGzHal3bCtnNz55sajugRps1rO8lYdPamQjLE
JhwaEg6/E50m58BVVdK3KHvQzrQBwfvm99mHLALJqkFHnhyKARLQf8tQMy8wVtIwY2vOUwwJxt3e0KcIX6NtnjSSwIDAQAB"

;; Query time: 77 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Thu Nov 08 17:26:52 2012
;; MSG SIZE rcvd: 463

この内、pタグの値が DKIM キー(公開鍵)のテキストである。


(4) (3)で取得した公開鍵のテキストは以下の形式でファイルに保存する。

  • ファイルの先頭は -----BEGIN PUBLIC KEY----- とする。
  • ファイルの最後は -----END PUBLIC KEY----- とする。
  • テキスト表示した公開鍵に含まれるダブルクォート(")やスペースは削除する。
  • ファイルに保存する公開鍵は一行あたり78文字までとする。78文字を超える場合、そこで改行する。



今回の例だと、ファイルの中はこんな感じになる。


­-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp5kQ31/aZDreQqR9/ikNe00ywRvZBFHod
6dja+Xdui4C1y8SVrkUMQQLOO49UA+ROm4evxAru5nGPbSl7WJzyGLl0z8Lt+qjGSa3+qxf4ZhDQ2
chLS+2g0Nnzi6coUpF8rjuvuWHWXnzpvLxE5TQdfgp8yziNWUqCXG/LBbgeGqCIpaQjlaA6GtPbJb
h0jl1NcQLqrOmc2Kj2urNJAW+UPehVGzHal3bCtnNz55sajugRps1rO8lYdPamQjLEJhwaEg6/E50
m58BVVdK3KHvQzrQBwfvm99mHLALJqkFHnhyKARLQf8tQMy8wVtIwY2vOUwwJxt3e0KcIX6NtnjSS
wIDAQAB
­-----END PUBLIC KEY-----



(5) (4)で公開鍵をテキスト保存したファイルを openssl コマンドの引数に渡す。

  • openssl rsa -noout -text -pubin < ファイルパス



ただし、openssl も Windows には標準装備されていないので、こちらから Windows 版 OpenSSL をダウンロードさせていただいた。



私の環境でのコマンドの実行条件と結果は以下の通り。

実行条件:

  • 公開鍵を保存したファイルのパス … C:\Temp\GooglePublicKey.txt



実行結果:


C:\OpenSSL-Win64\bin>openssl.exe rsa -noout -text -pubin < C:\Temp\GooglePublicKey.txt
WARNING: can't open config file: /usr/local/ssl/openssl.cnf
Public-Key: (2048 bit)
Modulus:
00:a7:99:10:df:5f:da:64:3a:de:42:a4:7d:fe:29:
0d:7b:4d:32:c1:1b:d9:04:51:e8:77:a7:63:6b:e5:
dd:ba:2e:02:d7:2f:12:56:b9:14:31:04:0b:38:ee:
3d:50:0f:91:3a:6e:1e:bf:10:2b:bb:99:c6:3d:b4:
a5:ed:62:73:c8:62:e5:d3:3f:0b:b7:ea:a3:19:26:
b7:fa:ac:5f:e1:98:43:43:67:21:2d:2f:b6:83:43:
67:ce:2e:9c:a1:4a:45:f2:b8:ee:be:e5:87:59:79:
f3:a6:f2:f1:13:94:d0:75:f8:29:f3:2c:e2:35:65:
2a:09:71:bf:2c:16:e0:78:6a:82:22:96:90:8e:56:
80:e8:6b:4f:6c:96:e1:d2:39:75:35:c4:0b:aa:b3:
a6:73:62:a3:da:ea:cd:24:05:be:50:f7:a1:54:6c:
c7:6a:5d:db:0a:d9:cd:cf:9e:6c:6a:3b:a0:46:9b:
35:ac:ef:25:61:d3:da:99:08:cb:10:98:70:68:48:
3a:fc:4e:74:9b:9f:01:55:57:4a:dc:a1:ef:43:3a:
d0:07:07:ef:9b:df:66:1c:b0:0b:26:a9:05:1e:78:
72:28:04:4b:41:ff:2d:40:cc:bc:c1:5b:48:c1:8d:
af:39:4c:30:27:1b:77:7b:42:9c:21:7e:8d:b6:78:
d2:4b
Exponent: 65537 (0x10001)

"Public-Key: (2048 bit)"となっていることから、最初の記事の最後にも書かれていたけど、Google の暗号鍵のビット長は今では 2048 ビットになっているようだ。


一方、私が問題視したサイトから送られてきているメールの DKIM の暗号鍵も 2048 ビットになっていることが分かったので、成り済ましの可能性は低いようだ。


追記:
カスタマーサポートに再度問い合わせてみたところ、「やっぱり変更前のアドレスにメールを送っていました。サーセン!」という返事をもらった。
ほら!やっぱりね!


参考資料:

関連記事: