Let’s Encrypt を利用したメールサーバー( Postfix と Dovecot )の暗号化

前回は、自己証明書で暗号化(SSL化)を進めましたが、MUAによっては証明書検証でエラーが出ることがあるため、問題となる場合があります。そのため、今回は、Let’s Encrypt という無料のドメイン認証(DV)証明書を発行してくれるサービスを利用して、暗号化(SSL化)する方法を紹介します。

メールサーバーを構築するにあたり、SMTP認証やメール(SMTP)の暗号化などの概要を理解したい方は以下を参考にしてください。

私は qmail で POP before SMTP という古い仕組みを使い続けていたため、SMTP認証とメールの暗号化について理解が曖昧なところがありました。また、Submi...

Let’s Encrypt について

Let’s Encrypt は、認証局(CA)として「SSL/TLSサーバ証明書」を無料で発行し、TLS や HTTPS を普及させることを目的としているプロジェクトです。2016年4月12日 に正式サービスが開始されました。非営利団体の ISRG (Internet Security Research Group) が運営しおり、シスコ(Cisco Systems)、Akamai、電子フロンティア財団(Electronic Frontier Foundation)、モジラ財団(Mozilla Foundation)などの大手企業・団体が、スポンサーとして支援しています。

なお、Let’s Encryptで発行される証明書は、有効期限が3ヵ月であるため、期限が切れる前に更新が必要です。詳しくは、公式サイトをご確認ください。

https://letsencrypt.jp/

スポンサーリンク

Let’s Encryptで証明書を発行する

Let’s Encryptで証明書を発行するには、certbot という Let’s Encrypt が発行しているツールを利用します。CentOSでは、以下のコマンドでインストールできます。

# yum -y install epel-release
# yum -y install certbot

今回は、http通信を利用して証明書を発行するため、ファイヤウォールでTCPの80ポートを許可します。

# firewall-cmd --permanent --zone=public --add-service=http
# firewall-cmd --reload

本サーバーはメールサーバで webサーバーがないため、certbot スタンドアロンモードで動作させ、certbot でweb通信を実施し証明書を取得します。以下のコマンドで、certbot を起動します。(以下では、自身のドメインは example.com として紹介しています。)
mx.example.com は、Postfixの設定で myhostname に設定した、完全修飾ドメイン(DNSで名前が引けるMXレコード)を指定します。証明書の更新日が近くなると、指定したメールアドレスにメールが届きます。

# certbot certonly --standalone -d mx.example.com -m メールアドレス --agree-tos -n

以下のコマンドで、証明書が取得できていることが確認できます。それぞれ最新へのシンボリックリンクとなっています。(※ 更新の度に自動更新されるので、証明書としてシンボリックリンクを利用ます。)

# ls -la /etc/letsencrypt/live/mx.example.com/

取得したファイルの意味は、以下の通りです。

  • privkey.pem:SSL/TLS サーバ証明書の公開鍵に対応する秘密鍵
  • cert.pem:SSL/TLS サーバ証明書(公開鍵を含む)
  • chain.pem:中間証明書
  • fullchain.pem:中間証明書とサーバ証明書

その他 certbot の詳しい利用法は、以下を参照するのが良いです。
https://letsencrypt.jp/usage/#GetCertificate
https://letsencrypt.jp/docs/using.html
注意することは、現在(私が試したのは、2018/9/22 頃) ドメイン使用権の認証方法の1つである tls-sni-01 は、他人のドメイン名でサーバ証明書取得ができてしまう脆弱性あるらしく、利用ができないようです。
http-01 か、dns-01 を指定します。

Postfixの設定

/etc/postfix/main.cf に以下の設定を追加します。(※ 前回 自己証明書を設定している場合は、それを書き換えます。)

1
2
smtpd_tls_key_file = /etc/letsencrypt/live/mx.example.com/privkey.pem
smtpd_tls_cert_file = /etc/letsencrypt/live/mx.example.com/fullchain.pem

Postfixを再起動します。

# systemctl reload postfix

Dovecotの設定

/etc/dovecot/conf.d/10-ssl.conf に以下の設定を追加します。(※ 前回 自己証明書を設定している場合は、それを書き換えます。)

1
2
ssl_cert = </etc/letsencrypt/live/mx.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mx.example.com/privkey.pem

Dovecot を再起動します。

# systemctl reload dovecot

自動更新

以下のコマンドで、cron で「毎週 日曜日の2時20分」に証明書の更新を行う設定をします。証明書の更新が行われた場合、PostfixとDovecotの再起動を行います。(※ 証明書は、有効期限切れの1ヵ月前から更新可能になります。更新されなかった場合は、サーバーの再起動は行われません。)

# echo '20 2 * * 0 root /bin/certbot renew --standalone --post-hook "systemctl reload postfix && systemctl reload dovecot"' >> /etc/cron.d/renew_letsencrypt
# chmod 400 /etc/cron.d/renew_letsencrypt