iT邦幫忙

0

Traefik Let's Encrypt 實作筆記(DNS Challenge with GoDaddy)

Min 2025-10-22 14:17:59219 瀏覽
  • 分享至 

  • xImage
  •  

今天在實作 Traefik + Let’s Encrypt 的自動簽發憑證功能,主要目的是讓流量能在 Traefik 層進行 HTTPS 加密。剛好專案的 ingress controller 本身就是用 Traefik,因此可以直接整合 Let’s Encrypt 來完成自動化憑證管理。

Let's Encrypt 憑證通常有效 90 天,當憑證剩下 30 天以內時,Traefik 會自動向 Let's Encrypt 重新申請新憑證,成功後自動更新 /data/acme.json,整個過程不中斷服務、不需重啟。

當服務部署後,Traefik 能夠做到以下幾點:

  1. 自動向 Let's Encrypt 申請憑證
  2. 使用 DNS Challenge 驗證域名所有權
  3. 自動將憑證保存到 /data/acme.json
  4. 透過 HTTPS 提供流量加密

配置說明

在 Traefik 的設定中,需要先定義一個 certresolver,例如 letsencrypt。當 Traefik 偵測到這個 resolver,就會自動發送申請給 Let's Encrypt。我們使用 DNS Challenge 方式驗證,提供 GoDaddy API Key / Secret 讓 Traefik 能夠自動在 DNS 上新增 TXT 紀錄。

這代表:

我們透過已被 Let's Encrypt 信任的 DNS 提供者(GoDaddy),完成自動化的網域驗證與憑證簽發。

DNS Challenge 設定分布在三個地方

1️⃣ 主要配置 — traefik-config (ConfigMap)

# ConfigMap: traefik-config (namespace: traefik-system)
certificatesResolvers:
  letsencrypt:
    acme:
      email: aa@aa.aa
      storage: /data/acme.json
      dnsChallenge:
        provider: godaddy           # ← 指定使用 GoDaddy
        delayBeforeCheck: 60        # ← 等待 60 秒讓 DNS 傳播
        resolvers:
          - "1.1.1.1:53"
          - "8.8.8.8:53"

2️⃣ API 憑證 — godaddy-credentials (Secret)

# Secret: godaddy-credentials (namespace: traefik-system)
data:
  GODADDY_API_KEY:      # Base64 編碼
  GODADDY_API_SECRET:   # Base64 編碼

3️⃣ 環境變數注入 — Traefik Deployment

# Deployment: traefik (namespace: traefik-system)
containers:
- name: traefik
  env:
  - name: GODADDY_API_KEY
    valueFrom:
      secretKeyRef:
        name: godaddy-credentials
        key: GODADDY_API_KEY
  - name: GODADDY_API_SECRET
    valueFrom:
      secretKeyRef:
        name: godaddy-credentials
        key: GODADDY_API_SECRET

三者如何協作

  1. Traefik 啟動 → 讀取 ConfigMap 中的 provider: godaddy
  2. 申請憑證 → 透過環境變數取得 GoDaddy API 金鑰
  3. DNS 驗證 → 在 GoDaddy DNS 新增 TXT 記錄驗證網域所有權
  4. 憑證生成 → Let's Encrypt 驗證成功後簽發憑證,並儲存在 /data/acme.json

acme.json 權限設定

acme.json 用來保存所有憑證資訊,必須嚴格控制權限:

chmod 600 acme.json

否則 Traefik 啟動時會出現:

open /data/acme.json: permission denied

原因是 Traefik 為了安全,會拒絕讀取權限過寬(如 660)的檔案。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言