上一篇文章我才剛設定好子網域和 Nginx,結果聰明的你應該已經發現,欸?SSL 憑證呢?沒錯,工程師的日常就是這麼多「漏網之魚」。而且我還一度忘記自己有沒有申請 *.domainname 通配憑證,還得靠 SSL Labs 的 SSL Test 工具來查(這工具真的很香,推薦大家用一下)。結果一查,只有根網域有憑證,子網域完全沒戲唱。 身為一個資金有限、但腦袋靈活的工程師,Let’s Encrypt 免費 SSL 憑證就是我的好朋友。以前用過 zerossl,後來發現漲價加上每年還要手動更新,乾脆直接投靠 Certbot + Let’s Encrypt,還能自動續約,真的有夠省事。這篇就來記錄一下,怎麼用 Certbot 幫 Nginx 子網域申請 SSL 憑證,順便自動續約,讓你(和我)以後都不用再被憑證到期嚇到。
Certbot 是一個命令列工具,可以幫你:
- 自動向 Let’s Encrypt 申請免費 SSL 憑證
- 自動修改 Nginx 或 Apache 設定檔
- 設定自動續約,憑證到期前自動幫你續期,根本佛心來的
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 官方網站)
自動模式(推薦):
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
自動續約很香沒錯,但如果哪天 DNS 設定被改、Nginx 設定被手殘砍掉、或是機器時間亂跳,Certbot 續約還是會失敗。建議還是偶爾手動檢查一下憑證狀態,或用 SSL Labs 的 SSL Test 工具驗證網站安全性,畢竟「自動」這種東西,最怕就是「自動失效」你還渾然不覺。
用 Certbot 幫 Nginx 子網域申請 Let’s Encrypt 免費 SSL 憑證,真的是工程師的福音。從申請到自動續約一條龍,讓你不用再每三個月驚醒一次。只要設定正確,基本上就可以爽爽過,但偶爾還是要檢查一下,畢竟「自動化」最怕的就是「自動出包」。希望這篇筆記能讓你(和我)下次再遇到 SSL 憑證問題時,能夠優雅地說:「這不是問題,這只是自動化的小插曲。」