大概距今五六年前,當時一個網站想要有HTTPS得花不少錢來買憑證。這幾年開始出現免費的憑證頒發單位,因此HTTPS是現代網站的基本配備了。本文介紹如何在Linux上使用CertBot獲取憑證,並且自動更新。

什麼是HTTPS與SSL憑證

SSL的全名是Secure Sockets Layer,用來驗證提供服務的伺服器真的是這個網站的提供者。但是現在說的SSL只是個俗稱,目前網路上使用的是TLS(Transport Layer Security),是比SSL更安全的新版本。而HTTPS就是有使用憑證驗證伺服器是本尊,而且傳輸過程有加密的HTTP協定。使用HTTPS才能確保使用者連上的是正確的伺服器,而且傳輸過程不易被他人監控。

SSL憑證由特定的驗證單位頒發,驗證時有DV、OV、EV三種等級,因此像是一些銀行或是刷卡服務的網站,瀏覽器的網址列看起來會不太一樣,代表他們使用更高級更複雜的方式來驗證。

Let’s Encrypt驗證方式

Let’s Encrypt是由各大企業贊助而成立的憑證發放單位,使用者可以免費使用,每次頒發的憑證效期為三個月,所以每三個月要重新驗證一次。

Let’s Encrypt要驗證申請者是否真的有網站的操控權限,因此會要求申請人在網站內指定的資料夾放上指定的檔案,如同Google Search Console的驗證方式。這種驗證方式是比較初階的,只能確保申請者有網站的操控權限,但是大部分情況下已經足夠使用了。

使用CertBot

目前有非常多第三方程式可以協助驗證過程,在本篇教學中我使用CertBot來驗證,如果是使用Apache httpd的用戶也可以透過CertBot幫忙驗證。

安裝CertBot

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

註冊憑證

sudo certbot --nginx -d example.com -d www.example.com --redirect

如果你有好幾個網址都是同一個網站的別名,可以增加-d標籤來添加網址,沒有別名的話就寫一個即可。

驗證完成後CertBot會添加listen 443 ssl等相關設定到Nginx設定檔中。指令最後的--redirect參數會讓CertBot幫忙修改listen 80的設定,將http的Request轉址到https的網址。不需要自動轉址可以改成--no-redirect,如果都不設定,CertBot會在執行時詢問。

沒特殊需求的話,建議使用--redirect讓CertBot自動轉址就可以了,這樣當使用者連上http://的網站時,會自動被轉到https://,到這裡就設定完成囉。

更新憑證

Let’s Encrypt頒發的憑證只有三個月有效期限,因此三個月後就要重新驗證一次,可以使用以下指令。

sudo certbot renew           # 手動更新憑證
sudo certbot renew --dry-run # 測試憑證更新程序

但是CertBot其實會自動更新憑證,因此通常情況下我們不必擔心憑證過期。CertBot使用Crontab來定時執行,可以使用以下指令檢查CertBot是否有啟動。

sudo systemctl status certbot.timer

正常情況會看到Active: active的標示,代表正常啟動,可以使用以下指令來開關他,但通常應該沒有人會把它關閉啦。

CertBot自動更新正常運作的樣子
sudo systemctl enable certbot.timer  # 開啟服務
sudo systemctl disable certbot.timer # 關閉服務