幫網站掛上 HTTPS,使用 Certbot 向 Let's Encrypt 申請憑證
在之前的一篇文章中,介紹了什麼是 HTTPS,相信大家會從中了解為什麼現今網站都建議掛上 HTTPS。
本篇文章要來介紹如何使用 Certbot 來向免費的憑證頒發機構 Let's Encrypt 申請憑證,並使用憑證幫自己的網站掛上 HTTPS。
在申請憑證前,必須先向域名註冊商 (例如 AWS Route53) 購買一個域名 (Domain)
安裝 Certbot
各系統的安裝方式可以參考官方文件,下方的安裝環境是 Ubuntu 20.04,Web Server 使用 Nginx。
官方建議使用 Canonical 的 snapcraft 來進行安裝。Ubuntu 通常都已預裝好 snapcraft (因為 Ubuntu 的爸爸就是 Canonical),可以使用下方的指令確保使用最新的 snapcraft 版本。
sudo snap install core && sudo snap refresh core
安裝 Certbot。
sudo snap install --classic certbot
設定軟連結讓 Certbot 指令可以執行。
sudo ln -s /snap/bin/certbot /usr/bin/certbot
向 Let's Encrypt 申請憑證
首先我們先設定環境變數,將環境變數 DOMAIN
設定成你購買的網域。
DOMAIN=example.com
還有頂層網域的設定,例如 admin.example.com
或是 blog.example.com
。
WILDCARD=*.$DOMAIN
設定完畢可以打印出來試試看。
echo $DOMAIN && echo $WILDCARD
啟動 Certbot,使用手動授權方法搭配 DNS 查問以驗證網域所有權,這會為您的頂層網域及其子網域請求萬用字元憑證。
sudo certbot -d $DOMAIN -d $WILDCARD --manual --preferred-challenges dns certonly
上述指令中各個參數意思如下。
--manual
:使用手動驗證。--preferred-challenges dns
:使用 dns 的方式 challenge。certonly
:只產生憑證,讓 Certbot 不要自動產生或修改 Nginx 的設定檔案。
接下來會有一連串的提示,過程中輸入您的電子郵件地址,這會用於續約和安全性注意事項,閱讀 Let's Encrypt 服務條款。如果您不同意,就無法取得 Let's Encrypt 憑證。
接下來 Certbot 會請你完成一個小測試,來驗證你持有網域的所有權。
主要是請你在子域名中設定 DNS TXT record,那什麼是 TXT record?
簡單來說,以上面的圖片為例。
你需要在 _acme-challenge.example.com
這個子網域中,設定 S-RbwaZKpm…
與 moncVAcSp91…
這兩個 TXT record。
當你設定好 TXT record,Certbot 訪問 _acme-challenge.example.com
時就能取得上述兩個亂數字串,並確定這個網域的所有權在你身上。
TXT record 需要在域名註冊商那邊進行設定,設定完畢可以至 DNS Text lookup 網站,確認 DNS 是否已傳播。
確認 DNS TXT record 已傳播之後,就可以完成 Certbot 的申請流程,並取得憑證。
申請的憑證會放在下方的路徑中。
/etc/letsencrypt/live/example.com/
接下來只要在 Nginx 中設定憑證,就可以順利的幫網站掛上 HTTPS。
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
附註:如果 certbot 出現錯誤,會記錄在 /var/log/letsencrypt/letsencrypt.log
。
自動更新憑證
向 Let's Encrypt 申請的憑證都只有三個月 (90 天) 的時效性,時間到了,憑證過期就需要重新申請新的憑證。
Certbot 可以很方便的自動幫你更新憑證。
可以使用下方的指令查看 Certbot 是否已經自動設定 cronjob 來檢查憑證是否過期。
systemctl list-timers
有的話在 UNIT 欄位上應該會出現。
snap.certbot.renew.timer
可以使用下方的指令測試憑證是否會自動更新。
sudo certbot renew --dry-run