返回列表

GCP帳號認證充值 谷歌雲SSL證書自動續期設置:利用 Certbot 維護免費的 Let's Encrypt 證書

谷歌雲GCP / 2026-09-04 15:11:49

前言:為什麼要自動續期,且為什麼是 Certbot

在 Google Cloud 上部署網站或 API,SSL 證書是基本功。你可能曾遇過這種情況:證書到期提醒來得很突然,然後服務告警、用戶跳出、SEO 排名波動,最後才匆忙補救。若你用的是付費證書,成本與流程還算可控;但如果你選擇免費的 Let's Encrypt,續期就必須靠自動化來守住穩定性。

這裡的目標很明確:在谷歌雲上,使用 Certbot 來維護 Let's Encrypt 證書,並建立可靠的自動續期機制。你不需要每 60~90 天手動操作,只要把「驗證方式、證書路徑、續期腳本與排程」一次設好,後續便能平穩運行。

不過要先講清楚一件事:Let’s Encrypt 要續期,必須能再次完成域名驗證。谷歌雲的架構可能是 Compute Engine + Nginx、或是外掛式負載平衡(HTTP(S) Load Balancing)、甚至在前面還有 Cloud CDN / Cloud Armor。不同架構意味著驗證方式也不同。因此,下文會用「適用範圍與選擇策略」的方式講清楚,避免你照抄命令卻因環境不符而失敗。

第一章:準備工作與環境假設

你需要先確認的前提

在開始設定之前,請先把以下資訊準備好:

  • 一個你已經擁有的域名(例:example.com 與 www.example.com)
  • 該域名目前的 DNS 已指向 Google Cloud 上能接收流量的目標(例如 VM 外網 IP、或負載平衡 IP/域名)
  • 你要申請與部署證書的主機環境:常見是 Compute Engine 的 Nginx(或其他 Web 服務)
  • 你能在 VM 上執行命令(通常是 SSH 權限)

另外,Let's Encrypt 的證書是針對「域名」發放的,而不是針對「你有哪個雲服務」發放的。換句話說,只要域名驗證能通過,你就能拿到免費證書。

選擇驗證方式:HTTP-01 與 DNS-01

Certbot 通常會用兩種主要方式驗證域名所有權:

  • GCP帳號認證充值 HTTP-01:Let's Encrypt 會嘗試訪問你網域的某個 HTTP 路徑(例如 http://example.com/.well-known/acme-challenge/...)。如果你的網站能對外提供該路徑,通常最簡單。
  • DNS-01:讓你在 DNS 中建立一條特定 TXT 記錄。這種方式對「HTTP 被負載平衡、反向代理或權限限制」的環境特別有用,也更適合只用 443、或很難直接暴露 80 的情況。

如果你已經確定 80 端口能對外(或你能放行),建議先走 HTTP-01;如果你的架構不方便提供 HTTP 驗證,再考慮 DNS-01。

第二章:在 Compute Engine 上安裝與初次簽發證書

更新系統並安裝 Certbot

以下以 Ubuntu 為例(其他 Linux 也類似)。進入你的 VM 後:

sudo apt update

sudo apt install -y certbot

若你使用的是 Nginx,通常還會用到 Nginx 外掛,以便自動修改站點配置。你可以再安裝:

sudo apt install -y python3-certbot-nginx

初次申請:HTTP-01(最常見、也最容易)

假設你的域名 example.com 和 www.example.com 都會指向這台 VM,並且你已經把 Nginx 配好了相應 server_name。確保以下兩點:

  • GCP帳號認證充值 防火牆允許外部訪問 VM 的 80/443(至少 80 用於初次驗證)
  • Nginx 能正常回應 HTTP 請求

然後用 Certbot 申請:

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

Certbot 會引導你選擇條款、並嘗試自動完成驗證。若一切順利,它會把證書安裝到對應位置,並把 Nginx 重新載入。

GCP帳號認證充值 第一次失敗時,先查什麼

很多人第一次就卡住,是因為「驗證路徑不可達」或「域名指向不對」。你可以按優先順序排查:

  • 從你自己的網路(或用手機熱點)打開:http://example.com 是否能顯示 Nginx 內容
  • 確認 DNS A/AAAA 記錄是否確實指向這台 VM(或指向負載平衡後再轉發到 VM)
  • 確認安全群組(Google Cloud firewall)放行了 80/443
  • 檢查 Nginx server_name 是否正確,避免請求落到其他 server block
  • 若你做了強制跳轉 HTTPS,仍可能可行,但要確保 .well-known/acme-challenge 能被正確處理(一般 Certbot 會替你處理,但前提是 Nginx 設定允許)

你不需要一次看一大堆 logs,把問題縮小到「外網能否訪問挑戰路徑」就會快很多。

第三章:部署證書到 Nginx 與確保自動重新載入

證書通常放在哪裡

Let’s Encrypt 的證書通常在:

  • /etc/letsencrypt/live/example.com/

你會看到幾個關鍵檔案,例如:

  • fullchain.pem:完整證書鏈
  • privkey.pem:私鑰
  • GCP帳號認證充值 chain.pem:中繼證書(視情況使用)

Certbot 用 live 目錄的「符號連結」指向實際版本,因此續期時通常不需要你手動改 Nginx 配置。真正要做的是:續期後要觸發 Nginx reload,確保新證書生效。

為 Nginx 準備正確的 SSL 設定(示意)

你的 Nginx site 配置中,一般會包含類似內容(示意,請按你的檔名/域名替換):

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;

ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

同時確保 server block 的 listen 443 ssl 正確,且 server_name 包含你的網域。

關鍵:讓續期自動觸發 reload

如果你是用 certbot --nginx 方式安裝,Certbot 通常已經把必要的 hook 設好;但在一些特殊情況,你可能需要確認是否存在自動 reload。

你可以手動測試「不真正更新」但檢查續期流程是否可行:

sudo certbot renew --dry-run

若 dry-run 通利,表示你的續期驗證方式與 Nginx 配置大體符合預期。你還可以檢查 renew 設定檔,以確認它知道該使用哪些參數。

第四章:建立自動續期排程(systemd timer 或 cron)

GCP帳號認證充值 你可能已經有 systemd timer

在現代的 Ubuntu/Debian 上,Certbot 常會預設安裝成 systemd timer 或類似機制。你可以檢查:

systemctl list-timers | grep certbot

若你看到 certbot renew 的 timer,通常表示系統會定期嘗試續期,並在需要時更新證書。

GCP帳號認證充值 如果沒有,手動建立排程(建議做法)

建議你使用 systemd timer,因為比 cron 更清楚、也更容易觀察狀態。概念上需要兩個檔案:

  • timer:定時啟動服務
  • service:呼叫 certbot renew

以下給出一個常見做法(你可依系統調整路徑與檔名)。

1)建立 service 檔案:

sudo nano /etc/systemd/system/certbot-renew.service

內容大致為:

[Unit] Description=Certbot renew [Service] Type=oneshot ExecStart=/usr/bin/certbot renew --quiet

2)建立 timer 檔案:

sudo nano /etc/systemd/system/certbot-renew.timer

內容大致為:

[Unit] Description=Run certbot renew daily [Timer] OnCalendar=daily RandomizedDelaySec=3600 Persistent=true [Install] WantedBy=timers.target

3)啟用並立即啟動:

sudo systemctl daemon-reload

sudo systemctl enable --now certbot-renew.timer

接著檢查狀態:

systemctl status certbot-renew.timer

你也可以看最近一次執行結果:

journalctl -u certbot-renew.service --since 'today'

續期頻率設多少比較合理

Let's Encrypt 的證書有效期約 90 天。Certbot 續期策略通常會在「剩餘天數低於門檻」時才真正更新,因此你可以把排程設得更頻繁也不會造成額外壓力。每日檢查是一個常見且穩妥的頻率。

重點不在「每天跑」,而在「每天能跑」且「遇到失敗你能看見」。因此除了自動化,監控與 log 也要跟上。

第五章:遇到谷歌雲架構特殊情境的解法

GCP帳號認證充值 你用的是 Google Cloud HTTP(S) Load Balancing,但 VM 沒直接接 80

若你的網站流量先經由負載平衡,再轉發到後端服務,而後端(VM)可能不對外開 80,那 HTTP-01 會變得不穩定。這時你有兩種方向:

  • 讓 Let's Encrypt 的驗證請求能到達後端服務的 challenge 路徑(需要你能控制路徑或開放 80)
  • 改用 DNS-01 驗證:不依賴 HTTP 通路是否可達

實務上 DNS-01 往往更省事,尤其你已把入口鎖得很嚴,或你只想保證 443。

使用 DNS-01:讓續期不再受網路拓撲影響

DNS-01 的核心是:Certbot 會要求你在指定 DNS 提供商中建立 TXT 記錄。當記錄更新生效後,Let's Encrypt 完成驗證,發放新證書。

如果你使用 Google Domains / Cloud DNS 作為 DNS 提供商,通常可以用對應外掛讓 Certbot 自動管理 DNS 記錄(避免你每次手動加 TXT)。

概念步驟如下:

  • 取得並保存 Cloud DNS 的權限(通常是服務帳號的最小權限)
  • 安裝 Certbot 的 DNS 外掛(對應 Cloud DNS)
  • 執行 Certbot 申請命令,指定使用 DNS 驗證的參數
  • 續期時同樣會自動更新 TXT 記錄,完成驗證與更新

注意:DNS-01 仍依賴「你的 DNS 在公開網路能正確顯示 TXT」。若你使用代理或有不合理的 TTL,可能導致驗證延遲。建議在首次部署時允許足夠等待時間,之後再觀察。

證書更新後仍然沒有生效:你可能忘了 reload 或用錯位置

續期成功不代表流量立刻使用新證書。最常見的原因:

  • Nginx 沒有 reload(或 reload 失敗)
  • GCP帳號認證充值 你在 Nginx 配置中寫了固定版本路徑,而不是 live 目錄(續期更新後路徑不同)
  • 你其實沒有正確引用同一個憑證目錄(多域名、多站點時容易搞混)

你可以用以下方式檢查目前 Nginx 提供的證書有效期:

  • 瀏覽器查看證書到期日
  • 或用命令行工具查詢(例如開連線後看 notAfter)

若發現有效期沒更新,你就回頭檢查 reload hook 是否有執行,以及 Nginx 是否正確讀取了 live 目錄。

GCP帳號認證充值 第六章:把續期做成「可維護」的流程,而不是一次性成功

你應該保留哪些配置與紀錄

要維護,最重要的是可追溯。建議你至少保存:

  • Certbot 的 renew 設定:/etc/letsencrypt/renewal/ 內的各網域 .conf
  • Nginx site 配置檔(含 SSL 段)
  • 續期 log(systemd journal 或 certbot log)

當下次續期失敗,你不會在完全沒有線索的狀況下重試,而是能快速找出差異點。

定期用 dry-run 做演練

你可以每隔一段時間做一次:

sudo certbot renew --dry-run

這不會真正簽發新證書,但會模擬驗證與更新流程,能提前暴露「網路拓撲改了」「DNS 改了」「防火牆規則變了」之類的問題。把演練納入變更週期(例如你調整了防火牆或更新了 Nginx)會非常有效。

為什麼不能只看「續期是否成功」

Certbot 計算到期時間後只會在必要時續期。若你很久沒觀察,有可能出現以下情況:

  • 某次續期驗證因為域名指向變更而失敗
  • 排程其實掛了,但你沒看到
  • Nginx 設定變更後,reload hook 失效

因此你需要的不只是「成功更新一次」,而是「整套鏈路:排程 → 驗證 → 更新 → reload → 提供新證書」。只要其中一環斷掉,就會在臨界點爆雷。

第七章:整合實務示例(以 Nginx + Compute Engine 為主)

一個常見的完整流程回顧

假設你的環境是:域名指向同一台 Compute Engine VM;Nginx 提供網站服務;你已開放 80/443。完整流程通常是:

  1. 安裝 certbot 與 certbot-nginx
  2. certbot --nginx -d example.com -d www.example.com 首次簽發
  3. 確認 Nginx 正確引用 /etc/letsencrypt/live/... 下的證書檔
  4. 確認自動續期排程存在(systemd timer 或 cron)
  5. certbot renew --dry-run 測試續期流程
  6. 確認續期更新後能 reload Nginx(可在 log 中看到相應行為)

如果你後續新增了子網域或替換站點,仍然沿用同樣邏輯:先保證驗證路徑可通,再確保 reload 與引用路徑正確。

當你有多個站點(多個 server block)

多站點情境很常見。你可能在一台 VM 上放了多個 domain。建議注意:

  • 每個 server block 的 server_name 必須準確
  • 避免同一個網域被多個站點配置或重複引用
  • 用 Certbot 時指定清楚的 -d 列表,不要只申請主域卻忘記 www(或相反)

若你維護的網域變多,可以建立一個簡單的文件記錄:每個網域的證書類型、驗證方式(HTTP-01 或 DNS-01)、以及對應的 Nginx 配置檔位置。這會讓後續排障快很多。

結語:把證書自動續期變成一種「日常可靠性」

SSL 證書不是一次性任務。Let’s Encrypt 的免費優勢讓你可以把成本降到幾乎為零,但代價是你必須把續期做成自動化、可觀察、可回溯。透過 Certbot,你能把流程標準化:申請、驗證、部署、續期與 reload 都能串起來。

在 Google Cloud 的世界裡,最容易出問題的是「域名驗證通路」與「架構差異」。因此你要做的不是盲目照抄命令,而是先選對驗證方式:能用 HTTP-01 就先用它;如果入口受限或拓撲複雜,DNS-01 往往更穩。

當你完成本文的設定後,接下來的重點就變成兩件事:定期用 dry-run 演練一次,以及確保系統有排程、log 可查。你不會再因為到期而被迫救火,SSL 也會成為默默工作的一部分。

Telegram售前客服
客服ID
@cloudcup
联系
Telegram售后客服
客服ID
@yanhuacloud
联系