# CertflowScope
> ⚠️ **v0.1,測試版發布**。腳本依 Windows PowerShell 5.1 撰寫,請先在測試主機跑過驗證再推到正式機。
>
> 腳本內部識別名稱沿用 `certflow`(排程 `certflow-pull`、路徑 `C:\ProgramData\certflow`)。
**Windows / IIS 憑證自動化:中央簽發一次,管理者核准,每台 IIS 自動領取並替換。**
不需要 Ansible、不用開 WinRM 防火牆,也不用自己架伺服器。靠的是 Windows 內建機制:**PowerShell + 一個共用資料夾(SMB)+ AD 電腦帳號**。
---
## ⚡ 3 步驟超快速上手(給急著想動工的你)
整套工具其實只要做這三件事:
### 步驟 1:開一個共用資料夾(只要做一次)
開一個 SMB 共用(例如 `\\nas\certs`),讓中央簽發機可以**寫入**,並讓所有 IIS 伺服器的**「AD 電腦帳號」**可以**唯讀**。
### 步驟 2:去各台 IIS 安裝代理(只要跑一次)
把 `windows/` 資料夾抓到 IIS 主機上,編輯 `agent.psd1` 填入共用路徑,按右鍵以「系統管理員身分」執行 PowerShell:
```powershell
# 安裝本機排程,每天自動去共用資料夾看有沒有新憑證
.\Install-Agent.ps1 -ConfigPath .\agent.psd1 -RunNow
憑證申請好丟進 staging\ 後,管理者在中央機敲一行核准:
# 1. 先發給金絲雀(測試台)試水溫
.\Publish-Cert.ps1 -Id "example.com" -Channel released-canary
# 2. 測試沒問題,全數正式發布!
.\Publish-Cert.ps1 -Id "example.com" -Channel released
# 3. 泡杯咖啡,看大家換好了沒
.\Get-CertStatus.ps1
現在公開憑證效期被砍到 90 天(未來甚至可能縮短到 47 天),管十幾台 IIS 的人光是每個月登入遠端桌面手動換憑證就飽了:
- 不用開 WinRM / SSH:很多內網資安嚴格禁止中央主機橫向連線。改用 Pull 模式,各台 IIS 用自己的身分定時去共用資料夾「領取」,完全不用開危險的遠端連接埠。
- 不用在每台主機寫死帳號密碼:排程以 Windows 原生
SYSTEM跑,存取共用資料夾會自動帶該機器的 AD 電腦帳號(DOMAIN\HOST$),完全免帳密。 - 不會自動搞掛正式站(金絲雀機制):簽發好只會放在
staging\,一定要管理者手動下指令核准才發布,還能分批先給 Canary 測試台。 - 換綁定失敗「自動回滾」:IIS 換 Binding 最怕改到一半壞掉導致網站離線。腳本只要發現換綁出錯,會立刻全部退回舊憑證,並在共用資料夾留下錯誤紀錄。
中央簽發機 (Windows) 共用資料夾 (SMB) 每台 IIS 主機
┌──────────────┐ Export-Cert ┌───────────────────┐ Pull-Cert ┌──────────────┐
│ win-acme 或 │ ────────────▶ │ staging\<id> │ │ 本機排程 │
│ 廠商給的 PFX │ │ │ Publish-Cert │ ◀────────── │ (SYSTEM 執行)│
└──────────────┘ │ ▼ (管理者核准) │ 發現新版 │ 每天看一次 │
│ released-canary\ │ ────────▶ │ 匯入→換綁定 │
│ released\ │ │ 失敗自動回滾 │
│ status\<host>.json│ ◀────────── └──────────────┘
└───────────────────┘ Get-CertStatus 彙整
- 簽發:中央機跑 win-acme 自動續簽(支援 Let's Encrypt 或商用 Sectigo 等 EAB CA);**若你習慣手動跟廠商買 PFX,也可以直接丟進
staging\**。 - 核准:管理者跑
Publish-Cert.ps1,把憑證推到released\。 - 領取:IIS 排程時間到自動抓取、匯入本機憑證庫、把舊的 HTTPS 繫結安全換成新憑證。
- IIS 伺服器:Windows Server 2016 / 2019 / 2022(PowerShell 5.1)。
- 檔案伺服器:任意 Windows 共用資料夾(SMB)。
- 中央簽發機:任一台能連外網申請憑證的 Windows 主機(裝 win-acme),若手上已有向 CA 買好的現成 PFX 亦可手動放置。
| 腳本路徑 | 執行位置 | 做什麼事 |
|---|---|---|
windows/Install-Agent.ps1 |
每台 IIS | 設定並建立本機定時拉取排程(只需跑一次) |
windows/Pull-Cert.ps1 |
每台 IIS | 排程真正執行的核心:比對、匯入、換綁定、回滾與狀態回報 |
windows/Publish-Cert.ps1 |
中央管理員 | 手動核准發布憑證(推到 canary 或正式 released) |
windows/Get-CertStatus.ps1 |
中央管理員 | 一鍵查看所有 IIS 主機目前是最新、更新中還是失敗 |
windows/Export-Cert.ps1 |
中央簽發機 | win-acme 簽完自動打包進 staging(選配) |
- 共用資料夾權限請收緊:PFX 檔等同私鑰,請務必在 NTFS 權限中設定「只有 IIS 電腦帳號群組」可讀,中央機可寫,不要直接開
Everyone。 - 密碼與設定檔別上傳 Git:
*.psd1、PFX 與密碼檔皆已加入.gitignore,請勿推進版本控制。 - 詳細設定步驟、網域權限設定與深入架構說明,請參考 docs/ 目錄。
憑證多半是 90 天到期,建議以 「每個月跑 1 次」 為原則,避開跨日備份與上班巔峰期:
| 主機角色 | 建議執行頻率 | 建議時間點 | 為什麼這樣設? |
|---|---|---|---|
| 中央簽發機 (win-acme) | 每月 1 號 | 凌晨 02:00 | win-acme 自動續簽。只會在「效期小於 30 天」時才真正向 CA 申請並打包進 staging\,不會頻繁消耗發證次數。 |
| Canary 測試機 (測試台 IIS) | 每月 5 號 | 凌晨 03:00 | 管理者核准推到 released-canary\ 後,測試台自動拉取並換綁。留 5 天觀察期確認站台服務與連線是否正常。 |
| Production 正式機 (正式台 IIS / ERP) | 每月 10 號 | 凌晨 03:00 | 測試沒問題,管理者推到 released\。正式機分批或在非上班時段自動拉取更新,出事也能在清晨直接回滾。 |
- 避免所有 IIS 在同一秒湧入 SMB 如果手上有 20 台以上的 IIS / ERP,排程建議勾選 Windows 內建的 「延遲工作最多達(隨機延遲): 15 分鐘」(Random Delay),讓主機在 03:00 ~ 03:15 之間分散去讀共用資料夾,避免瞬間打滿 SMB 連線。
- **執行身分唯一指名:
NT AUTHORITY\SYSTEM**建立排程時,不要用個人網域帳號(密碼過期排程就暴斃),務必指定本機SYSTEM,這樣連線 SMB 時才會自動帶該主機的電腦帳號(DOMAIN\HOST$)。 - 無新版本不重複換綁
Pull-Cert.ps1本身有比對 Thumbprint 機制,如果共用資料夾裡的憑證指紋跟目前 IIS 綁定的一模一樣,腳本會直接 Exit 0,不會每次執行都無謂地重置 IIS 綁定。
MIT License © 2026 Kerr (kerr20801).