user icon

Let’s Encryptの証明書をPostfix,Dovecotで利用する

Let’s EncryptでWebサーバのSSL/TLS証明書を結構利用しますが、それをメールサーバで利用してRoundCubeでSSL/TLSでのアクセスを試します。 たまたまドメインを割り当てていたCentOS 7のサーバが有ったのでそれを使いました。

事例ではmail.example.comを既にメールサーバとして設定しているけれど、SSL/TLS設定はしていないものとして進めます。
使用するポートは解放済または解放不要な状態です。

Dovecot

Dovecotはデフォルトでimaps(993)ポートが有効なので、 /etc/dovecot/conf.d/10-ssl.conf で二行編集するだけです。
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem

Postfix

Postfixの方は、まず/etc/postfix/main.cfでlocalhost以外からのアクセスと、証明書のパス指定・キャッシュ設定をして、
# localhost以外からのアクセスを許可
inet_interfaces = all

# SSL/TLS
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
次に/etc/postfix/master.cfでsubmissionポートの解放とSTARTTLS、SMTP認証の使用を設定します。
submission inet n - n - - smtpd
 -o smtpd_tls_security_level=encrypt
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_sasl_type=dovecot
 -o smtpd_sasl_path=private/auth
 -o smtpd_sasl_security_options=noanonymous
 -o smtpd_sasl_local_domain=$myhostname
 -o smtpd_client_restrictions=permit_sasl_authenticated,reject
 -o smtpd_sender_login_maps=hash:/etc/postfix/virtual
# Linuxユーザでログインする場合、そのままではRejectされるので今回は切る
# -o smtpd_sender_restrictions=reject_sender_login_mismatch
-o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject
最後にどちらも再起動。
systemctl restart dovecot postfix

RoundCube

config/config.inc.phpでimap, smtp関連を編集。
// imaps
$config['default_host'] = 'ssl://mail.example.com';
$config['default_port'] = 993;

// smtp submission
$config['smtp_server'] = 'tls://mail.example.com';
$config['smtp_port'] = 587;
ログインして送受信が出来れば完了です。

送信出来ない…

ここで送信出来なくて何故?と色々と調べていたのですが、opensslコマンドでは認証まで通るのにと原因が暫く分からず立ち往生していました。結局原因はLet’s Encryptの証明書が更新されていない古い証明書だったのが原因でした。
何かopensslコマンドでの接続でwarning出てるな、と試している内に気付いたので分かったのですが。
あんまりこのサーバ使ってなかったから証明書も更新してなかったんですね。というわけであんまり起きない原因での失敗でした。

おまけ:smtps(465)ポートでtls_wrappermodeでの接続

古い方法でsmtpsポートを使用してtls_wrappermodeを使っている場合もあるようです。 この場合STARTTLSではなく、RoundCubeのconfig/config.inc.phpのsmtp設定はtls://でなくssl://となりました。
// smtps tls_wrappermode
$config['smtp_server'] = 'ssl://mail.example.com';
$config['smtp_port'] = 465;
Facebooktwitterlinkedintumblrmail
名前
E-mail
URL
コメント

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)