管理密鑰和金鑰

本頁內容

使用此清單來決定哪些值屬於執行環境、哪些在資料庫中產生、哪些由外掛儲存。每個部分說明了輪換如何影響執行中的站點。

在 Node.js 上,將執行時密鑰放在託管平台的密鑰管理器中,使其在程序啟動時進入 process.env。對於 Worker,使用 wrangler secret put。不要在 astro.config.mjswrangler.jsoncimport.meta.env 中放置密鑰值;Vite 可能會將建置時的值嵌入伺服器套件。

概覽

密鑰來源儲存位置遺失密鑰的影響
EMDASH_ENCRYPTION_KEY營運者 (emdash secrets generate)僅環境 / Worker 密鑰對目前資料無影響;EmDash 僅檢查其格式
預覽密鑰自動產生(環境變數覆寫)options 表 (emdash:preview_secret)已簽發的預覽連結失效;新的正常
IP 鹽值自動產生(環境變數覆寫)options 表 (emdash:ip_salt)留言速率限制連續性重設
工作階段和 API 權杖按工作階段/權杖產生工作階段儲存 / 資料庫(僅雜湊)無影響 — 明文從不儲存
OAuth 提供者憑證你(Google/GitHub 主控台)環境該提供者的登入停止直到替換
Turnstile 密鑰你(Cloudflare 儀表板)環境留言 CAPTCHA 驗證失敗
S3 憑證你(儲存提供者)執行環境媒體上傳/下載失敗直到替換
外掛密鑰你(管理設定 UI)資料庫(外掛設定/儲存)在管理面板重新輸入
CLI 憑證emdash login / emdash plugin publish 裝置流程~/.config/emdash/auth.json(模式 0600)重新執行裝置流程
註冊表 CLI 憑證emdash-plugin atproto OAuth~/.emdash/oauth/~/.emdash/credentials.json(模式 0600)重新登入;身分在您的 PDS 上

加密金鑰

EMDASH_ENCRYPTION_KEY 目前不會加密外掛密鑰或任何其他儲存資料。如果設定了該變數,EmDash 在啟動時檢查其格式。格式錯誤的值會產生面向營運者的記錄訊息,但站點繼續處理請求。

以下命令產生格式正確的值。如果您的部署使用此變數,請將其儲存在執行環境中或作為 Worker 密鑰。

npx emdash secrets generate
# emdash_enc_v1_<43個 base64url 字元>

# Cloudflare:
wrangler secret put EMDASH_ENCRYPTION_KEY

格式為 emdash_enc_v1_ 後接 32 個隨機位元組的無填充 base64url。該值由營運者提供,不儲存在資料庫中。遺失它對資料復原沒有影響,因為沒有儲存資料依賴於它。

產生的站點密鑰

兩個密鑰在首次使用時自動產生並持久化到 options 表中,因此在請求、部署和 isolate 之間保持穩定。產生是原子的 — 並行的冷啟動會收斂到一個值。

預覽密鑰

簽署預覽 URL(HMAC)。儲存為 emdash:preview_secret;32 個隨機位元組,base64url。

  • 覆寫: 如果需要在多個程序間使用相同密鑰,或出於稽核原因固定它,請設定 EMDASH_PREVIEW_SECRET(舊版別名:PREVIEW_SECRET)。環境變數始終優先於儲存值。
  • 輪換: 刪除 emdash:preview_secret 列(或變更環境變數)並重新部署。影響:先前簽發的預覽連結不再有效。其他不受影響 — 下次預覽請求時會產生(或從環境讀取)新密鑰。
  • 如果遺失: 沒有不可復原的內容。預覽連結設計上是短期的。

有關預覽 URL 的建構和驗證,請參見預覽指南

IP 鹽值

為留言速率限制使用的留言者 IP 位址的 SHA-256 雜湊(留言上的 ip_hash)新增鹽值。儲存為 emdash:ip_salt。站點特定,因此雜湊在 EmDash 安裝之間不可關聯。

  • 覆寫: 設定 EMDASH_IP_SALT。為了向下相容,也會參考 EMDASH_AUTH_SECRET / AUTH_SECRET — 歷史上從這些衍生鹽值的安裝保持穩定的雜湊。
  • 輪換: 變更環境變數或刪除 emdash:ip_salt 列。影響:新的留言提交會雜湊為不同的值,因此所有人的速率限制計數重新開始。現有留言及其儲存的雜湊不受影響。
  • 如果遺失: 無資料遺失。僅速率限制連續性重設。

工作階段和 API 權杖

  • 工作階段使用 Astro 的工作階段儲存(Cloudflare 上為 Workers KV,Node 上為檔案系統)。Cookie 攜帶不透明的工作階段 ID;沒有需要管理的簽章密鑰。登出以結束工作階段,或清除工作階段儲存(如 KV 命名空間)以強制所有人重新登入。
  • API 權杖ec_pat_ec_oat_ec_ort_ 前綴)是不透明的 256 位元隨機值;僅儲存其 SHA-256 雜湊。明文在建立時顯示一次。透過在管理面板撤銷並重新建立進行輪換。
  • 邀請、魔術連結和復原權杖是一次性的,以 SHA-256 雜湊儲存在 auth_tokens 中,並有時間限制(邀請 7 天,魔術連結 15 分鐘)。

無需主動備份或輪換:資料庫洩露僅暴露雜湊,每個權杖都可以從管理面板撤銷或重新簽發。

使用者提供的服務憑證

外部服務的憑證從環境讀取,從不寫入資料庫。在提供者處輪換,更新變數,重新部署。

服務變數
Google 登入EMDASH_OAUTH_GOOGLE_CLIENT_IDEMDASH_OAUTH_GOOGLE_CLIENT_SECRET(或無前綴別名)
GitHub 登入EMDASH_OAUTH_GITHUB_CLIENT_IDEMDASH_OAUTH_GITHUB_CLIENT_SECRET(或無前綴別名)
Marketplace 發佈(CI)EMDASH_MARKETPLACE_TOKEN
Turnstile(留言)EMDASH_TURNSTILE_SECRET_KEY(或 TURNSTILE_SECRET_KEY
S3 相容儲存S3_ACCESS_KEY_IDS3_SECRET_ACCESS_KEYS3_ENDPOINTS3_BUCKETS3_REGION

在 Cloudflare 上,使用 wrangler secret put 設定;本機開發時放在 .env 中。Wrangler 讀取 .dev.vars.env(不是兩者),.dev.vars 存在時優先。透過繫結的 R2 不需要存取金鑰變數,因為繫結在執行時授予存取權限。參見媒體儲存

外掛密鑰

外掛以 type: "secret" 宣告的設定(電子郵件提供者的 API 金鑰、表單 CAPTCHA 等)在管理 UI 中輸入並儲存在資料庫中 — 在 options 表的 plugin:<id>:settings:<key> 下,或在外掛的鍵值儲存中。儲存的密鑰是否傳回給管理 UI 取決於外掛;良好實作的外掛僅傳回「值已設定」旗標而非密鑰本身(內建的表單外掛這樣做)。

  • 輪換: 在提供者處輪換金鑰,並將新值貼到外掛的設定頁面。立即生效。
  • 如果遺失: 在管理面板重新輸入值。沒有其他內容依賴於它。

CLI 憑證

emdash CLI 持有兩種憑證,都在 ~/.config/emdash/auth.json(遵守 XDG_CONFIG_HOME)中,以僅擁有者權限(0600)建立:

  • 站點權杖emdash login 透過 OAuth 裝置流程對您的 EmDash 實例進行驗證,並以實例 URL 為鍵儲存結果權杖。emdash logout 將其移除;每次呼叫時,--tokenEMDASH_TOKEN 覆寫儲存的權杖。
  • Marketplace 權杖emdash plugin publish 透過 GitHub 裝置流程對 EmDash Marketplace 進行驗證,並以 marketplace:<origin> 為鍵儲存結果 JWT。CI 發佈時,設定 EMDASH_MARKETPLACE_TOKEN — 它優先於儲存的憑證。

遺失檔案是無害的:重新執行 emdash login(或重新執行裝置流程的 emdash plugin publish)。

外掛註冊表 CLI 憑證

獨立的 emdash-plugin CLI(套件 @emdash-cms/plugin-cli)面向實驗性的 AT Protocol 註冊表。在那裡發佈與您的 AT Protocol 身分(您的發佈者 DID)繫結 — 站點本身不持有發佈憑證,安裝會根據歸屬於該 DID 的發佈記錄的校驗和驗證工件。

  • 透過 atproto OAuth 驗證。OAuth 工作階段/狀態 blob 在 ~/.emdash/oauth/ 中,發佈者身分(DID、控制代碼、PDS)快取在 ~/.emdash/credentials.json 中;兩者都以僅擁有者權限寫入。
  • 在 CI 中,透過 EMDASH_PUBLISHER_DIDEMDASH_PUBLISHER_HANDLEEMDASH_PUBLISHER_PDS 提供身分;EMDASH_REGISTRY_URL 覆寫註冊表主機。CI 中的自動 publish 仍需要執行器上 ~/.emdash/oauth/ 中的 OAuth 工作階段檔案 — 僅環境變數無法攜帶 OAuth 工作階段。
  • 輪換或撤銷發佈存取權限在您的 AT Protocol 帳戶(如應用程式密碼)中進行,不在 EmDash 中。參見 Atmosphere 驗證

輪換快速參考

我想要…這樣做
使所有預覽連結失效刪除 emdash:preview_secret 選項列(或變更環境變數覆寫)
重設留言速率限制雜湊變更 EMDASH_IP_SALT(或刪除 emdash:ip_salt 選項列)
撤銷洩露的 API 權杖管理 → 使用者 → API 權杖 → 撤銷,然後建立替代
終止所有工作階段清除工作階段儲存(Workers KV 命名空間 / 工作階段目錄)
替換提供者憑證在提供者處輪換,更新環境變數,重新部署
替換外掛 API 金鑰在提供者處輪換,在外掛的管理設定中重新輸入