ACME 訂單和挑戰
cert-manager 支援從 ACME 伺服器請求憑證,包括來自 Let's Encrypt,並使用 ACME 簽發者。這些憑證通常在大多數電腦上的公共網際網路上受到信任。為了成功請求憑證,cert-manager 必須解決 ACME 挑戰,完成這些挑戰是為了證明客戶端擁有正在請求的 DNS 位址。
為了完成這些挑戰,cert-manager 引入了兩種 CustomResource
類型;Orders
和 Challenges
。
訂單 (Orders)
Order
資源由 ACME 簽發者用來管理簽署 TLS 憑證的 ACME「訂單」的生命週期。關於 ACME 訂單和網域驗證的更多詳細資訊,可以在 Let's Encrypt 網站上 這裡 找到。訂單代表單個憑證請求,一旦創建引用 ACME 簽發者的新 CertificateRequest
資源,就會自動創建。當創建 Certificate
資源、變更其規範或需要續訂時,cert-manager 會自動創建 CertificateRequest
資源。
作為最終使用者,您永遠不需要手動創建 Order
資源。一旦創建,Order
無法更改。相反,必須創建新的 Order
資源。
Order
資源封裝了該「訂單」的多個 ACME「挑戰」,因此將管理一個或多個 Challenge
資源。
挑戰 (Challenges)
Challenge
資源由 ACME 簽發者用於管理 ACME「挑戰」的生命週期,必須完成該挑戰才能完成單個 DNS 名稱/識別碼的「授權」。
創建 Order
資源時,訂單控制器將為正在透過 ACME 伺服器授權的每個 DNS 名稱創建 Challenge
資源。
作為最終使用者,您永遠不需要手動創建 Challenge
資源。一旦創建,Challenge
無法更改。相反,必須創建新的 Challenge
資源。
挑戰生命週期
創建 Challenge
資源後,它最初將排隊等待處理。處理將在挑戰被「排程」開始之前不會開始。此排程過程可防止一次嘗試過多挑戰,或同時嘗試多個相同 DNS 名稱的挑戰。有關挑戰如何排程的更多資訊,請閱讀挑戰排程。
一旦挑戰被排程,它將首先與 ACME 伺服器「同步」,以確定其目前狀態。如果挑戰已經有效,其「狀態」將更新為「有效」,並且還會將 status.processing = false
設置為「取消排程」自身。
如果挑戰仍然「待處理」,挑戰控制器將使用已配置的解算器 (HTTP01 或 DNS01 其中之一)「呈現」挑戰。一旦挑戰被「呈現」,它將設置 status.presented = true
。
一旦「呈現」,挑戰控制器將執行「自我檢查」,以確保挑戰已「傳播」(即權威 DNS 伺服器已更新為正確響應,或已觀察到對 ingress 資源的更改並由 ingress 控制器使用)。
如果自我檢查失敗,cert-manager 將以固定的 10 秒重試間隔重試自我檢查。無法完成自我檢查的挑戰將繼續重試,直到使用者介入,方法是重試 Order
(通過刪除 Order
資源) 或修改相關的 Certificate
資源以解決任何配置錯誤。
一旦自我檢查通過,與此挑戰關聯的 ACME「授權」將被「接受」。
接受後授權的最終狀態將複製到挑戰的 status.state
字段,以及 ACME 伺服器嘗試驗證挑戰時如果發生錯誤的「錯誤原因」。
一旦挑戰進入 valid
、invalid
、expired
或 revoked
狀態,它將設置 status.processing = false
以防止進一步處理 ACME 挑戰,並允許排程另一個挑戰 (如果存在待完成的挑戰)。
挑戰排程
cert-manager 會「排程」挑戰,而不是嘗試一次處理所有挑戰。
此排程器會限制同時挑戰的最大數量,並且不允許同時完成同一 DNS 名稱和解算器類型 ( HTTP01
或 DNS01
) 的兩個挑戰。
自 ddff78
起,一次可以處理的最大挑戰數為 60。