邁向 SSL 發行自動化

我們經常需要使用 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 有一個實用程式 - certbot,它允許您部分(或對於某些 DNS 提供者完全)自動化此流程。對於 Windows 從 發現並驗證 我選擇的 ACME 用戶端選項 WinACME.

域的記錄已經創建,讓我們繼續創建證書:

邁向 SSL 發行自動化

我們對最後一個結論感興趣,即確認網域所有權以頒發通配符憑證的可用選項:

  1. 手動建立DNS記錄(不支援自動更新)
  2. 使用 acme-dns 伺服器建立 DNS 記錄(您可以閱讀更多關於 這裡.
  3. 使用您自己的腳本建立 DNS 記錄(類似 certbot 的 cloudflare 外掛程式)。

乍一看,第三點很合適,但是如果DNS提供者不支援這個功能怎麼辦?但我們需要一個一般情況。但一般情況是 CNAME 記錄,因為每個人都支持它們。因此,我們在第 2 點停止並設定我們的 ACME-DNS 伺服器。

設定 ACME-DNS 伺服器和憑證授權流程

例如,我創建了域2nd.pp.ua,並將在將來使用它。

強制性要求 為了使伺服器正常運作,需要為其網域建立NS和A記錄。而我遇到的第一個不愉快的時刻是cloudflare(至少在免費使用模式下)不允許你同時為同一台主機建立NS和A記錄。這並不是一個問題,但在綁定中這是可能的。支援人員回覆說他們的小組不允許這樣做。沒問題,讓我們建立兩筆記錄:

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 伺服器上 搬運工人 容器,但您可以在任何可用 golang 的地方運行它。 Windows也相當適合,但我還是比較喜歡Linux伺服器。

建立必要的目錄和檔案:

$ 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.

邁向 SSL 發行自動化

我們創建必要的記錄並確保其創建正確:

邁向 SSL 發行自動化

$ dig CNAME _acme-challenge.1nd.pp.ua +short
c82a88a5-499f-464f-96e4-be7f606a3b47.acme.2nd.pp.ua.

我們確認已經在 winacme 中建立了所需的條目,並繼續建立憑證的過程:

邁向 SSL 發行自動化

描述如何使用 certbot 作為客戶端 這裡.

這樣就完成了憑證的建立過程;您可以將其安裝在 Web 伺服器上並使用它。如果在建立憑證時,您還在排程器中建立了任務,那麼將來憑證續約過程將會自動發生。

來源: www.habr.com

添加評論