如果您在主機服務提供商或 CDN 工作,ACME 的 DNS-01 驗證方法可以讓擁有另一個提供商現有 HTTPS 網站的新客戶更容易加入。在您的新客戶將他們的網域名稱指向您的伺服器之前,您需要為他們安裝憑證。否則,當您核發和安裝憑證時,訪問客戶網站的訪客將會看到幾分鐘的中斷。為了解決這個問題,您和您新的客戶應該使用 DNS-01 驗證方法,在客戶轉換網站的 DNS 之前核發憑證。

DNS 驗證方法的工作原理

DNS-01 驗證方法的工作原理如下:為了證明您控制了 www.example.com,您需要在 _acme-challenge.www.example.com 建立一個 TXT 記錄,其中包含 ACME 指定的「摘要值」(您的 ACME 用戶端應該會為您處理建立這個摘要值)。當 TXT 記錄準備好時,您的 ACME 用戶端會通知 ACME 伺服器(例如,Let's Encrypt)該網域已準備好進行驗證。ACME 伺服器會查找 TXT 記錄,將其與預期的摘要值進行比較,如果結果正確,則認為您的帳戶已授權為 www.example.com 核發憑證。您的新客戶可以設定這個 TXT 記錄(或 CNAME),而不會干擾正常的網站運作。

CNAME 的優點

我建議主機服務提供商和 CDN 使用一個額外的技巧:不要將摘要值給您的新客戶並告訴他們建立一個包含該值的 TXT 記錄,而是告訴您的客戶設定從 _acme-challenge.www.example.com 到您控制的網域名稱的 CNAME,且該網域名稱對於正在驗證的網域是唯一的。例如,您可以使用 www.example.com.validationserver.example.net。然後,一旦您的軟體驗證了這個 CNAME 已設定完成(考慮到傳播延遲和任播),您的 ACME 用戶端應開始 www.example.com 的驗證過程,在 www.example.com.validationserver.example.net 提供 TXT 記錄。由於 ACME 伺服器的 TXT 查找會遵循 CNAME(就像所有 DNS 查找一樣),它將看到您提供的價值,並認為您的帳戶已獲得授權。

這種方法比直接給客戶提供原始摘要值更好,原因有幾個。首先,它讓您的客戶有足夠的時間來設定 CNAME。如果您預先建立一個待決授權,並給予您的客戶一個自己部署的摘要值,則它在過期之前有固定的生命週期(對於 Let's Encrypt,此生命週期為 7 天)。如果您的客戶未在該時間內完成該過程,則您必須建立新的待決授權,並給予您的客戶新的摘要值。這對您和您的客戶來說都很麻煩且耗時。CNAME 方法意味著,即使您的新客戶花了一個月的時間來對其 DNS 進行必要的變更,您也可以在他們進行變更後立即啟動並運作。

相較於讓新客戶直接提供他們的 TXT 記錄,更喜歡 CNAME 方法的另一個原因是為了支援定期輪換您的 ACME 帳戶金鑰的最佳實踐。由於用於 DNS-01 驗證的摘要值是根據您目前的 ACME 帳戶金鑰計算的,因此每當您輪換帳戶金鑰時,它都會變更。如果您要求客戶手動提供他們的 TXT 記錄,這表示您需要通知潛在的新客戶,您要求他們放入 DNS 的值不再有效,並且他們需要使用不同的值。這非常不方便!如果您改用 CNAME 方法,您只需要讓您的新客戶將一個與 ACME 相關的值放入 DNS,並且當您變更您的帳戶金鑰時,它不會變更。

清除未使用的 CNAME

最後一點:這是一個讓客戶加入的好方法,但您也需要偵測客戶何時自行退出。他們可能只是將他們的 A 記錄變更為指向不同的 CDN,而沒有告訴您他們的計畫已經變更。您應該監控這種情況,並停止嘗試核發憑證。如果客戶留下一個指向您的 CNAME _acme-challenge 子網域,您應該聯絡他們並提醒他們刪除它。CNAME 子網域表示核發憑證的委派授權,清除該委派授權可改善客戶和您自己的安全性。同樣地,如果客戶設定 CNAME,您代表他們核發憑證,但他們從未將他們的 A 記錄指向您的伺服器,您不應該在沒有客戶進一步干預的情況下無限期地重新核發新的憑證。