用 Certbot 來自動幫你的網站申請 & 更新免費的 Let's Encrypt SSL 憑證吧 !
為何需要 SSL 憑證 :
你是否有注意過網址有分成 http
和 https
呢?
- HTTP (HyperText Transfer Protocol)
- HTTPS (HyperText Transfer Protocol Secure )
很明顯的,他們的差距就在於安全性
,當你訪問 http 的網站時,瀏覽器會跳出非安全連線的提示,這是因為 http 封包是用明文傳遞資訊,很容易被截取,所以需要用 SSL/TLS 這樣的非對稱式加密來保證資訊安全,這些協議使用公開密鑰和私有密鑰來加密通信,確保只有發送方和接收方能夠解密和讀取數據。
不過這樣還不夠,瀏覽器只信任第三方機構(Certificate Authority,簡稱CA)發布的數位憑證,如果你使用了自簽名的憑證,瀏覽器仍會跳出非安全連線的提示。
那麼,為什麼瀏覽器只信任 CA 頒發的憑證呢?這是因為 CA 在頒發數位憑證前會驗證該網站的身份,他會核實網站所有者的身份和控制權,這樣可以有效防止中間人攻擊。
什麼是 Let’s Encrypt :
如同前面提到的,我們需要向 CA 請求頒發數位憑證,而其中一間最知名又免費的 CA 機構就是 Let’s Encrypt,可以通過 ACME 協議自動化的完成證書申請和更新,且幾乎所有主要網頁瀏覽器和操作系統都信任 Let’s Encrypt 的證書。
可以參考官方列出的可相容系統。
什麼是 Certbot :
Certbot 是一個免費且開源的工具,用於自動化管理 SSL/TLS 證書的申請、安裝、更新和配置。他是 Let’s Encrypt 計畫的官方客戶端,旨在簡化網站擁有者獲取和管理 HTTPS 加密的過程。
簡單來說,你可以透過 Certbot 來申請和更新 Let’s Encrypt 憑證。
Certbot 有提供很多做法來取得憑證:
作法 | 指令 |
---|---|
全自動 (自備 HTTP 伺服器) | – certbot |
半自動(自備 HTTP 伺服器,不調整 HTTP 伺服器設定) | – certbot certonly |
webroot(自備 HTTP 伺服器,自行設定 acme-challenge 部分) | – certbot certonly --webroot |
手動(自備 HTTP 伺服器 、其他主機) | – certbot certonly --manual |
DNS 套件 | – certbot certonly --dns-PLUGIN |
Standalone(Certbot 提供獨立 HTTP 伺服器部分) | – certbot certonly --standalone |
什麼是 nginx :
nginx 是一個輕量級的反向代理伺服器
,你可以用它來監聽你的指定 port,並將來源請求導向至你對應設定的地方。
例如你可以在 A機器 上設定一個 server 區塊來監聽 80 port + test.com,則所有打到 A機器 的 80 port 且 domain 為 test.com 的請求都會適用於這個區塊的設定,你可以做些不同的動作,然後導向至 A 機器其他地方抑或是其他 BCD 機器。
詳細教學會需要另外開一篇文章,此篇僅簡單概述。
使用教學 :
本次範例中我只會示範用 webroot 的做法,並且都採用 docker 來設定。
前置作業:
- 你需要在你的機器上自行下載 docker 和 docker-compose。
- 你需要有一個自己的域名,且 DNS 設定是對應到你當前要跑 certbot 的機器上。
以結論來說,我們會定義兩個容器,一個是 nginx,一個是 certbot,certbot 只有在取得和更新憑證時啟動,nginx 則是永遠保持運作並使用 ssl 憑證來轉向給背後指定的服務。
1. nginx.conf
首先,在你的專案根目錄新增一個 config 目錄,並在裡面新增一個 nginx.conf 後寫入以下內容:
有關 nginx 的目錄結構和語法就不多贅述了。
1 | # nginx worker process 的數量,通常設定為 CPU 的核心數量 |
2. Dockerfile
在你的 config 目錄下新增 Dockerfile 並寫入以下內容。
1 | FROM nginx:1.24.0-alpine # 使用 docker hub 的官方映像檔 |
3. docker-compose.yml
回到你的專案根目錄,新增 docker-compose.yml 檔案並寫入以下內容 :
1 | version: '3' # 不同版本有不同語法規範,請參考官網 |
4. 啟動 nginx 容器
CA 會打到 DNS 對應 IP 進行審核,所以要先啟動 nginx 容器。
1 | docker-compose up --build -d nginx |
5. 啟動 certbot 容器來拿憑證
1 | docker-compose up --build letsencrypt |
6. 配置你的憑證檔案
回到你的 config/nginx.conf,把剛剛因為沒有憑證會報錯而註解掉的地方取消註解。
1 | docker-compose up --build -d nginx |
如此一來就大功告成了,之後要更新憑證就啟動 certbot 容器就好。
自動化腳本 :
作為懶人工程師當然要自動化啊,誰會想每次都記得手動跑更新!
到你的專案根目錄下新增 getSSL.sh 並寫入以下內容 :
1 |
|
記得把檔案權限設為可執行
,然後到專案目錄執行以下:
1 | ./getSSL.sh |
1 | ./getSSL.sh --schedule |
啊如果你是 windows 或其他有的沒有 OS 我也懶得一個一個找,就照這個概念去換語法就好。
參考
- HTTPS on Docker Containers using Nginx and LetsEncrypt
- 使用 Certbot 來為網站申請 Let’s Encrtpt 憑證 (CentOS 7)
如果您喜歡我的文章,歡迎幫我在下面按5下讚!感謝您的鼓勵和支持!