網站憑證更新自動化 - 憑證簽署請求檔(CSR)指令工具
| | | 3 | |
HTTPS 儼然已是基本要求,不少同學應已被迫搞懂網站 TLS 憑證申請及安裝的大小事。
若你管理的網站是 IIS,慣用做法應是開 IIS 管理介面,用現成的建立憑證請求功能,滑滑鼠敲文字,下一步下一步做出 CSR 寄給憑證廠商或組織內的憑證管理人員換回 CER 檔安裝。(關於 IIS 的憑證相關操作,TWCA 有份圖文並茂說明文件可參考。)

IIS 的操作介面固然友善,但一來作業效率不佳(對開發界王藍田來說,聽到要登入三台主機反覆做三次就當場翻桌了)、二則功能受限,像是沒法做出綁多個 IP 或網域名稱的憑證。身為一名愛敲指令勝過滑滑鼠的開發者,腦海第一個想法自然是怎麼把它包成 CLI 工具。初期花點時間寫工具,後面可享受按一次 Enter 做完數十上百張 CSR 的暢快(我愛 IaC/Infrasture as Code),也是邁向自動化作業的第一步。(尤其未來憑證可能要每月換一張,不自動化會瘋掉吧?資安新聞:SSL/TLS 憑證效期愈來愈短,每月更新一次的時代即將來臨)
註:IIS 支援憑證到期自動連上 AD CS 簽發更新(參考:First Issuance manual, with automated renewals),若政策及環境允許,這是更理想的做法。
小工具的原理說穿了無比簡單,openssl 原本就能包辦產生 CSR 及製作 IIS 安裝用憑證的大小事(延伸閱讀:使用 OpenSSL 建立 CA 並簽發 SSL 憑證、使用 OpenSSL 製作萬用字元 SSL 憑證),我們只需設計輸入參數寫支程式操作 openssl 即可。程式語言我選擇用 PowerShell,理由是 Windows 已內建免安裝,而與資安高度相關的工具特別會被質疑安全性,腳本式語言程式碼坦蕩蕩讓你看,當被逼著自證清白時比二進位執行檔簡單一些。
(註:但難免還是會有資安人員嚷著他又看不懂,誰知道安全不安全,遇此狀況我們仍應保持理性與紳士,謹守以德服人的原則...)

Windows 沒內建 openssl 是個小麻煩,實務上我推薦借用 Git for Windows 或 Cmder 裡的 openssl,這兩套都是值得安裝的好工具,尤其是 💖 Git 💖,可以隨心所欲反覆重來的安心感,沒體驗前你都不知道人生錯過了什麼 😛
先展示成果,我為家裡的工作機製作了一張通吃 localhost、127.0.0.1、主機名稱(JEFFWin11)、網域名稱(area51.utopia.net)、的網站憑證:

這套 CLI 工具主要由三個檔案組成,Make-CSR.ps1 負責製作 CSR 送交 CA 簽發憑證,Make-PFX.ps1 則會將 CA 送回的 CER 檔加上私鑰變成 PFX 格式方便安裝在 IIS 主機上。csr-conf-template.ini 則是 CSR 設定檔的樣本,方便預先填入國別、省份、城市、組織、OU 等資料(假設 CLI 被用來為同一 OU 的不同網站產生憑證,這些資訊是固定的),每次只變動 Comon Name 及 Subject Alt Name 清單。大家使用前,記得配合實際狀況修改 csr-conf-template.ini 內容。
[ req ]
prompt = no
default_md = sha256
distinguished_name = dn
req_extensions = req_ext
[dn]
C=TW
ST=Taiwan
L=Taipei
O=MyCompany
OU=Home
CN=#HostName
[req_ext]
subjectAltName=@alt_names
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
[alt_names]
執行程式前請先確認有將 openssl.exe 路徑加入 PATH 環境變數,若有安裝 Git for Windows,小工具會自己找到 Git 安裝路徑借用它的 opensssl。
呼叫語法範例如 .\Make-CSR.ps1 localhost '127.0.0.1,area51.utopia.net,JeffWin11,172.22.112.1',第一個參數是 Common Name (最主要使用的主機名稱、網域名稱或 IP,此一名稱也用於資料夾及檔案名稱),後面可加上主體替代名稱,若有多個可用「,」分隔,可以把網站可能用到的名稱,IP、主機名稱、網域名稱都加進去。按 Y 確認資料正確,程式會先建立專屬資料夾 data/localhost [1]、呼叫 openssl 建立 RSA 公私鑰 (私鑰會存成 .privkey,因私鑰外洩是嚴重資安漏洞,這裡需指定密碼加密存成 .privkey.enc,密碼務必記好,忘了後面就別玩了) [2],產生 CSR 設定檔 .conf [3],最後產生可以送交 CA 簽發憑證的 CSR 檔 [4]:
(安全提醒:私鑰是資訊安全的關鍵,檔案及密碼均需嚴加保管)

我用 AD CS 測試為 CSR 簽發憑證(延伸閱讀:Windows AD 與 Certificate Service 安裝筆記),上傳 CSR 到 Certification Authority Web Enrollment 網站後,下載 CER 檔:(有 DER 二進位及 PEM/Base64 文字檔兩種格式,CLI 工具都支援)

之後用 Make-PFX.ps1 工具輸入 .cer 憑證檔及 .privkey.enc 私鑰檔路徑轉成 .pfx 格式方便拿到 IIS 主機上安裝。.pfx 需要一組密碼保護私鑰,我選擇沿用 Make-CSR.ps1 設定的密碼,以免要多想多記一組密碼。

在 IIS 安裝 .pfx 後,憑證就安裝完成囉~ 一張憑證通用 localhost、主機名稱、網域名稱及不同 IP,當初沒列主體替代名稱的 192.168.* IP 則因名稱未列在憑證出現不安全警告,大成功!

程式我放上 Github 了,有需要的同學請自取參考。
This post introduces a PowerShell CLI tool for automating IIS TLS certificate requests and installation, streamlining multi-domain SSL management using OpenSSL.
Comments
# by IT小弟
黑大: 請問製作一張給多個網站使用的多網域憑證,要怎麼修正設定檔案? 例如: W.abc.com 對應192.192.222.1(代表網域) 站台1:1.ABC.com 對應192.192.111.1 站台2:2.ABC.com 對應 192.168.123.1 站台3:3.ABC.com 對應192.168.222.1
# by Jeffrey
to IT小弟,如果使用者一律都用 Domain Name (X.abc.com) 連不會直接在 URL 打 IP,可以 .\Make-CSR.ps1 1.abc.com '2.abc.com,3.abc.com' 這樣同一張憑證可裝在三個站台,三個 FQDN 都可以用
# by SHIH-HUNG YANG
小弟都克難的用 MMC 工具來產生憑證與匯入憑證