参考サイト
DKIMのインストール
インストールできるかの確認
yum info opendkim
インストール
sudo yum install opendkim
インストールできているかの確認
yum list installed | grep opendkim
インストールによってopendkimユーザが作成されているはず
$ id opendkim
uid=498(opendkim) gid=499(opendkim) 所属グループ=499(opendkim),12(mail)
インストールができたら鍵の生成を行う
鍵の生成
鍵を保存するディレクトリを作成
mkdir /etc/opendkim/keys/mydomain.com
opendkim-genkey が使えるかの確認
opendkim-genkey --help
なければ opendkim-tools をインストール
sudo yum install opendkim-tools
# -s はセレクタ(鍵の名前)
$ sudo opendkim-genkey -D /etc/opendkim/keys/mydomain.com/ -d mydomain.com -s default
default.private と default.txt の二つのファイルができていることを確認
$ sudo ls keys/mydomain.com
default.private default.txt
default.private
(秘密鍵)default.txt
(公開鍵)
opendkim からファイルにアクセスできるよう、所有者を変更
$ sudo chown -R opendkim:opendkim /etc/opendkim/keys/mydomain.com/
DNSの設定
DNSにTXTレコードを追加する
さきほど作ったファイル default.txt に登録する内容が書いてある
$ sudo cat /etc/opendkim/keys/mydomain.com/default.txt
[sudo] password for user1:
default._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ) ; ----- DKIM key default for mydomain.com
v=DKIM1
は、DKIMのバージョン。k=rsa
は、鍵のアルゴリズムがRSAであることを示す。p=xxxxxx
は、公開鍵の値。
なお、本記事冒頭の参考ブログに書いてあったADSPレコードの登録は現在は必要ない
DNSに反映されたかの確認
dig txt default._domainkey.mydomain.com
動作テスト
$ opendkim-testkey -d mydomain.com -s default -vvv #-vvvは詳細表示
エラーが出る
opendkim-testkey: /etc/opendkim/keys/default.private: stat(): No such file or directory
default.private がないらしい。
opendkim-testkey
コマンドは、デフォルトで/etc/opendkim/keys/
ディレクトリを参照するが、秘密鍵のディレクトリが異なる場合、OpenDKIMの設定ファイルやコマンドに正しいパスを指定する必要がある。
OpenDKIMの設定ファイル/etc/opendkim.conf
を確認して、鍵ファイルの場所を正しく指定する。
opendkim.conf を念のためコピーしたら以下のように編集。
秘密鍵のパスを指定するには、KeyFile とKeyTable のいずれを使う。1つのサーバーで複数のドメインやセレクタを運用する場合は、KeyTable を選択する。以下のように書き換える。
KeyFile /etc/opendkim/keys/default.private
# KeyTable /etc/opendkim/KeyTable
↓↓↓ KeyFile を無効にして KeyTable を有効化
# KeyFile /etc/opendkim/keys/default.private
KeyTable /etc/opendkim/KeyTable
KeyTable に以下を記述
#一行で
default._domainkey.mydomain.com mydomain.com:default:/etc/opendkim/keys/mydomain.com/default.private
$ opendkim-testkey -d mydomain.com -s default -vvv #-vvvがないとエラー以外何も出ない
KeyTable を使用する場合 SigningTable も必要なので有効にする
# SigningTable refile:/etc/opendkim/SigningTable
↓↓↓
SigningTable refile:/etc/opendkim/SigningTable
その他 opendkim.conf の変更箇所
Mode v
↓
Mode sv
SoftwareHeader yes
↓
SoftwareHeader no
# ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
↓
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
# InternalHosts refile:/etc/opendkim/TrustedHosts
↓
InternalHosts refile:/etc/opendkim/TrustedHosts
# OpenDKIMとPostfixの通信方法
# 同じサーバー上に存在するのでローカルソケットを利用
#Socket inet:8891@localhost
Socket local:/run/opendkim/opendkim.sock
↓
Socket inet:8891@localhost
#Socket local:/run/opendkim/opendkim.sock
SigningTableの記述例
*@[ドメイン名] ._domainkey.[ドメイン名]
# 例 *はワイルドカードで、すべてのアドレスを意味する
*@mydomain.com default._domainkey.mydomain.com
opendkim が起動しているか
service opendkim status
自動起動の確認
chkconfig --list opendkim #centOS6.8
もしくは
sudo systemctl is-enabled opendkim #almalinux9
サーバー再起動時の自動起動
sudo chkconfig opendkim on #centOS6.8
もしくは
sudo systemctl enable opendkim #almalinux9
postfixとDKIMを連携させる
postfix 利用時に DKIMを利用するための設定パラメータを main.cf の最下段に記述する
# DKIMと連携させるための記述
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
設定のエラーチェック
postfix check
再起動して反映
送信テスト
$ echo "テストメールです" | sendmail -t -f renraku@example.com test@gmail.com
届いたgmailのソースを見て DKIM:’PASS’ となっていれば成功
しかし、運営サイトのwebフォームから送ったら DKIM:’FAIL’ となった。
メールのソースを見ると body hash did not verify となっている。どうも、改行コードが「\n」でなく「\r\n」になっていると、このエラーになるらしい。PHPファイルを確認すると、ファイルの改行コードがCRLFになっており、本文に改行(\nや\r\nではない)が入っている。この改行を削除したら DKIM:’PASS’ となった。
エラー解決参考
さくらのメールボックスのwebメールで送信するときのDKIM認証
ここまでの設定は、運営しているwebサーバーから送信したメールのDKIM認証のやり方で、さくらのメールボックスのwebメールから送信する場合などは、DKIM認証されない。webメールを送信する場合、さくらのメールボックスのSMTPサーバーを経由するので、さくらインターネットのSMTPサーバーがDKIM署名を行う必要がある。そのSMTPサーバー上での設定がさらに必要
やり方のページ
上記URLを参考にwebサーバー上にある秘密鍵を、さくらのメールボックスのSMTPサーバーにアップロードする。セレクタ名も同じにして、設定を完了すればwebメールやiphoneからの送信もDKIM認証が使えるようになる。
DMARCの設定
SPFとDKIMの設定が終わったらDMARCも設定する
DNSサーバーの設定
ホスト名
_dmarc.<ドメイン名>
txtレコード
v=DMARC1; p=none; rua=mailto:dmarc-reports@example.com
openDKIMをmonitに監視対象にする
check process opendkim with pidfile /var/run/opendkim/opendkim.pid
start program = "/usr/sbin/service opendkim start"
stop program = "/usr/sbin/service opendkim stop"
if 5 restarts within 5 cycles then timeout
monitを再起動
$ sudo /sbin/service monit restart
確認
sudo monit summary
openDKIMを停止して、再起動するか見てみる
$ sudo /sbin/service opendkim stop