Postfix や Dovecot がSNI対応したので、自分の好きなメールサーバー名でメール設定ができるようにしてみた。
目的
現在 mail.example.net のホスト名をメール設定に使っている環境で、mail.example.com, smtp.example.com, pop.example.com, imap.example.com 等の異なるドメイン名のホスト名を複数追加してメール設定に使えるようにしたい。
サイト証明書
今時なら LetsEncriptを使うんだけれど、証明書を作るときにメール用として一つの証明書に複数のホスト名を登録しておくと良いと思う。
LetsEncryptはワイルドカードも使えるようになっているらしいが、今の所ワイルドカード証明書の期限更新は自動でできないみたいなので今回はパス。
# certbot certonly --standalone -m [メールアドレス] -d mail.example.com -d smtp.example.com -d pop.example.com -d imap.example.com
こんな感じでmail/smtp/pop/imap.example.comのサイト証明書を登録する。証明書のディレクトリ名は最初のホスト名になるので、この場合は mail.example.com になる。
現在のサイト証明書 (mail.example.net)
/usr/local/etc/letsencrypt/live/mail.example.net/fullchain.pem /usr/local/etc/letsencrypt/live/mail.example.net/privkey.pem
今回新たに作ったサイト証明書 (mail.example.com, smtp.example.com, pop.example.com, imap.example.com)
/usr/local/etc/letsencrypt/live/mail.example.com/privkey.pem /usr/local/etc/letsencrypt/live/mail.example.com/fullchain.pem
Postfixの設定
注意点
main.cf で、”cert_file =” と “key_file =” は使わずコメントアウトして、 “chain_files =” を使う必要がある。
私はここで引っかかってかなり時間ロスをした。
追記)
上記を確認のため追試してみたら、”cert_file =” と “key_file =” の記述でもちゃんと動いた。
今となっては動かなかった状況を再現できないが、念のため上記注意点は消さずに残しておくことにする。
main.cfの関係する部分だけ以下に示す。
現行のホスト名の証明書の記述を”chain_files =”に変更することと、SNIを有効化するためにマップファイルの記述を追加する。
#cat /usr/local/etc/postfix/main.cf # TLS (smtps) # smtpd_use_tls = yes #smtpd_tls_key_file = /usr/local/etc/letsencrypt/live/mail.example.net/privkey.pem #smtpd_tls_cert_file = /usr/local/etc/letsencrypt/live/mail.example.net/fullchain.pem smtpd_tls_chain_files = /usr/local/etc/letsencrypt/live/mail.example.net/privkey.pem, /usr/local/etc/letsencrypt/live/mail.example.net/fullchain.pem # TSL SNI # tls_server_sni_maps = hash:/usr/local/etc/postfix/tls_server_sni_maps
次に、マップファイルに使いたいホスト名とその証明書のファイルを列挙する。
今回は一つの証明書に複数のホスト名を登録したので証明書の部分は同じものを記述することになる。
また、必ずkeyを先に、fullchainを後に記述すること。
普通はpopやimapなホスト名はここでは使わない。(念為)
#cat /usr/local/etc/postfix/tls_server_sni_maps mail.example.com /usr/local/etc/letsencrypt/live/mail.example.com/privkey.pem /usr/local/etc/letsencrypt/live/mail.example.com/fullchain.pem smtp.example.com /usr/local/etc/letsencrypt/live/mail.example.com/privkey.pem /usr/local/etc/letsencrypt/live/mail.example.com/fullchain.pem
できたファイルをDB化する。
-Fオプションは必須。
#postmap -F /usr/local/etc/postfix/tls_server_sni_maps
このファイルができていればOK。
/usr/local/etc/postfix/tls_server_sni_maps.db
postfixを再起動
#service postfix restart
Dovecotの設定
いじるファイルは”d.conf/10-ssl.conf”のみ
現在のmail.example.netの証明書の記述はそのまま残す。
“local_name”の記述を使いたいホスト名の数だけ追記する。
今回は証明書に複数のホスト名を登録したので証明書の部分は同じものを記述する。
普通、smtpなホスト名はここでは使わない。(老婆心)
#cat /usr/local/etc/dovecot/d.conf/10-ssl.conf ssl_cert = </etc/letsencrypt/live/mail.example.net/fullchain.pem ssl_key = </etc/letsencrypt/live/mail.example.net/privkey.pem local_name mail.example.com { ssl_cert = </usr/local/etc/letsencrypt/live/mail.example.com/fullchain.pem ssl_key = </usr/local/etc/letsencrypt/live/mail.example.com/privkey.pem } local_name pop.example.com { ssl_cert = </usr/local/etc/letsencrypt/live/mail.example.com/fullchain.pem ssl_key = </usr/local/etc/letsencrypt/live/mail.example.com/privkey.pem } local_name imap.example.com { ssl_cert = </usr/local/etc/letsencrypt/live/mail.example.com/fullchain.pem ssl_key = </usr/local/etc/letsencrypt/live/mail.example.com/privkey.pem }
dovecotを再起動
#service dovecot restart
環境
FreeBSD 13.0-RELEASE-p7
postfix-3.7.0_1,1
dovecot-2.3.18
以上