Webサイトを保護するのと同じLet’s Encrypt証明書で、メール接続も暗号化できます。このガイドでは、最も一般的なメールサーバーへのTLS設定を解説します。
メールにTLSが必要な理由
TLSがなければ、メールトラフィック(パスワードやメッセージ内容を含む)は平文で送信されます:
- SMTP(メール送信)— ポート25/587はデフォルトで暗号化されません
- IMAP(メール受信)— ポート143はデフォルトで暗号化されません
- POP3(メール受信)— ポート110はデフォルトで暗号化されません
TLSはHTTPSがWebトラフィックを暗号化するのと同じ方法で、これらの接続を暗号化します。最新のメールクライアントはTLSを期待しており、暗号化されていない接続についてユーザーに警告します。
証明書のセットアップ
GetHTTPSから取得した同じ証明書ファイルをWebサーバーとメールサーバーの両方に使用できます。ただし、証明書がメールサーバーのホスト名(例:mail.example.com)をカバーしている必要があります。
メールホスト名をカバーする証明書を取得する:
- GetHTTPSで
mail.example.com(またはMXレコードが指すホスト名)を追加します - Webドメインと一緒に含めることができます:
example.com+www.example.com+mail.example.com - ファイルをダウンロードします:
fullchain.pem、privkey.pem
Postfix(SMTP)
/etc/postfix/main.cfを編集します:
# TLS for outbound mail (sending)
smtp_tls_security_level = may
smtp_tls_loglevel = 1
# TLS for inbound mail (receiving) — STARTTLS on port 25/587
smtpd_tls_cert_file = /etc/ssl/gethttps/fullchain.pem
smtpd_tls_key_file = /etc/ssl/gethttps/privkey.pem
smtpd_tls_security_level = may
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_loglevel = 1
サブミッション(ポート587)用に/etc/postfix/master.cfを編集します:
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
リロード: sudo systemctl reload postfix
Dovecot(IMAP/POP3)
/etc/dovecot/conf.d/10-ssl.confを編集します:
ssl = required
ssl_cert = </etc/ssl/gethttps/fullchain.pem
ssl_key = </etc/ssl/gethttps/privkey.pem
ssl_min_protocol = TLSv1.2
ssl_prefer_server_ciphers = no
ファイルパスの前の<に注意してください。Dovecotはこの構文でファイルの内容をインラインで読み込みます。
リロード: sudo systemctl reload dovecot
IMAP/POP3ポート
| サービス | 暗号化なし | STARTTLS | 暗黙のTLS(推奨) |
|---|---|---|---|
| IMAP | 143 | 143(アップグレード) | 993 |
| POP3 | 110 | 110(アップグレード) | 995 |
| SMTPサブミッション | 587 | 587(アップグレード) | 465(smtps) |
最新のメールクライアントは暗黙のTLSポート(993、995、465)に接続する必要があります。STARTTLSポートと併せて、DovecotとPostfixでこれらを設定してください。
メールTLSを検証する
# Test SMTP STARTTLS
openssl s_client -connect mail.example.com:587 -starttls smtp
# Test IMAP implicit TLS
openssl s_client -connect mail.example.com:993
# Test SMTP implicit TLS (smtps)
openssl s_client -connect mail.example.com:465
Verify return code: 0 (ok)と証明書の詳細が表示されることを確認してください。
更新
Let’s Encrypt証明書を更新する際は、ファイルを置き換えて、Webサーバーとメールサーバーの両方をリロードしてください:
sudo systemctl reload nginx # web
sudo systemctl reload postfix # SMTP
sudo systemctl reload dovecot # IMAP
Certbotで--deploy-hookを使用している場合は、フックスクリプトにメールサーバーのリロードを追加してください。
よくある質問
WebとメールでSSL証明書を共用できますか?
はい。証明書のSAN(Subject Alternative Name)にメールサーバーのホスト名が含まれていれば可能です。MXがmail.example.comを指している場合、証明書のリクエスト時にその名前を含めてください。
Let’s Encryptはメールサーバーに使えますか?
はい。Let’s Encrypt証明書は、TLS対応のあらゆるサービスで動作する標準的なX.509証明書です。Webサーバー専用ではありません。証明書はHTTPS、SMTP、IMAP、その他何に使用されているかを認識しません。
メールプロトコルごとに別々の証明書が必要ですか?
いいえ。1つの証明書でSMTP(Postfix)、IMAP(Dovecot)、Webサーバーを同時に使用できます。すべてのサービスから同じfullchain.pemとprivkey.pemを参照してください。
Microsoft Exchangeの場合は?
ExchangeはPFX/PKCS#12形式を使用します。PEMファイルをPFXに変換し、Exchange管理センター → Servers → Certificates → Importからインポートしてください。手順はIISの証明書インストールと同様です。