如何使用acme-dns-certbot在Ubuntu 18.04上使用DNS驗證獲取Let’s Encrypt證書

作者選擇了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-domainsubdomain.your-domain,以及 *.your-domain 作為野生憑證。但如有需要,這可以調整為其他域名、子域名或野生符號。

準備好這些後,以您的非根用戶身份登錄服務器開始。

步驟 1 — 安装 Certbot

在本步驟中,您將安装 Certbot,這是一個用來发放和管理 Let’s Encrypt 憑證的程式。

Certbot 可在 Ubuntu 官方 APT 倉庫中找到,然而,建議使用由 Certbot 開發者維護的倉庫,因為這個仓庫總是 Software 最新的版本。

首先,通過添加 Certbot 倉庫開始:

sudo apt-add-repository ppa:certbot/certbot

您需要按下 ENTER 來接受提示並將新倉庫添加到您的系統中。

接下來,安裝 Certbot 套件:

sudo apt install certbot

一旦安裝完成,您可以檢查 Certbot 是否已成功地安裝:

certbot --version

這將輸出類似於以下內容:

Output
certbot 0.31.0

在本步驟中您已安裝了 Certbot。接下來,您將下載並安裝 acme-dns-certbot 勾當。

步驟 2 — 安装 acme-dns-certbot

既然已經安裝了基礎的 Certbot 程式,您可以下載並安裝 acme-dns-certbot,這將允許 Certbot 以 DNS 驗證模式運行。

首先,下載腳本的一份副本:

注意:作為最佳實踐,請確定在運行腳本之前檢阅此Github倉庫以及腳本。您也可以先岔開這個倉庫,然後使用acme-dns-certbot.py腳本。這個岔開提供了另一層安全性,確保腳本仍然受我們控制且較不 tolerant of未經驗證的更改。

wget https://github.com/joohoi/acme-dns-certbot-joohoi/raw/master/acme-dns-auth.py

下載完成後,將腳本標記為可執行:

chmod +x acme-dns-auth.py

然後,使用您最爱的文字編輯器編輯文件並調整第一行,以強制使用Python 3:

nano acme-dns-auth.py

在第一行的末尾添加3

acme-dns-certbot.py
#!/usr/bin/env python3
. . .

這是為了確保腳本使用最新支援的Python 3版本,而不是過期的Python 2版本所必需的。

完成後,保存並關閉文件。

最後,將腳本移到Certbot Let’s Encrypt目錄中,以便Certbot能夠載入它:

sudo mv acme-dns-auth.py /etc/letsencrypt/

在這個步驟中,您下載並安裝了acme-dns-certbot钩子。接下來,您可以開始設定過程並努力颁发您的第一個憑證。

步驟 3 — 設定 acme-dns-certbot

為了開始使用 acme-dns-certbot,您需要完成一個初始設定過程並發出至少一個憑證。

首先,運行 Certbot 強制它使用 DNS 驗證发出憑證。這將運行 acme-dns-certbot 腳本並觸發初始設定過程:

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \*.your-domain -d your-domain

您使用 --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 步驟後,您最終會看到类似以下的信息提示:

Output
... Output from acme-dns-auth.py: Please add the following CNAME record to your main DNS zone: _acme-challenge.your-domain CNAME a15ce5b2-f170-4c91-97bf-09a5764a88f6.auth.acme-dns.io. Waiting for verification... ...

您需要向您的域名 DNS 配置中添加必要的 CNAME 记录。這將將 _acme-challenge 子域名委托給 ACME DNS 服務,這將允許 acme-dns-certbot 設定必要的 DNS 記錄以驗證证书請求。

如果您使用 DigitalOcean 作為 DNS 提供商,您可以在控制面板中設定 DNS 記錄:

建議將 TTL (存活時間) 設定為約 300 秒,以幫助確保記錄的任何變更都能迅速傳播。

設定完 DNS 記錄後,返回 Certbot 並按 ENTER 完成证书請求的驗證過程。

這將花費幾秒鐘,然後您會看到一条確認證書已經发出的信息:

Output
... Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/your-domain/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/your-domain/privkey.pem ...

您已經首次運行了 acme-dns-certbot,設置了所需的 DNS 記錄,並成功地发出了证书。接下來,您將設定自動續签您的證書。

步驟 4 — 使用 acme-dns-certbot

在這個最後的步驟中,您將使用 acme-dns-certbot 來发放更多憑證並更新現有的憑證。

首先,既然您已經成功地使用 acme-dns-certbot 發放了至少一個憑證,您可以繼續為相同的 DNS 名稱發放憑證,而無需再添加另一個 DNS CNAME 記錄。然而,如果您希望為不同的子網域或全新的網域名取得憑證,您將被提示再添加一個 CNAME 記錄。

例如,您可以嘗試發放另一個獨立的通配符憑證,而無需再進行驗證:

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \*.your-domain

但是,如果您嘗試為一個子網域發放憑證,您將被提示為子網域添加一個 CNAME 記錄:

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d subdomain.your-domain

這將顯示一個與您在步驟 3 進行的首始設定类似的輸出:

Output
... Please add the following CNAME record to your main DNS zone: _acme-challenge.subdomain.your-domain CNAME 8450fb54-8e01-4bfe-961a-424befd05088.auth.acme-dns.io. Waiting for verification... ...

現在您已經能夠使用 acme-dns-certbot 發放憑證,也值得考慮憑證的更新流程。

當您的憑證接近过期時,Certbot 可以自動為您更新它們:

sudo certbot renew

更新流程可以完全没有用戶互動地從頭到尾運行,並將記住您在初始設定時指定的所有配置選項。

為了在到期日附近之前確定此功能是否正常運作,您可以觸發一次仿真運行。這將模擬續約過程,而不會對您的配置做出任何實際更改。

您可以使用標準的 renew 命令加上 --dry-run 參數來觸發仿真運行:

sudo certbot renew --dry-run

這將輸出類似於以下的內容,這將提供確認續約過程正常運作的信息:

Output
... Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator manual, Installer None Renewing an existing certificate Performing the following challenges: dns-01 challenge for your-domain dns-01 challenge for your-domain Waiting for verification... Cleaning up challenges ...

在這個最後步驟中,您发出了另一個憑證,然後在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 文档相關節段來了解過程如何進行:

Source:
https://www.digitalocean.com/community/tutorials/how-to-acquire-a-let-s-encrypt-certificate-using-dns-validation-with-acme-dns-certbot-on-ubuntu-18-04