0. 開場白:當(dāng)瀏覽器紅鎖亮起

2025-06-02 03:27(對,又是凌晨),監(jiān)控群里突然蹦出一條 Prometheus 告警:

probe_ssl_earliest_cert_expiry{job="blackbox-https"} < 86400

配圖是一片血紅。我揉揉眼睛,以為只是 Let’s Encrypt 提前 30 天續(xù)期的例行提醒,結(jié)果下一秒同事甩來截圖:

客戶域名 *.mall.example.com 泛域名證書全部失效,Chrome 直接大紅鎖,iOS Safari 直接彈「此連接不受信任」。

那一刻,我聽見了自己心跳的聲音——比 Traefik 的 404 頁面還響


1. 時間線復(fù)盤:90 天前埋的雷,今晚一起爆

時間 事件 當(dāng)時心態(tài)
2025-03-04 10:00 Traefik 3.2 起新集群,順手配了 Let’s Encrypt 泛域名證書,覺得“90 天后再說” 穩(wěn)如老狗
2025-05-30 22:00 證書還剩 5 天,Traefik 日志出現(xiàn) rate limit 關(guān)鍵字,當(dāng)時以為是常規(guī)抖動 佛系
2025-06-02 03:27 證書集體過期,Prometheus 爆炸,用戶瘋狂 @ 運維 原地升天

2. 坑點解剖:Let’s Encrypt 到底怎么把我們坑到斷網(wǎng)

2.1 Let’s Encrypt 的隱藏限制:每周 泛域名重復(fù)驗證 5 次

2.2 Traefik 的“靜默失敗”機制

2.3 DNS 驗證的 TXT 記錄地獄

Let’s Encrypt 的泛域名驗證要求 兩條 TXT 記錄同名不同值

_acme-challenge.mall.example.com → TXT1  
_acme-challenge.mall.example.com → TXT2

而公司 DNS 托管在阿里云,API 有 60 秒緩存,我們腳本把第一條記錄沖掉了,于是驗證失敗率 100%。


3. 逃亡劇本:一條 label 把 ZeroSSL 拉進(jìn)戰(zhàn)場

3.1 ZeroSSL 的 3 個救命優(yōu)勢

特性 Let’s Encrypt ZeroSSL 備注
泛域名免費額度 無限制 3 個/免費 對我們夠用了
ACME 速率限制 5 次/周 300 次/天 直接碾壓
根證書兼容性 ISRG X1 AAA Certificate Services 老 Android 6 都信

3.2 Traefik 3.2 的 fallback 魔法

官方文檔只寫了 多 CA 并行申請,但沒告訴你誰先成功誰上崗。我們只用一條 Docker label 就完成切換:

services:
  traefik:
    image: traefik:v3.2
    labels:
      # 1. 保持 LE 作為主 CA
      - traefik.http.routers.web.tls.certresolver=le
      # 2. 把 ZeroSSL 作為備用,失敗自動切換
      - traefik.http.routers.web.tls.certresolver=le,zerossl
      # 3. ZeroSSL 的 ACME 服務(wù)器和 EAB
      - traefik.certificatesresolvers.zerossl.acme.email=ops@example.com
      - traefik.certificatesresolvers.zerossl.acme.storage=/acme/zerossl.json
      - traefik.certificatesresolvers.zerossl.acme.caServer=https://acme.zerossl.com/v2/DV90
      - traefik.certificatesresolvers.zerossl.acme.eab.kid=${Z_SSL_KID}
      - traefik.certificatesresolvers.zerossl.acme.eab.hmacEncoded=${Z_SSL_HMAC}

3.3 實測:從 502 到 200 的 5 分鐘


4. 復(fù)盤:給未來的自己留 3 張保命符

4.1 提前 30 天續(xù)期腳本

#!/bin/bash
# cron: 0 3 */15 * * /opt/scripts/renew.sh
for resolver in le zerossl; do
    docker exec traefik \
        traefik acme renew $resolver
done

4.2 監(jiān)控:雙重保險

4.3 DNS API 冪等腳本

用阿里云 SDK + Traefik 的 delayBeforeCheck = 120s,確保 TXT 記錄寫入后等待緩存失效再驗證。


5. 彩蛋:一鍵生成 ZeroSSL 賬戶的 Docker 小工具

docker run --rm -it \
  -v $PWD:/out \
  -e Z_EMAIL=ops@example.com \
  ghcr.io/acmesh-official/acme.sh \
  --register-account --server zerossl --eab-kid YOUR_KID --eab-hmac-key YOUR_HMAC

6. 結(jié)束語:別再把 90 天當(dāng)無限

“免費的,才是最貴的?!?

當(dāng)你下次看到 Let’s Encrypt 的「90 days」小字時,請記住這篇文章——
以及那一杯凌晨 3 點的冰美式。

上一篇:

Kong Gateway 3.8 升級實戰(zhàn):如何用藍(lán)綠部署與 Deck 在 120 秒內(nèi)恢復(fù)服務(wù)

下一篇:

Envoy WASM 插件崩潰調(diào)試指南:Rust + gdb + wasme 實戰(zhàn)教程
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費