Skip to main content
Synology · acme.sh · Let's Encrypt · Cloudflare · TLS · Shell

專案概述

DSM 7 內建的 Let’s Encrypt 只支援 HTTP-01 驗證,必須對外開 port 80,且拿不到萬用字元憑證。本專案以 acme.sh 搭配 Cloudflare DNS-01 驗證,在不開放任何入站埠的條件下申請 *.example.com 萬用字元憑證,並透過 synology_dsm deploy hook 自動部署至 DSM。同時說明雙憑證策略:Cloudflare 橘雲(proxy)流量用 Origin Certificate,VPN/Mail 等直連流量用 Let’s Encrypt 萬用字元憑證。

核心功能

  • DNS-01 驗證,透過 Cloudflare API 寫入 TXT 記錄完成 ACME 挑戰,無需開放任何埠號
  • 萬用字元憑證(example.com + *.example.com)一次涵蓋所有子網域
  • synology_dsm deploy hook 在申請/續期後自動透過 DSM Web API 部署並重載憑證
  • DSM 工作排程自動觸發 acme.sh renew,acme.sh 內部在到期前 60 天內才實際續期,每天跑安全
  • 雙憑證共存:DSM 控制台可針對不同服務分別指派 Origin Certificate 或 Let’s Encrypt 憑證

部署架構

憑證策略

快速開始

1

建立 Cloudflare API Token

Cloudflare Dashboard → My Profile → API Tokens → Create Token → Custom Token。權限設定:Zone → DNS → Edit,區域資源選帳號下的目標 Zone。記下 Token(只顯示一次)和 Zone ID(Dashboard 右側欄)。
2

安裝 acme.sh

必須用 --nocron(DSM 升級會清 crontab)並指定 --home(不指定會裝到 /root/.acme.sh/,Synology 的 /root 結構不標準會報錯)。
3

向 Let's Encrypt 註冊帳號

必須帶 --server letsencrypt,acme.sh 新版預設 CA 已改為 ZeroSSL。
4

申請萬用字元憑證(先測試再正式)

5

部署憑證到 DSM

到 DSM 控制台 → 安全性 → 憑證確認出現「Let’s Encrypt Wildcard」。
6

設定 DSM 工作排程自動續期

控制台 → 工作排程 → 新增 → 排程的工作 → 使用者自訂的指令碼,每天凌晨 3:00 執行:
或直接使用 repo 內的 scripts/renew-cert.sh。acme.sh 內部只在到期前 60 天內才實際執行,每天跑不會觸發 rate limit。

注意事項

Let’s Encrypt production 對同一網域每週限發 5 張憑證,設定有誤反覆失敗會被暫時鎖住。申請前必須先跑 --test(staging 環境不受限),測試通過再用 --force 正式申請。API Token 必須用 Custom Token(Zone DNS Edit 權限),不要用 Global API Key,後者是帳號完整權限,外洩風險大。account.conf 內的 SYNO_CERTIFICATE 若含單引號字元(如 Let's),需用雙引號包整個值。

實際應用面

實驗室 NAS 同時跑 VPN、Mail、WebDAV、Synology Drive 等需要瀏覽器認得的公開憑證的服務,單張萬用字元憑證統一涵蓋,不需為每個子網域個別申請。橘雲服務另掛 Origin Certificate,兩套憑證在 DSM 控制台分別指派給對應服務。

相關連結