「postfix」タグアーカイブ

GOGETSSLからLet’s Encryptに乗り換え

今までGOGETSSLの証明書を使っていましたが、更新期限が来たのと、今後、証明書の期限が200日以内になるという話もあるので、これを機にLet’s Encryptに乗り換えてみました。

Let’s Encryptは無料で使えますが、有効期限が90日なので、自動更新でもしないとやってられません。はい。自動更新の仕組みあります(^^;

今回は、Claude Codeに手順を出してもらって実施しました。完璧に動きました。すごい。(操作も含めて実行してもらうこともできるのですが、ちょっと怖かったので手順を出してもらって自分で事項しましたが、全く問題ありませんでした。本当にびっくりです。)

手順は以下の通り

Let’s Encrypt SSL証明書の自動更新(Apache + Postfix)

1. Certbot のインストール

# Ubuntu/Debian
sudo apt update
sudo apt install certbot python3-certbot-apache

# RHEL/CentOS/Rocky Linux
sudo dnf install certbot python3-certbot-apache

2. Apache 用の証明書取得

# Certbot が Apache の設定を自動的に更新する場合
sudo certbot --apache -d example.com -d www.example.com

# 証明書のみ取得(Apache 設定は手動)
sudo certbot certonly --apache -d example.com -d mail.example.com

mail.example.com を Postfix 用に同じ証明書に含めることを推奨

3. Postfix の SSL 設定

sudo nano /etc/postfix/main.cf
# TLS 設定
smtpd_tls_cert_file = /etc/letsencrypt/live/example.com/fullchain.pem
smtpd_tls_key_file  = /etc/letsencrypt/live/example.com/privkey.pem
smtpd_tls_security_level = may

smtp_tls_cert_file = /etc/letsencrypt/live/example.com/fullchain.pem
smtp_tls_key_file  = /etc/letsencrypt/live/example.com/privkey.pem
smtp_tls_security_level = may
sudo systemctl reload postfix

4. 自動更新の設定(重要)

Certbot はインストール時に systemd タイマーまたは cron を自動登録します。確認:

# systemd の場合
sudo systemctl status certbot.timer
sudo systemctl enable certbot.timer

# cron の場合(/etc/cron.d/certbot が存在するか確認)
cat /etc/cron.d/certbot

5. 更新後フック(サービス自動リロード)

更新後に Apache と Postfix を自動リロードするフックを作成:

sudo nano /etc/letsencrypt/renewal-hooks/deploy/reload-services.sh
#!/bin/bash
# Let's Encrypt 更新後に Apache と Postfix をリロード

echo "Reloading Apache and Postfix after certificate renewal..."
systemctl reload apache2   # Ubuntu/Debian
# systemctl reload httpd   # RHEL/CentOS

systemctl reload postfix

echo "Done: $(date)"
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-services.sh

6. 動作テスト

# ドライランで更新をテスト(実際には更新しない)
sudo certbot renew --dry-run

# フックも含めてテスト
sudo certbot renew --dry-run --deploy-hook /etc/letsencrypt/renewal-hooks/deploy/reload-services.sh

7. 証明書の状態確認

# 証明書一覧と有効期限
sudo certbot certificates

# Postfix の TLS 確認
openssl s_client -connect mail.example.com:25 -starttls smtp 2>/dev/null | openssl x509 -noout -dates

まとめ・ポイント

項目 内容
証明書の場所 /etc/letsencrypt/live/example.com/
自動更新タイミング 有効期限 30 日前(Certbot が自動判断)
フックの場所 /etc/letsencrypt/renewal-hooks/deploy/
更新頻度 1 日 2 回チェック(systemd timer)

ポイント:

  • Apache と Postfix で 同じ証明書ファイルを共有 できる
  • deploy/ フォルダのスクリプトは更新成功時のみ実行される
  • ポート 80 が外部から到達可能である必要がある(HTTP-01 チャレンジ)

ドメイン名や OS の種類を教えていただければ、より具体的な設定を出せます。

以上、本当にすごい時代になったものです。

最近メールが届いてないなと思ったら。。。

いつの間にかSpamhausでアカウント登録になってたんですね。以下は、さくらユーザー向けのBLOGですが2021年11月30日以降使えなくなると書いてありました。

https://www.spamhaus.org/resource-hub/email-security/sakuraspamhaus/#lessfont-style%22vertical-align:-inherit%22greaterlessfont-style%22vertical-align:-inherit%22greaterspamhauslessfontgreaterlessfontgreater

私のPostfix main.cfではこんなことが書いてあったのですが、

smtpd_client_restrictions = permit_mynetworks,
reject_rbl_client bl.spamcop.net,
reject_rbl_client sbl-xbl.spamhaus.org,
permit

LOGを見るとあるときから、こんなエラーを吐いてメールを全拒否してました。。。

postfix/smtpd[72758]: NOQUEUE: reject: RCPT from mail-xxxx.google.com[xxx.xx.xxx.xxx]: 554 5.7.1 Service unavailable; Client host [xxx.xx.xxx.xxx] blocked using sbl-xbl.spamhaus.org; Error: excess volume; https://check.spamhaus.org/returnc/vol/xxx.xxx.x.xx/; from=<XXXX@gmail.com> to=<xxxx@lambeden.jp> proto=ESMTP helo=<xxxxx.google.com>

ユーザー登録せずにRBLを利用するとError: excess volumeと言われて全拒否する様です。。。それもきついですが。

対応は簡単で、https://www.spamhaus.com/free-trial/sign-up-for-a-free-data-query-service-account/ ここからユーザー登録するとメールが届くのでVerify Email押してパスワードを付けたのちダッシュボードに入って赤丸のところを押すと、自分用のRBLサーバが出て聞きます。

smtpd_client_restrictions =
permit_mynetworks,
reject_rbl_client <自分のキー>.zen.dq.spamhaus.net,
permit

こんな感じで、出てきたサーバ名を書けば使えます。ちなみに、SBL、XBL、PBL。。。色々あるのですが、ZENは全部入りなのでこれを使いました。まぁ、smtpd_client_restrictionsに入れるならSBLで十分なのですが、一応(笑)。他のRBLも使ってたんですが、まぁ、SpamHausだけでいいかな。

これで、systemctl restart postfixするなりして、ログ見ながらテストメール送ってみてください。届くようになったと思います(^_^)

メールをsendgrid経由送信に変更

基本、gcpからはメール出せません。今までは面倒だったので、smtp.google.com経由でメールを出していたのですが、そうすると送信者がGmailのアカウント名になってしまうので、ちゃんと使うには問題があります。

そんな訳でSendGrid経由で出す設定にしてみました。12,000通/月まで無料とか神対応ですね!

手順ははい。ここを見てください(笑)

https://www.apps-gcp.com/sendgrid-gce/

とても参考になりました。ありがとうございます。

ただ、この記事が作成された当時と今で変わっているのは、SMTP送信に使われるユーザーはSendGridの管理アカウントではなく、APIキーになりました。なので、はい。ここを見てください(笑)

apikeyを発行してsasl_passwd設定してpostmapすればメール送信できるようになります。素晴らしい。

それと、WhitelabelingはSender Authenticationと言う名前に変わったようです。SendGridが丁寧な設定情報を書いてくれているのでこの通り設定すれば、SPFとDKIMの設定をかたがわりしてくれます。https://sendgrid.kke.co.jp/docs/Tutorials/D_Improve_Deliverability/using_whitelabel.html?utm_source=Vol.2&utm_medium=email&utm_content=HTML&utm_campaign=WelcomeEmail