【Postfix】Gmailの「赤い南京錠マーク」を消す!Let’s Encrypt証明書で組むSMTP送信TLS暗号化の完全手順

この記事は約8分で読めます。
この記事が役立ったらブックマーク! あとで読み返したり、環境構築時のリファレンスに活用できます
B! はてなブックマークに追加

自宅サーバーでブログを運用していると、バックアップスクリプトの実行結果やWordPressのコメント通知、セキュリティアラートなどを自分のGmail宛てに送信する場面が多々あります。
しかし、デフォルト設定のままメールサーバー(Postfix等)から送信すると、Gmailでメールを開いた際に送信元アドレスの横に「赤い開いた南京錠のアイコン(暗号化されていません)」が表示されてしまうことがあります。
これは、自前のサーバーとGoogleのメールサーバーとの間の通信が平文(暗号化なし)で行われていることを意味しており、セキュリティ上好ましくないだけでなく、迷惑メールフォルダに直行する大きな原因になります。

本記事では、Webサーバー用の無料SSL証明書(Let’s Encrypt / Certbot)を流用し、Postfixの送信時(SMTPクライアント)および受信時(SMTPサーバー)のTLS暗号化を有効化して、Gmailに安全なメールとして届ける設定手順をまとめました。

1. 赤い南京錠が表示される原因

Gmailは、メールの送受信経路で TLS(Transport Layer Security)暗号化 が使われていないメールに対して、ユーザーへ注意を促すために赤い南京錠アイコンを表示します。

  • 問題点:
    • 経路上の通信が盗聴・改ざんされるリスクがある。
    • Googleのスパム判定フィルターにおいて評価が下がり、迷惑メール扱い(Spam)になりやすい。
  • 解決策:
    • 自宅サーバー側のPostfixに有効なTLS証明書を設定し、外部サーバーへの配送時に 「TLS暗号化通信(STARTTLS)」を優先・必須化 する。

2. Let’s Encrypt証明書の確認

すでにWordPress等のWebサーバー(Nginx / Apache)でLet’s Encryptを利用している場合、既存の証明書ファイルをそのままPostfixに適用できます。

通常、証明書は以下のパスに配置されています。

  • 証明書(フルチェーン): /etc/letsencrypt/live/<ドメイン名>/fullchain.pem
  • 秘密鍵: /etc/letsencrypt/live/<ドメイン名>/privkey.pem

※Postfix(postfix ユーザー)が秘密鍵を読み取れるよう、パーミッションに注意してください(通常はroot権限でPostfixデーモンが読み込むため問題ありません)。

3. Postfixの設定(/etc/postfix/main.cf)

Postfixの設定ファイルを開いて、TLS関連のパラメータを編集・追記します。

Bash
sudo nano /etc/postfix/main.cf

追記・変更する設定内容

Plaintext
# ==========================================
# 🔒 TLS / 暗号化設定
# ==========================================

# 証明書と秘密鍵のパス(Let's Encryptのパスを指定)
smtpd_tls_cert_file = /etc/letsencrypt/live/example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/example.com/privkey.pem

# 受信側(サーバーとしてメールを受け取る際)のTLS有効化
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1

# 送信側(Gmail等へメールを送り出す際)のTLS有効化 ★最重要★
smtp_tls_security_level = may
smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1

# CA証明書のパス(外部サーバーの証明書を検証するため)
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

設定のポイント

  • smtp_tls_security_level = may:
    • 相手先サーバー(Googleなど)がTLSに対応していれば、自動的に暗号化接続(Opportunistic TLS / STARTTLS)を行います。
  • !TLSv1, !TLSv1.1:
    • 脆弱性のある古いプロトコルを無効化し、安全なTLS 1.2 / TLS 1.3での通信を強制します。

4. 設定の反映とテスト送信

設定ファイルを保存したら、Postfixを再起動して設定を反映させます。

Bash
sudo systemctl restart postfix

テストメールの送信

コマンドラインからGmail宛てにテストメールを送信します。

Bash
echo "Postfix TLS Test Body" | mail -s "Postfix TLS Test Subject" your_email@gmail.com

メールログの確認

/var/log/mail.log(または journalctl -u postfix)を確認し、TLSハンドシェイクが成功しているかを点検します。

Bash
sudo tail -n 20 /var/log/mail.log

以下のようなログ行が出力されていれば成功です。

Plaintext
postfix/smtp[xxxxx]: Untrusted TLS connection established to gmail-smtp-in.l.google.com[xxx.xxx.xxx.xxx]:25: TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256

TLS connection established ... TLSv1.3 と出ていれば、Googleのサーバーと強固な暗号化通信でハンドシェイクできています。

5. Gmail側での確認

届いたメールをGmailで開いて確認します。

  1. メールの差出人名の横にある 詳細アイコン(小さな下矢印「▼」) をクリック。
  2. 表示されるセキュリティ情報の欄を確認します。
    • 「セキュリティ: 標準的な暗号化(TLS)」 と表示され、緑色(または通常の鍵アイコン)になっていれば完全クリアです。
    • 赤い開いた南京錠マークは綺麗に消えています。

まとめ

  • Gmailの「赤い南京錠」は、自前サーバーとGoogleサーバー間の通信が平文であることが原因
  • Web用として取得済みのLet’s Encrypt証明書をそのままPostfixに流用できる
  • smtp_tls_security_level = may を追加するだけで、送信メールの安全性が向上し、迷惑メール判定のリスクも大幅に低減できる

自宅サーバーからのログ・通知メール運用において、一度設定しておけば恒久的に安心できる必須チューニングです。

コメント

タイトルとURLをコピーしました