用 Certbot 幫 Nginx 子網域申請免費 SSL 憑證,自動續約爽爽過

上一篇文章我才剛設定好子網域和 Nginx,結果聰明的你應該已經發現,欸?SSL 憑證呢?沒錯,工程師的日常就是這麼多「漏網之魚」。而且我還一度忘記自己有沒有申請 *.domainname 通配憑證,還得靠 SSL Labs 的 SSL Test 工具來查(這工具真的很香,推薦大家用一下)。結果一查,只有根網域有憑證,子網域完全沒戲唱。 身為一個資金有限、但腦袋靈活的工程師,Let’s Encrypt 免費 SSL 憑證就是我的好朋友。以前用過 zerossl,後來發現漲價加上每年還要手動更新,乾脆直接投靠 Certbot + Let’s Encrypt,還能自動續約,真的有夠省事。這篇就來記錄一下,怎麼用 Certbot 幫 Nginx 子網域申請 SSL 憑證,順便自動續約,讓你(和我)以後都不用再被憑證到期嚇到。

Certbot LetsEncrypt Nginx

主要內容

Certbot 是什麼?

Certbot 是一個命令列工具,可以幫你:
- 自動向 Let’s Encrypt 申請免費 SSL 憑證
- 自動修改 Nginx 或 Apache 設定檔
- 設定自動續約,憑證到期前自動幫你續期,根本佛心來的

安裝 Certbot

Ubuntu/Debian:

sudo apt update
sudo apt install certbot python3-certbot-nginx

CentOS/RHEL:

sudo yum install epel-release
sudo yum install certbot python3-certbot-nginx

(或是直接用 snap 安裝也可以,詳細步驟可以參考 Certbot 官方網站)

申請 Nginx 子網域 SSL 憑證

自動模式(推薦):

sudo certbot --nginx -d yourdomain.com -d sub.yourdomain.com

Certbot 會自動幫你修改 Nginx 設定、申請憑證、設定 HTTPS,還問你要不要自動轉址 HTTP 到 HTTPS,超貼心。

只申請憑證,不動 Nginx 設定:

sudo certbot certonly --nginx -d yourdomain.com -d sub.yourdomain.com

這種模式適合你想自己手動調整 Nginx 設定檔的時候。

自動續約與測試

Let’s Encrypt 憑證只有 90 天有效期,沒自動續約你就等著被 Chrome 紅色警告嚇醒吧。

測試自動續約:

sudo certbot renew --dry-run

跑這個指令沒錯誤訊息就代表自動續約沒問題。

設定自動續約(systemd timer):

sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer
sudo systemctl status certbot.timer

現代 Linux 幾乎都用 systemd,Certbot 會自動每天檢查兩次,快到期時自動續約,還能加上 --post-hook "systemctl reload nginx" 讓 Nginx 直接 reload,保證新憑證馬上生效。

如果是 cron job:

sudo crontab -e
# 加入
0 2 * * * /usr/bin/certbot renew --quiet && /usr/sbin/nginx -s reload

這樣每天凌晨 2 點會自動檢查並續約。

常用指令小抄

  • 查看已安裝憑證
    sudo certbot certificates
  • 手動更新憑證
    sudo certbot renew
  • 撤銷憑證
    sudo certbot revoke --cert-path /etc/letsencrypt/live/yourdomain.com/cert.pem
  • 刪除憑證
    sudo certbot delete --cert-name yourdomain.com

注意事項

  • Nginx 設定要正確,Certbot 申請時會去驗證你的網域
  • 防火牆要開 80/443 port,不然驗證直接失敗
  • DNS 記得指向正確 IP
  • Certbot 會動到 Nginx 設定,建議先備份一份

反轉小劇場:自動就真的萬無一失嗎?

自動續約很香沒錯,但如果哪天 DNS 設定被改、Nginx 設定被手殘砍掉、或是機器時間亂跳,Certbot 續約還是會失敗。建議還是偶爾手動檢查一下憑證狀態,或用 SSL Labs 的 SSL Test 工具驗證網站安全性,畢竟「自動」這種東西,最怕就是「自動失效」你還渾然不覺。


結論

用 Certbot 幫 Nginx 子網域申請 Let’s Encrypt 免費 SSL 憑證,真的是工程師的福音。從申請到自動續約一條龍,讓你不用再每三個月驚醒一次。只要設定正確,基本上就可以爽爽過,但偶爾還是要檢查一下,畢竟「自動化」最怕的就是「自動出包」。希望這篇筆記能讓你(和我)下次再遇到 SSL 憑證問題時,能夠優雅地說:「這不是問題,這只是自動化的小插曲。」