Postfix + Dovecot でSNIを使って複数のサイト証明書を設定して使う方法

未来の自分のためのメモ

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

以上

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です