Postfix, OpenDKIMはインストール済み、firewallも適切に設定済みであると仮定。
鍵ペアの作成
1 2 3 4 5 6 |
cd /etc/opendkim/keys/ mkdir example.com cd example.com opendkim-genkey -d example.com -s selector chown opendkim:opendkim * chmod 440 *.private |
※複数のドメインを異なるキーペアで認証する場合は上記を繰り返し、必要数分キーペアを作成する。ドメインが異なればセレクタ名は同じでも大丈夫だが、混乱を避けるため変えてもよいと思う。
OpenDKIMの設定
1つのドメインしか扱わない場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
: # 認証するドメイン名 Domain example.com : # セレクタ名 Selector selector : # 署名に使う秘密鍵の場所 KeyFile /etc/opendkim/keys/selector.private : # 署名に使う秘密鍵の場所(複数ある場合) #KeyTable /etc/opendkim/KeyTable : # 署名を行うドメイン+セレクタのペアを指定するファイル(複数ある場合) #SigningTable refile:/etc/opendkim/SigningTable : |
複数のドメインを扱うが、すべて同じキーペアを使う場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
: # 認証するドメイン名 Domain example.com, hoge.com, fuga.com または Domain example.com, * Domain * : # セレクタ名 Selector selector : # 署名に使う秘密鍵の場所 KeyFile /etc/opendkim/keys/selector.private : # 署名に使う秘密鍵の場所(複数ある場合) #KeyTable /etc/opendkim/KeyTable : # 署名を行うドメイン+セレクタのペアを指定するファイル(複数ある場合) #SigningTable refile:/etc/opendkim/SigningTable : |
複数のドメイン、複数のキーペアを扱う場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
: # 認証するドメイン名 #Domain example.com : # セレクタ名 #Selector selector : # 署名に使う秘密鍵の場所 #KeyFile /etc/opendkim/keys/selector.private : # 署名に使う秘密鍵の場所(複数ある場合) KeyTable /etc/opendkim/KeyTable : # 署名を行うドメイン+セレクタのペアを指定するファイル(複数ある場合) SigningTable refile:/etc/opendkim/SigningTable : |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# 作成者認証(例)################################ # ①FROMドメインが"example.com"の時は"selector"セレクタを使い、 # "example.com"の署名を使い認証する *@example.com selector._domainkey.example.com # ②FROMドメインが"hoge.com"の時は"selector"セレクタを使い、 # "hoge.com"の署名を使い認証する *@hoge.com selector._domainkey.hoge.com # ③FROMドメインが"hoge.com"の時は"selector_hoge"セレクタを使い、 # "hoge.com"の署名を使い認証する *@hoge.com selector_hoge._domainkey.hoge.com # ④FROMドメインが上記以外の時は"selector"セレクタを使い # "example.com"の署名を使い認証する(1番目と同じキーペアを使う) *@* selector._domainkey.example.com # 第三者認証(例)################################ # ⑤FROMドメインが"fuga.com"の時は"selector"セレクタを使い、 # "example.com"の署名を使い認証する *@fuga.com selector._domainkey.example.com # ⑥FROMドメインが"fuga.com"の時は"selector_fuga"セレクタを使い、 # "example.com"の署名を使い認証する *@fuga.com selector_fuga._domainkey.example.com # ⑦FROMドメインが上記以外の時は"selector_common"セレクタを使い # "dkim.example.com"の署名を使い認証する *@* selector_common._domainkey.dkim.example.com |
※上から順に処理されるので、ワイルドカード(ex: *@*, *@*.example.com, *@sub.*)を使うとその下の行は無効になる。ドメインを明示的に指定する場合はワイルドカード行の上に書いておく。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# セレクタが"selector"、 # 署名ドメインが"example.com" の時使うキーペアを指定 selector._domainkey.example.com example.com:selector:/etc/opendkim/keys/example.com/selector.private # セレクタが"selector" # 署名ドメインが"hoge.com" の時使うキーペアを指定 selector._domainkey.hoge.com hoge.com:selector:/etc/opendkim/keys/hoge.com/selector.private # セレクタが"selector_hoge" # 署名ドメインが"hoge.com" の時使うキーペアを指定 selector_hoge._domainkey.hoge.com hoge.com:selector_hoge:/etc/opendkim/keys/hoge.com/selector_hoge.private # セレクタが"selector" # 署名ドメインが"fuga.com" の時使うキーペアを指定 selector._domainkey.fuga.com fuga.com:selector:/etc/opendkim/keys/fuga.com/selector.private # セレクタが"selector_fuga" # 署名ドメインが"fuga.com" の時使うキーペアを指定 selector_fuga._domainkey.fuga.com fuga.com:selector_fuga:/etc/opendkim/keys/fuga.com/selector_fuga.private # セレクタが"selector_common" # 署名ドメインが"dkim.example.com" の時使うキーペアを指定 selector_common._domainkey.dkim.example.com dkim.example.com:selector_common:/etc/opendkim/keys/dkim.example.com/selector_common.private |
キーペアの公開鍵を取得
1 2 3 4 5 |
# 例:セレクタが"selector" 署名ドメインが"example.com" の公開鍵 cat /etc/opendkim/keys/example.com/selector.txt ↓ selector._domainkey IN TXT ( "v=DKIM1; k=rsa; " "p=MIGfMA0GCS..." ) ; ----- DKIM key selector for example.com・ |
公開鍵をDNSに登録
①FROMドメインが“example.com”で“example.com”の署名を使い作成者認証する場合は、”example.com”のDNSサーバに公開鍵を登録。
項目 | 値 |
---|---|
Name | selector._domainkey |
Type | TXT |
Value | “v=DKIM1; k=rsa; p=MIGfMA0GCS…” |
ポリシーが登録されてなければポリシーも登録。
項目 | 値 |
---|---|
Name | _policy._domainkey |
Type | TXT |
Value | “t=y; o=~” |
項目 | 値 |
---|---|
Name | _domainkey |
Type | TXT |
Value | “t=y; o=~” |
②~③FROMドメインが”hoge.com”で“hoge.com”の署名を使い作成者認証する場合は、”hoge.com”のDNSサーバに公開鍵を登録。
④FROMドメインが”任意のドメイン”で“example.com”の署名を使い作成者認証する場合は、任意ドメインのDNSサーバに公開鍵を登録。
⑤~⑥FROMドメインが”fuga.com”で“example.com”の署名を使い第三者認証する場合は、“example.com”ドメインのDNSサーバに公開鍵を登録。
⑦FROMドメインが”任意のドメイン”で“dkim.example.com”の署名を使い第三者認証する場合は、“dkim.example.com”ドメインのDNSサーバに公開鍵を登録。
項目 | 値 |
---|---|
Name | selector_common._domainkey.dkim |
Type | TXT |
Value | “v=DKIM1; k=rsa; p=MIGfMA0GCS…” |
項目 | 値 |
---|---|
Name | _policy._domainkey.dkim |
Type | TXT |
Value | “t=y; o=~” |
項目 | 値 |
---|---|
Name | _domainkey.dkim |
Type | TXT |
Value | “t=y; o=~” |
レコード返却の確認
1 2 3 4 5 6 |
#dig selector._domainkey.ドメイン名 TXT @レコードを登録したDNSサーバ dig selector._domainkey.example.com TXT @ns.example.com ↓ # ANSWERセクションに登録した値が返ってくればOK ;; ANSWER SECTION: selector._domainkey.example.com. 360 IN TXT "v=DKIM1\; k=rsa\; p=MIGfMA0GCS..." |
Postfixの設定
1 2 3 4 |
# 末尾に以下を追記 smtpd_milters = inet:127.0.0.1:8891 non_smtpd_milters = $smtpd_milters milter_default_action = accept |
サービス再起動
1 2 |
service opendkim restart service postfix restart |
確認
Gmailが一番わかりやすいので、Gmailでテスト
1 |
echo "DKIM test." | mail -s "DKIM test" -r someone@example.com user@gmail.com |
受信したメールで、DKIMがPassで、ヘッダが以下のようになってればOK。
作成者認証の場合
DKIMSignature: | (~略~) d=example.com; s=selector; b=xdIeG4cUHIBhU0nix2V5tK9Z (~略~) |
From: | <someone@example.com> |
第三者認証の場合
DKIMSignature: | (~略~) d=example.com; s=selector; b=xdIeG4cUHIBhU0nix2V5tK9Z (~略~) |
From: | <someone@hoge.com> |
参考サイト)