幫網站掛上 HTTPS,使用 Certbot 向 Let's Encrypt 申請憑證

程式技術
sharkHead

在之前的一篇文章中,介紹了什麼是 HTTPS,相信大家會從中了解為什麼現今網站都建議掛上 HTTPS。

本篇文章要來介紹如何使用 Certbot 來向免費的憑證頒發機構 Let's Encrypt 申請憑證,並使用憑證幫自己的網站掛上 HTTPS。

在申請憑證前,必須先向域名註冊商 (例如 AWS Route53) 購買一個域名 (Domain)

安裝 Certbot

各系統的安裝方式可以參考官方文件,下方的安裝環境是 Ubuntu 20.04,Web Server 使用 Nginx。

官方建議使用 Canonicalsnapcraft 來進行安裝。
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 會請你完成一個小測試,來驗證你持有網域的所有權。

2021_07_24_15_27_41_60fbc0ed3ea08.jpg
通過測驗證明 Domain 的擁有權

主要是請你在子域名中設定 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 是否已傳播。

2021_07_14_19_41_38_60eecd7241326.png
查詢 DNS TXT record 是否已傳播
2021_07_14_19_41_51_60eecd7f0c86b.png
傳播成功!

確認 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

參考資料

sharkHead
written by
sharkHead

後端打工仔,在下班後喜歡研究各種不同的技術。稍微擅長 PHP,並偶爾涉獵前端開發。個性就像動態語言般隨興,但渴望做事能像囉嗦的靜態語言那樣嚴謹。

0 則留言