Logo

新人日誌

首頁關於我部落格

新人日誌

Logo

網站會不定期發佈技術筆記、職場心得相關的內容,歡迎關注本站!

網站
首頁關於我部落格
部落格
分類系列文

© 新人日誌. All rights reserved. 2020-present.

Let’s Encrypt 初學者完全指南

最後更新:2025年3月23日架構

本文為 HTTPS 連線 基本介紹,第 1 篇:

  1. 什麼是代管網域(Domain Hosting)?初學者完整指南
  2. 網站託管(Web Hosting)入門指南:讓你的網站輕鬆上線
  3. Cloudflare 介紹:讓網站更安全、更快速的關鍵服務
  4. 反向代理是什麼?初學者必看詳解
  5. Apache HTTP Server 是什麼:初學者指南
  6. Django 初學者指南:ALLOWED_HOSTS 設定與安全性考量
  7. 如何為初學者配置 HTTPS 和 SSL:Cloudflare、Let’s Encrypt 和 Apache 完整指南
  8. Let’s Encrypt 初學者完全指南 👈進度
  9. 虛擬主機(Virtual Host)入門指南:讓你的網站輕鬆上線
  10. 初學者指南:設定 Apache 反向代理 Django 服務(含 SSL)
  11. Cloudflare 設定指南:如何正確配置 SSL/TLS 加密模式
  12. Cloudflare Edge Certificates 入門指南
  13. 解決 Cloudflare 301 重定向循環問題:初學者指南

在現今的網路世界中,網站安全性是至關重要的一環。

而「證書」(Certificate) 便是網站安全的核心技術之一,尤其是在實現 HTTPS (HyperText Transfer Protocol Secure) 加密時,更是不可或缺的要素。

本篇文章將以初學者的角度,深入淺出地介紹 Let’s Encrypt 的設定檔。

如何設定與檢查證書有效性、證書的運作原理、證書的申請與儲存方法,以及證書與 HTTPS 之間的關聯性,讓你對網站安全有更全面的了解。


什麼是 Let’s Encrypt?

Let’s Encrypt 是一個免費、自動化、開放的證書授權機構 (Certificate Authority, CA),它提供網站 SSL/TLS 證書,使網站能夠透過 HTTPS 進行加密連線,保障用戶資料安全。

由於 Let’s Encrypt 自動化的申請與續期機制,許多網站管理者能夠輕鬆地取得與管理證書,而不需要手動處理繁瑣的程序。

證書 (Certificate) 是什麼?

證書 (又稱 SSL/TLS 證書) 是一組數位檔案,主要用於:

  • 驗證網站身份:讓訪客確認他們連接的網站是合法且可信的,而不是仿冒網站。
  • 加密資料傳輸:在用戶與網站伺服器之間建立一個安全的加密通道,防止數據在傳輸過程中被竊取或篡改。

簡單來說,證書就是網站的「數位身份證」,它能確保網站身份的真實性,並加密你與網站之間的資料傳輸,讓你在網路上能更安全地進行交易、登入帳號或瀏覽敏感資訊。

證書的組成部分

一個數位證書中通常包含以下重要資訊:

  • 網站域名 (Domain Name):證明該證書專屬於某個特定網站 (例如 example.com)。
  • 公開金鑰 (Public Key):這是一組用於加密資料的密鑰,任何人都可以使用公開金鑰加密資料,但只有對應的私密金鑰 (Private Key) 才能解密這些資料。
  • 有效期限 (Validity Period):證書的起始和到期日期。當證書過期後,網站的 HTTPS 連線將不再被認可為安全連線。
  • 證書授權機構 (CA) 簽名:由可信的證書授權機構 (Certificate Authority, CA) 使用其私密金鑰對證書內容進行數位簽名,這個簽名可以讓用戶驗證該證書的真實性和可信度。例如,Let’s Encrypt、DigiCert、GlobalSign 都是常見的 CA。

證書的運作原理

當用戶透過瀏覽器訪問一個啟用 HTTPS 的網站時,證書會參與以下流程:

  1. 握手過程 (SSL/TLS Handshake):
    • 用戶的瀏覽器連接到網站伺服器,伺服器將自己的數位證書提供給瀏覽器。
    • 瀏覽器檢查該證書是否由可信任的 CA 簽發、是否有效,以及域名是否匹配。
  2. 公開金鑰加密:
    • 如果證書可信,瀏覽器會生成一個「會話金鑰」(Session Key),並用證書中的公開金鑰加密這個會話金鑰,然後發送給伺服器。
    • 伺服器使用自己的私密金鑰解密,取得會話金鑰。
  3. 安全通道建立:
    • 雙方使用這個會話金鑰進行後續的加密資料傳輸,此時的資料加密速度更快,並且每次連線都會有新的會話金鑰,增加安全性。
sequenceDiagram
    participant Browser as 瀏覽器
    participant Server as 伺服器
    
    Browser->>Server: 1. Client Hello (發起HTTPS連接)
    Note over Browser: 提供支援的加密套件與TLS版本
    
    Server->>Browser: 2. Server Hello (回應連接)
    Note over Server: 選擇加密套件與TLS版本
    
    Server->>Browser: 3. 發送SSL證書
    Note over Server: 包含伺服器公鑰與網站身份
    
    Browser->>Browser: 4. 驗證證書
    Note over Browser: 檢查CA簽發、域名匹配、有效期
    
    Browser->>Browser: 5. 生成Pre-master Secret
    Browser->>Server: 6. 用公鑰加密Pre-master Secret
    
    Server->>Server: 7. 用私鑰解密獲取Pre-master Secret
    
    Browser->>Browser: 8a. 生成會話密鑰
    Server->>Server: 8b. 生成相同會話密鑰
    
    Browser->>Server: 9. 發送加密的Finished消息
    Server->>Browser: 10. 發送加密的Finished消息
    
    Browser->>Server: 11. 加密的HTTP請求
    Server->>Browser: 12. 加密的HTTP響應

證書的作用

1️⃣ 身份驗證 (Authentication)

證書能夠保證用戶連接的是正確的網站,而非偽造的釣魚網站 (Phishing Site)。

  • 例如,當你訪問你的銀行網站時,瀏覽器會自動驗證該網站的證書。如果證書有效且由可信的 CA 簽發,瀏覽器會顯示「安全連線」的鎖頭圖示。

2️⃣ 數據加密 (Data Encryption)

證書透過 SSL/TLS 技術加密用戶和伺服器之間的所有數據,避免資料在網路傳輸中被第三方竊取或竄改。

  • 比如你在購物網站上輸入信用卡資訊時,這些敏感資料會經過加密,黑客即使攔截到數據流也無法解讀。

3️⃣ 數據完整性 (Data Integrity)

透過證書和加密協議,傳輸的數據在到達目的伺服器之前都會被保護,防止數據在中途被惡意篡改。

  • 例如,當你下載軟體更新時,證書確保你下載的檔案與伺服器提供的一致,避免被植入惡意程式。

Let’s Encrypt 運作原理解析

sequenceDiagram
    participant Client as Certbot 客戶端
    participant LE as Let's Encrypt 伺服器
    participant Server as 網站伺服器
    
    Client->>LE: 1. 發送證書申請請求
    LE->>Client: 2. 提供域名驗證挑戰
    
    alt HTTP 驗證方式
        Client->>Server: 3a. 放置驗證文件到指定路徑
        LE->>Server: 4a. 訪問指定路徑驗證域名所有權
    else DNS 驗證方式
        Client->>Server: 3b. 添加特定TXT記錄到DNS設置
        LE->>Server: 4b. 查詢DNS記錄驗證域名所有權
    end
    
    LE->>Client: 5. 驗證成功,簽發證書
    Client->>Server: 6. 安裝證書到網站伺服器
    Server->>Server: 7. 啟用HTTPS
    
    Note over Client,Server: 自動更新流程 (每60-90天)
    Client->>LE: 8. 證書即將到期,請求更新
    LE->>Client: 9. 重複驗證流程
    Client->>Server: 10. 安裝更新的證書
    Server->>Server: 11. 重載伺服器配置

初始申請階段

在開始申請證書之前,你需要在伺服器上安裝一個 ACME (Automatic Certificate Management Environment) 客戶端,最常見的是 Certbot。

Certbot 是一個開源工具,能夠與 Let’s Encrypt 伺服器通訊,自動申請、安裝和續期證書。

申請流程步驟

  1. 發送證書申請請求
    Certbot 向 Let’s Encrypt 伺服器發出一個證書申請,通常包含:
    • 你的網站域名 (Domain Name)
    • 用於加密的公開金鑰 (Public Key)
  2. 接受挑戰 (Challenge)
    Let’s Encrypt 伺服器收到申請後,會回應一個「挑戰」(Challenge),這個挑戰是一種測試,確保你擁有該域名的控制權。這個過程是證書申請中最關鍵的一步,因為它能防止他人冒充你的網站申請證書。

域名驗證方式 (Domain Validation)

Let’s Encrypt 提供兩種主要的挑戰方式,來驗證你對域名的控制權:

1️⃣ HTTP 驗證 (HTTP-01 挑戰)

原理:Let’s Encrypt 要求你,在你的網站伺服器的特定路徑下,放置一個驗證檔案。

操作步驟:

  1. Certbot 會自動在你的網站伺服器上建立一個特殊的目錄,例如:
http://example.com/.well-known/acme-challenge/隨機驗證碼
  1. Let’s Encrypt 伺服器會透過 HTTP 訪問這個 URL,下載該驗證檔案。
  2. 如果能夠成功訪問,表示你擁有該網站的控制權,驗證通過。

適用情況:

  • 伺服器能夠直接提供 HTTP 訪問。
  • 適合大部分情況,但不適用於通配符證書 (*.example.com) 的申請。

2️⃣ DNS 驗證 (DNS-01 挑戰)

原理:要求你在域名的 DNS 記錄中添加一個特殊的 TXT 記錄。

操作步驟:

  1. Certbot 會產生一個隨機的驗證碼,並提示你將它作為 TXT 記錄添加到你的 DNS 中,例如:
_acme-challenge.example.com. IN TXT "隨機驗證碼"
  1. Let’s Encrypt 伺服器會查詢你的 DNS 記錄,驗證是否存在該 TXT 記錄。
  2. 如果查詢到正確的驗證碼,驗證通過。

適用情況:

  • 特別適合需要申請通配符證書 (*.example.com) 的情況。
  • 適合伺服器無法提供 HTTP 驗證時,例如僅有 DNS 管理權限但沒有伺服器管理權限的場景。

證書簽發與安裝

1️⃣ 簽發證書

當驗證通過後,Let’s Encrypt 會:

  1. 使用你的公開金鑰和域名資訊生成一張數位證書。
  2. 用它自己的私密金鑰對這張證書進行數位簽名,確認證書的真實性。
  3. 將證書 (通常包括 fullchain.pem 和 privkey.pem) 傳送給 Certbot。

2️⃣ 安裝證書

Certbot 會自動將新證書安裝到你的 Apache 伺服器,並修改相應的配置檔,使伺服器開始使用新的證書。

自動配置方式
  • 如果你在申請證書時使用以下指令,Certbot 會自動幫你完成 Apache 的配置:
sudo certbot --apache -d example.com -d www.example.com
  • Certbot 會自動尋找 Apache 的虛擬主機 (Virtual Host) 配置檔,並自動添加或修改 HTTPS 所需的設定,例如:
<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com

    DocumentRoot /var/www/html

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem

    # 可選:強化 SSL 安全性
    SSLProtocol All -SSLv2 -SSLv3
    SSLCipherSuite HIGH:!aNULL:!MD5
    SSLHonorCipherOrder on

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
  • Certbot 自動配置完成後,會自動重新載入 Apache 服務,使新證書立即生效:
sudo systemctl reload apache2

手動配置方式 (如自動配置失敗時)

  • 如果 Certbot 無法自動配置 Apache,你可以手動編輯 Apache 的配置檔 (例如 /etc/apache2/sites-available/example.com.conf) 並加入 HTTPS 設定:
<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com

    DocumentRoot /var/www/html

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
</VirtualHost>
  • 啟用 Apache 的 SSL 模組並重新載入配置:
sudo a2enmod ssl
sudo a2ensite example.com.conf
sudo systemctl reload apache2

自動更新機制 (Renewal)

1️⃣ 證書有效期限

  • Let’s Encrypt 的證書有效期僅有 90 天,這樣的設計主要是:
    • 減少安全風險:即使證書或私密金鑰洩漏,風險也僅限於短時間內。
    • 推動自動化:避免長期使用過期或被撤銷的證書。

2️⃣ 自動更新流程

  • Certbot 內建有自動更新功能,通常會設置定期任務 (cron job) 每隔一段時間 (例如每天) 自動檢查證書是否即將過期:
sudo certbot renew --quiet
  • 在證書接近過期時 (通常是距到期日 30 天內),Certbot 會:
    1. 自動發起新的驗證請求,重複之前的挑戰 (HTTP-01 或 DNS-01)。
    2. 取得新的證書後,自動替換舊的證書。
    3. 自動重啟或重新載入伺服器,使新證書立即生效。

Let’s Encrypt 的設計優點

特點詳細說明
自動化ACME 協議和 Certbot 允許整個流程全自動化,從申請、驗證到安裝和更新都無需手動干預。
高安全性證書僅 90 天有效,減少證書洩漏帶來的風險,同時自動更新機制確保網站總是使用最新的安全證書。
完全免費Let’s Encrypt 是公益組織,為網站管理者提供零成本的證書服務,特別適合個人站點或小型企業使用。
透明和信任Let’s Encrypt 的所有驗證過程和證書數據都是公開的,使用者可以隨時查詢網站證書的真實狀態。
詳細說明ACME 協議和 Certbot 允許整個流程全自動化,從申請、驗證到安裝和更新都無需手動干預。
詳細說明證書僅 90 天有效,減少證書洩漏帶來的風險,同時自動更新機制確保網站總是使用最新的安全證書。
詳細說明Let’s Encrypt 是公益組織,為網站管理者提供零成本的證書服務,特別適合個人站點或小型企業使用。
詳細說明Let’s Encrypt 的所有驗證過程和證書數據都是公開的,使用者可以隨時查詢網站證書的真實狀態。

如何申請證書並存放於電腦中?

申請證書的方式

透過 Let’s Encrypt 申請證書,通常使用其官方工具 Certbot,以下是針對 Apache 伺服器的操作步驟:

步驟 1: 在伺服器中安裝 Certbot

sudo apt update
sudo apt install certbot python3-certbot-apache
  • certbot 是主程式,負責申請和管理證書。
  • python3-certbot-apache 是特定於 Apache 的插件,讓 Certbot 能夠自動配置 Apache 的 HTTPS 設置。

步驟 2: 取得證書 (以 Apache 為例)

Certbot 提供自動化工具,能夠幫助你快速申請並安裝 SSL/TLS 證書:

sudo certbot --apache -d example.com -d www.example.com
  • --apache:是 Certbot 與 Apache 進行自動配置的插件 (Plugin),表示 Certbot 自動處理 Apache 伺服器的配置。
  • -d:指定你的域名,可以添加多個域名。
驗證過程

Certbot 會自動:

  1. 執行域名驗證 (通常是 HTTP-01 挑戰,Certbot 會自動在網站伺服器上放置驗證檔案)。
  2. 修改 Apache 的虛擬主機配置以啟用 HTTPS。
  3. 重新載入 Apache 伺服器,使設定生效。
證書存放路徑

成功取得證書後,Certbot 會顯示證書和金鑰的存放路徑,例如:

/etc/letsencrypt/live/example.com/fullchain.pem
/etc/letsencrypt/live/example.com/privkey.pem

如何設定及檢查證書有效性?

1. 設定證書 (以 Apache 為例)

在 Apache 伺服器的虛擬主機 (Virtual Host) 配置檔中設定證書。一般來說,Certbot 已經自動完成配置,但如果需要手動設定,可以參考以下範例:

<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com

    DocumentRoot /var/www/html

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem

    # 可選的安全強化設定
    SSLProtocol All -SSLv2 -SSLv3
    SSLCipherSuite HIGH:!aNULL:!MD5
    SSLHonorCipherOrder on

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
重新載入 Apache 配置

讓新的證書設定生效,需要重新載入 Apache 伺服器:

sudo systemctl reload apache2

2. 檢查證書是否有效

方法 1: 使用 Certbot 檢查證書狀態

Certbot 提供的指令可以快速查看當前所有證書的有效性和到期狀態:

sudo certbot certificates
  • 這個指令會列出所有由 Certbot 管理的證書,包含:
    • 域名 (Domains)
    • 有效期限 (Expiry Date)
    • 證書路徑 (Certificate Path)
方法 2: 使用 OpenSSL 檢查證書到期日

你可以手動查看證書的詳細資訊,例如有效期限:

openssl x509 -enddate -noout -in /etc/letsencrypt/live/example.com/fullchain.pem
  • 輸出範例:
notAfter=2025-06-30 12:00:00 GMT
方法 3: 線上工具檢查 (可視化界面)

你也可以使用 SSL Labs 等線上工具,輸入你的域名,檢查:

  • 證書的有效性
  • 加密強度
  • 配置是否符合安全最佳實踐

證書與 HTTPS 的關聯性

HTTPS 是什麼?

HTTPS (HyperText Transfer Protocol Secure) 是 HTTP (HyperText Transfer Protocol) 的加強版。

它透過在 HTTP 協議上加入 SSL/TLS (Secure Sockets Layer / Transport Layer Security) 加密層,提供數據傳輸的安全性與私密性。

為什麼要使用 HTTPS?

  • 數據加密:防止用戶與網站之間的通訊內容被第三方竊聽。
  • 身份驗證:確保用戶連接的是正確的伺服器,而非偽造的網站。
  • 數據完整性:確保數據在傳輸過程中沒有被竄改。
  • SEO 加分:Google 等搜尋引擎偏好 HTTPS 網站,提升網站在搜尋結果中的排名。

如何識別 HTTPS 網站?

  • 瀏覽器地址欄中顯示 🔒 鎖頭圖示。
  • 網址以 https:// 開頭,而非 http://。
  • 點擊鎖頭圖示,可以查看網站的證書資訊,例如:
    • 證書授權機構 (CA) 是哪家 (例如 Let’s Encrypt, DigiCert)
    • 證書有效期 和 域名 是否匹配

證書在 HTTPS 中的作用

證書 (SSL/TLS Certificate) 是實現 HTTPS 的關鍵,它主要通過以下方式提升網站安全:

1️⃣ 加密連接 (Data Encryption)

  • 公開金鑰 (Public Key) 加密機制:
    • 證書中包含伺服器的公開金鑰,瀏覽器在建立 HTTPS 連接時,會用這個公開金鑰加密資料。
    • 只有伺服器持有的私密金鑰 (Private Key) 能夠解密這些資料,防止第三方竊取數據內容。
  • 加密過程示例:
    1. 用戶瀏覽器訪問網站,伺服器提供證書。
    2. 瀏覽器驗證證書的真實性 (由 CA 簽發,域名匹配,有效期限內)。
    3. 瀏覽器生成「會話金鑰」(Session Key),用伺服器的公開金鑰加密後發送給伺服器。
    4. 伺服器用私密金鑰解密,取得會話金鑰,之後雙方用這個會話金鑰進行 對稱加密 通訊,加密速度更快。
  • 數據加密的好處:
    • 即使數據在傳輸過程中被攔截,攻擊者也無法解讀數據內容,因為沒有私密金鑰。

2️⃣ 身份驗證 (Authentication)

  • 證書的數位簽章 (Digital Signature):
    • 證書是由可信任的證書授權機構 (Certificate Authority, CA) 簽發的,CA 用自己的私密金鑰對證書內容進行數位簽名。
    • 瀏覽器通過 CA 的公開金鑰來驗證這個簽章,確保證書未被竄改。
  • 防止中間人攻擊 (Man-in-the-Middle Attack, MITM):
    • 攻擊者可能嘗試偽造網站,以竊取用戶資料。
    • 透過檢查證書的有效性 (例如簽名、域名匹配、是否被吊銷),瀏覽器可以阻止用戶連接到不安全的伺服器。
    • 當證書不合法時,瀏覽器會顯示紅色警告 (例如「你的連線並不安全」),防止用戶繼續瀏覽。

3️⃣ HTTPS 連接建立的詳細流程 (SSL/TLS 握手流程)

  1. 客戶端問候 (Client Hello):
    • 用戶瀏覽器向伺服器發送請求,包含支援的加密算法 (Cipher Suites)、TLS 版本等資訊。
  2. 伺服器回應 (Server Hello):
    • 伺服器選擇雙方支援的加密算法,並發送自己的數位證書 (包含公開金鑰)。
  3. 驗證證書:
    • 瀏覽器檢查證書的有效性 (CA 簽名、域名是否匹配、是否過期)。
    • 如果證書無效,會顯示安全警告,HTTPS 連線失敗。
  4. 生成會話金鑰 (Session Key):
    • 瀏覽器生成會話金鑰,並用伺服器的公開金鑰加密後發送給伺服器。
  5. 加密通道建立:
    • 伺服器用私密金鑰解密會話金鑰,雙方開始使用這個對稱加密金鑰進行安全的數據傳輸。
  6. 安全通訊開始:
    • 之後的所有數據都經過加密處理,確保數據在傳輸過程中安全。

證書的類型與安全性

  • DV 證書 (Domain Validation):僅驗證域名所有權,適合個人網站。
  • OV 證書 (Organization Validation):驗證企業的合法性,適合商業網站。
  • EV 證書 (Extended Validation):最高級別驗證,企業名稱會顯示在瀏覽器地址欄 (已不再普遍顯示,但仍具有高信任度)。
  • 通配符證書 (Wildcard Certificate):支援 *.example.com 的所有子域名,適合多子域名網站。
  • 多域名證書 (SAN Certificate):支援多個不同的域名 (例如 example.com、example.net) 同時使用一張證書。

小結

證書在網站安全中扮演了極為重要的角色,不僅保護用戶資料的安全,還能提升網站的可信度與 SEO 排名。

透過 Let’s Encrypt 這類免費且自動化的工具,初學者也能輕鬆地為自己網站申請、設定與管理證書,確保網站安全並提供更好的用戶體驗。

持續關注證書的有效性,並定期更新證書,將是網站管理者應有的良好習慣。

希望這篇文章能幫助你更加了解證書的運作原理以及如何有效地設定 HTTPS,讓你的網站變得更加安全可靠!

目前還沒有留言,成為第一個留言的人吧!

發表留言

留言將在審核後顯示。

架構

目錄

  • 什麼是 Let’s Encrypt?
  • 證書 (Certificate) 是什麼?
  • 證書的組成部分
  • 證書的運作原理
  • 證書的作用
  • Let’s Encrypt 運作原理解析
  • 初始申請階段
  • 域名驗證方式 (Domain Validation)
  • 證書簽發與安裝
  • 自動更新機制 (Renewal)
  • Let’s Encrypt 的設計優點
  • 如何申請證書並存放於電腦中?
  • 申請證書的方式
  • 如何設定及檢查證書有效性?
  • 證書與 HTTPS 的關聯性
  • HTTPS 是什麼?
  • 證書在 HTTPS 中的作用
  • 證書的類型與安全性
  • 小結