Ubuntu 自動更新 Let's Encrypt 憑證(Certbot + Nginx)

一篇可直接落地的 Certbot 自動續期指南:包含 crontab 範例、Nginx 停啟 hook、續期驗證與排錯建議。

Let’s Encrypt 憑證有效期只有 90 天,正式站點一定要配置自動續期,避免憑證過期導致 HTTPS 報錯。

如果你已經用 Certbot 申請過憑證,通常只差兩件事:

  1. 配置定時任務
  2. 驗證續期流程是否真的可用

先確認 Certbot 是否已自帶定時任務

在不同系統中,Certbot 可能已經自動安裝定時任務(例如 systemd timer/etc/cron.d/certbot)。

可以先檢查:

1
systemctl list-timers | grep certbot

如果已經有有效定時器,一般不需要再重複加 crontab。

手動新增 crontab(推薦範例)

如果你希望自己明確管理續期任務,可用 root 使用者新增:

1
sudo crontab -e

加入下面這一行(每天凌晨 3 點執行一次):

1
0 3 * * * certbot renew --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx" >> /tmp/certbot-renew.log 2>&1

這條命令的含義:

  • 0 3 * * *:每天 03:00 執行
  • certbot renew:檢查並續期即將過期的憑證(不會每天都實際續期)
  • --pre-hook:續期前停止 Nginx,避免 80/443 連接埠衝突(常見於 standalone 模式)
  • --post-hook:續期後啟動 Nginx
  • >> /tmp/certbot-renew.log 2>&1:將日誌追加寫入,方便排查

建議先做一次模擬續期

定時任務加好後,先手動驗證流程是否可用:

1
sudo certbot renew --dry-run

看到模擬續期成功,再交給定時任務長期運行。

常見注意點

  1. 如果你使用的是 webrootnginx 插件,很多情況不需要停 Nginx,可改為續期後重載:
1
certbot renew --deploy-hook "systemctl reload nginx"
  1. certbot renew 只會在憑證接近過期時才進行實際續期,因此每天跑一次是正常且常見做法。

  2. 建議把日誌改到可長期追蹤的位置(例如 /var/log/letsencrypt/),更利於維運。

總結

憑證自動續期的關鍵不是「把命令寫上去」,而是「確認命令能完整跑通」。

你只要完成這三步,通常就能穩定運行:

  1. 確認是否已有系統自帶定時任務
  2. 按需新增 crontab 並保留日誌
  3. --dry-run 做一次完整驗證
记录并分享
使用 Hugo 建立
主題 StackJimmy 設計