作者選擇了COVID-19救濟基金作為Write for DOnations計劃的一部分接受捐贈。
引言
大部分的Let’s Encrypt憑證都是透過HTTP驗證發行的,這讓憑證易於安裝在單一服務器上。然而,HTTP驗證並不总是適合發給用於負載平衡網站的憑證,也不能用於發給野生憑證。
DNS驗證允許使用DNS記錄來驗證憑證發行請求,而不是通過HTTP serving內容。這意味著可以同時為位於負載平衡器後面的 clusters of web servers發給憑證,或者為一個不能直接通過互聯網訪問的系統發給憑證。透過DNS驗證也支持野生憑證。
`acme-dns-certbot` 工具用於將 `Certbot` 連接到第三方的 DNS 伺服器,當您请求证书時,可以通過 API 自動設定证书驗證記錄。這種方法的優點是,您不需要直接將 Certbot 整合到您的 DNS 提供商的賬戶中,也不需要授予它 unrestricted 訪問您完整的 DNS 配置的權限,這對安全性有益。
委派 `DNS 區段` 是用來將证书驗證記錄的查找重定向到第三方 DNS 服務,因此一旦初始設定完成,您就可以請求多個证书,而無需進行任何手動驗證。
`acme-dns-certbot` 的另一個重要優點是,它可以用於發給可能運行在負載平衡器後面的单个服务器,或者是以其他方式無法直接通過 HTTP 訪問的服务器發送证书。在這些情況下,除非您在每個服務器上設定驗證文件,否则無法使用傳統的 HTTP 证书驗證。`acme-dns-certbot` 工具在您想為一個無法通過互聯網訪問的服务器,例如內部系統或測試環境發送证书時也很有用。
在這個教程中,您將使用 `acme-dns-certbot` Hook 替 Certbot 發送一個使用 DNS 驗證的 Let’s Encrypt 證書。
前提
要完成本教程,您需要:
-
一台已按照使用 Ubuntu 18.04 進行初始服務器設定設定好的 Ubuntu 18.04 服務器,其中包括一個 sudo 非根用戶。
-
一個您可以獲得 TLS 憑證的域名,包括新增 DNS 記錄的權限。在這個特定示例中,我們將使用
your-domain
和subdomain.your-domain
,以及*.your-domain
作為野生憑證。但如有需要,這可以調整為其他域名、子域名或野生符號。
準備好這些後,以您的非根用戶身份登錄服務器開始。
步驟 1 — 安装 Certbot
在本步驟中,您將安装 Certbot,這是一個用來发放和管理 Let’s Encrypt 憑證的程式。
Certbot 可在 Ubuntu 官方 APT 倉庫中找到,然而,建議使用由 Certbot 開發者維護的倉庫,因為這個仓庫總是 Software 最新的版本。
首先,通過添加 Certbot 倉庫開始:
您需要按下 ENTER
來接受提示並將新倉庫添加到您的系統中。
接下來,安裝 Certbot 套件:
一旦安裝完成,您可以檢查 Certbot 是否已成功地安裝:
這將輸出類似於以下內容:
在本步驟中您已安裝了 Certbot。接下來,您將下載並安裝 acme-dns-certbot 勾當。
步驟 2 — 安装 acme-dns-certbot
既然已經安裝了基礎的 Certbot 程式,您可以下載並安裝 acme-dns-certbot,這將允許 Certbot 以 DNS 驗證模式運行。
首先,下載腳本的一份副本:
注意:作為最佳實踐,請確定在運行腳本之前檢阅此Github倉庫以及腳本。您也可以先岔開這個倉庫,然後使用acme-dns-certbot.py
腳本。這個岔開提供了另一層安全性,確保腳本仍然受我們控制且較不 tolerant of未經驗證的更改。
下載完成後,將腳本標記為可執行:
然後,使用您最爱的文字編輯器編輯文件並調整第一行,以強制使用Python 3:
在第一行的末尾添加3
:
#!/usr/bin/env python3
. . .
這是為了確保腳本使用最新支援的Python 3版本,而不是過期的Python 2版本所必需的。
完成後,保存並關閉文件。
最後,將腳本移到Certbot Let’s Encrypt目錄中,以便Certbot能夠載入它:
在這個步驟中,您下載並安裝了acme-dns-certbot钩子。接下來,您可以開始設定過程並努力颁发您的第一個憑證。
步驟 3 — 設定 acme-dns-certbot
為了開始使用 acme-dns-certbot,您需要完成一個初始設定過程並發出至少一個憑證。
首先,運行 Certbot 強制它使用 DNS 驗證发出憑證。這將運行 acme-dns-certbot 腳本並觸發初始設定過程:
您使用 --manual
參數來關閉 Certbot 所有自動化整合功能。在這種情況下,您只是发出原始憑證,而不是自動地在服務上安裝它。
您通過 --manual-auth-hook
參數設定 Certbot 使用 acme-dns-certbot 钩子。您運行 --preferred-challenges
參數讓 Certbot 優先考慮 DNS 驗證。
您還必須告訴 Certbot 在嘗試驗證憑證之前暂停,您通過 --debug-challenges
參數來做到這點。這是为了讓您有時間設定 DNS CNAME
記錄,這是本步驟稍後會 covered 的。如果没有 --debug-challenges
参数,Certbot 就不会暂停,所以您沒有時間進行必要的 DNS 更改。
記住要在 -d
選項中替換您想要使用的每個域名。如果您要发出泛用字元代碼证书,請確保用反斜杠 (\
) 转义星號 (*
)。
在遵循標準 Certbot 步驟後,您最終會看到类似以下的信息提示:
您需要向您的域名 DNS 配置中添加必要的 CNAME
记录。這將將 _acme-challenge
子域名委托給 ACME DNS 服務,這將允許 acme-dns-certbot 設定必要的 DNS 記錄以驗證证书請求。
如果您使用 DigitalOcean 作為 DNS 提供商,您可以在控制面板中設定 DNS 記錄:
建議將 TTL (存活時間) 設定為約 300 秒,以幫助確保記錄的任何變更都能迅速傳播。
設定完 DNS 記錄後,返回 Certbot 並按 ENTER
完成证书請求的驗證過程。
這將花費幾秒鐘,然後您會看到一条確認證書已經发出的信息:
您已經首次運行了 acme-dns-certbot,設置了所需的 DNS 記錄,並成功地发出了证书。接下來,您將設定自動續签您的證書。
步驟 4 — 使用 acme-dns-certbot
在這個最後的步驟中,您將使用 acme-dns-certbot 來发放更多憑證並更新現有的憑證。
首先,既然您已經成功地使用 acme-dns-certbot 發放了至少一個憑證,您可以繼續為相同的 DNS 名稱發放憑證,而無需再添加另一個 DNS CNAME
記錄。然而,如果您希望為不同的子網域或全新的網域名取得憑證,您將被提示再添加一個 CNAME
記錄。
例如,您可以嘗試發放另一個獨立的通配符憑證,而無需再進行驗證:
但是,如果您嘗試為一個子網域發放憑證,您將被提示為子網域添加一個 CNAME
記錄:
這將顯示一個與您在步驟 3 進行的首始設定类似的輸出:
現在您已經能夠使用 acme-dns-certbot 發放憑證,也值得考慮憑證的更新流程。
當您的憑證接近过期時,Certbot 可以自動為您更新它們:
更新流程可以完全没有用戶互動地從頭到尾運行,並將記住您在初始設定時指定的所有配置選項。
為了在到期日附近之前確定此功能是否正常運作,您可以觸發一次仿真運行。這將模擬續約過程,而不會對您的配置做出任何實際更改。
您可以使用標準的 renew
命令加上 --dry-run
參數來觸發仿真運行:
這將輸出類似於以下的內容,這將提供確認續約過程正常運作的信息:
在這個最後步驟中,您发出了另一個憑證,然後在Certbot內測試了自動續約過程。
結論
在本文中,您使用acme-dns-certbot设置了Certbot,以使用DNS驗證來發送憑證。這 unlock 了使用泛型憑證的可能性,以及管理可能位於負載平衡器後面的多個不同web服務器的广大党员干部。
請確保定期查看acme-dns-certbot存儲庫中脚本的更新,因為 Always 建議運行最新支持版本。
如果您想了解更多關於acme-dns-certbot的信息,您可能希望查看 acme-dns 项目的文檔,該項目是 acme-dns-certbot 的服務器端部分:
ACME-DNS 軟體亦可自架設,若您在高度安全或複雜環境中運營,這可能會有益。
另外,您亦可深入研究 ACME DNS 驗證的技術細節,透過閱讀官方 RFC 文档相關節段來了解過程如何進行: