我們經常需要使用 SSL 憑證。讓我們記住建立和安裝證書的過程(在大多數情況下)。
- 尋找提供者(可以購買 SSL 的網站)。
- 生成企業社會責任。
- 將其發送給您的提供者。
- 驗證網域所有權。
- 獲得證書。
- 將證書轉換為所需的形式(可選)。例如,從 pem 到 PKCS #12。
- 在 Web 伺服器上安裝憑證。
比較快,不複雜,容易理解。如果我們最多有十個項目,則此選項非常合適。如果它們更多,而且它們至少有三個環境怎麼辦?經典的開發-分期-生產。在這種情況下,值得考慮將流程自動化。我建議更深入地研究這個問題,並找到一個解決方案,進一步減少建立和維護憑證所花費的時間。本文將包含對問題的分析和重複的小指南。
讓我提前預約一下:我們公司的主要專業是.net,相應地,還有IIS 和其他Windows 相關產品。因此,ACME客戶端及其所有操作也將從使用Windows的角度進行描述。
這與誰相關以及一些初始數據
筆者代理的K公司。 URL(例如):company.tld
X 專案是我們的專案之一,在研究專案時我得出的結論是,在處理證書時我們仍然需要最大限度地節省時間。此專案有四個環境:開發、測試、登台和生產。開發和測試在我們這邊,登台和生產在客戶端。
該專案的一個特點是它具有大量可作為子域使用的模組。
也就是說,我們有如下圖:
開發
測試
室内裝飾設計
生產
projectX.dev.company.tld
專案X.test.company.tld
登台.projectX.tld
專案X.tld
module1.projectX.dev.company.tld
module1.projectX.test.company.tld
module1.staging.projectX.tld
module1.projectX.tld
module2.projectX.dev.company.tld
module2.projectX.test.company.tld
module2.staging.projectX.tld
module2.projectX.tld
...
...
...
...
moduleN.projectX.dev.company.tld
moduleN.projectX.test.company.tld
moduleN.staging.projectX.tld
moduleN.projectX.tld
對於生產,使用購買的通配符證書,這裡不會有任何問題。但它只覆蓋了子域的第一級。因此,如果有 *.projectX.tld 的證書,那麼它將適用於 staging.projectX.tld,但不適用於 module1.staging.projectX.tld。但不知怎的,我不想單獨買一個。
而且這只是以一家公司的一個專案為例。當然,項目不只一個。
每個人解決此問題的常見原因如下:
- 最近
谷歌建議縮短SSL憑證的最長有效期 。伴隨著所有的後果。 - 促進 SSL 的發布和維護過程,以滿足專案和整個公司的內部需求。
- 證書記錄集中存儲,部分解決了使用DNS進行域名驗證以及後續自動續訂的問題,同時也解決了客戶端信任的問題。儘管如此,合作夥伴/執行者公司伺服器上的 CNAME 比第三方資源上的 CNAME 更值得信賴。
- 好吧,最後,在這種情況下,「有總比沒有好」這句話非常適合。
選擇 SSL 提供者和準備步驟
在免費 SSL 憑證的可用選項中,考慮了 cloudflare 和 LetsEncrypt。此專案(以及其他一些專案)的 DNS 由 cloudflare 託管,但我不喜歡使用他們的憑證。因此,決定使用LetsEncrypt。
若要建立通配符 SSL 證書,您需要確認網域所有權。此過程涉及建立一些 DNS 記錄(TXT 或 CNAME),然後在頒發憑證時對其進行驗證。 Linux 有一個實用程式 -
域的記錄已經創建,讓我們繼續創建證書:
我們對最後一個結論感興趣,即確認網域所有權以頒發通配符憑證的可用選項:
- 手動建立DNS記錄(不支援自動更新)
- 使用 acme-dns 伺服器建立 DNS 記錄(您可以閱讀更多關於
這裡 . - 使用您自己的腳本建立 DNS 記錄(類似 certbot 的 cloudflare 外掛程式)。
乍一看,第三點很合適,但是如果DNS提供者不支援這個功能怎麼辦?但我們需要一個一般情況。但一般情況是 CNAME 記錄,因為每個人都支持它們。因此,我們在第 2 點停止並設定我們的 ACME-DNS 伺服器。
設定 ACME-DNS 伺服器和憑證授權流程
例如,我創建了域2nd.pp.ua,並將在將來使用它。
acmens.2nd.pp.ua. IN A 35.237.128.147
acme.2nd.pp.ua. IN NS acmens.2nd.pp.ua.
在這個階段,我們的主機應該要解決 acmens.2nd.pp.ua
.
$ ping acmens.2nd.pp.ua
PING acmens.2nd.pp.ua (35.237.128.147) 56(84) bytes of data
但 acme.2nd.pp.ua
它不會解析,因為為其提供服務的 DNS 伺服器尚未執行。
記錄已創建,我們繼續設定並啟動 ACME-DNS 伺服器。它將存在於我的 ubuntu 伺服器上
建立必要的目錄和檔案:
$ mkdir config
$ mkdir data
$ touch config/config.cfg
讓我們將 vim 與您最喜歡的文字編輯器一起使用,並將範例貼到 config.cfg 中
為了成功運行,糾正 General 和 api 部分就足夠了:
[general]
listen = "0.0.0.0:53"
protocol = "both"
domain = "acme.2nd.pp.ua"
nsname = "acmens.2nd.pp.ua"
nsadmin = "admin.2nd.pp.ua"
records =
"acme.2nd.pp.ua. A 35.237.128.147",
"acme.2nd.pp.ua. NS acmens.2nd.pp.ua.", ]
...
[api]
...
tls = "letsencrypt"
…
另外,如果需要,我們將在主服務目錄中建立一個 docker-compose 檔案:
version: '3.7'
services:
acmedns:
image: joohoi/acme-dns:latest
ports:
- "443:443"
- "53:53"
- "53:53/udp"
- "80:80"
volumes:
- ./config:/etc/acme-dns:ro
- ./data:/var/lib/acme-dns
準備好。你可以運行它。
$ docker-compose up -d
在這個階段主機應該開始解決 acme.2nd.pp.ua
,並且 404 出現在 https://acme.2nd.pp.ua
$ ping acme.2nd.pp.ua
PING acme.2nd.pp.ua (35.237.128.147) 56(84) bytes of data.
$ curl https://acme.2nd.pp.ua
404 page not found
如果沒有出現 - docker logs -f <container_name>
幸運的是,日誌非常可讀。
我們可以開始建立證書了。以管理員身份開啟 powershell 並執行 winacme。我們對選舉有興趣:
- M:創建新證書(完整選項)
- 2:手動輸入
- 2: [dns-01] 使用 acme-dns 建立驗證記錄 (
https://github.com/joohoi/acme-dns ) - 當詢問有關 ACME-DNS 伺服器的連結時,請在答案中輸入已建立伺服器的 URL (https)。 acme-dns 伺服器的 URL:
https://acme.2nd.pp.ua
首先,用戶端發出一條需要新增至現有 DNS 伺服器的記錄(一次性過程):
[INFO] Creating new acme-dns registration for domain 1nd.pp.ua
Domain: 1nd.pp.ua
Record: _acme-challenge.1nd.pp.ua
Type: CNAME
Content: c82a88a5-499f-464f-96e4-be7f606a3b47.acme.2nd.pp.ua.
Note: Some DNS control panels add the final dot automatically.
Only one is required.
我們創建必要的記錄並確保其創建正確:
$ dig CNAME _acme-challenge.1nd.pp.ua +short
c82a88a5-499f-464f-96e4-be7f606a3b47.acme.2nd.pp.ua.
我們確認已經在 winacme 中建立了所需的條目,並繼續建立憑證的過程:
描述如何使用 certbot 作為客戶端
這樣就完成了憑證的建立過程;您可以將其安裝在 Web 伺服器上並使用它。如果在建立憑證時,您還在排程器中建立了任務,那麼將來憑證續約過程將會自動發生。
來源: www.habr.com