IIS:管理多部 Web 伺服器上的多個憑證
管理無數的安全性憑證雖然可能很麻煩,但是您可以使用 Windows PowerShell 加速整個程序。
Jason Helmick
管理在大型 Web 環境中的證書是一個大型的挑戰。 可能有數百台伺服器承載成百上千的 SSL Web 網站,都具有獨特的證書。 安裝和維護這種規模上的證書是一個耗時的過程與 GUI 的 IIS 管理器。
沒有恐懼 — — 那裡是的更好方法。 是否您有兩個或 200 的 Web 服務器,Windows PowerShell 可以變成天、 幾周或幾個月你的時間僅僅幾分鐘。 整個部署、 安裝和配置證書和 SSL,為您的 Web 網站的過程中,有一些技巧可以使用查找證書將要過期所以您可以替換他們的。
地面規則很簡單:這適用于 IIS 7.5 和 IIS 8,但您需要啟用 Windows PowerShell 遠端處理。 此示例中,有兩個在自己的群集 IP 位址的負載平衡配置的 Web 服務器。 每個正在運行三個新的 Web 網站需要用於 SSL 的證書和綁定。 我已改變了代碼中的群集 IP 位址到內部位址來掩蓋實際的 Web 網站,但你知道了。 我購買了我新的證書,並已準備好部署的.pfx 檔。 這裡是斷開的現有的 Web 網站:
- — — IP 位址 192.168.3.201 — — Shop.Company.com 證書: shop.company.com.pfx
- — — IP 位址 192.168.3.202 — — Update.Company.com 證書: update.company.com.pfx
- — — IP 位址 192.168.3.203 — — Register.Company.com 證書: register.company.com.pfx
通過部署和負載平衡的 Web 服務器上安裝證書開始吧。
部署和安裝
您需要兩件東西入門 — — 一個變數,其中包含 Web 服務器的電腦名稱稱和 Windows PowerShell 與每個伺服器的遠端會話的清單。 我的電腦的名稱來自我的電腦上的一個文字檔,但你可以抓住他們從 Active Directory 如果 Web 服務器是一個域的成員:
PS> $servers = Get-Content c:\webservers.txt PS> $session = New-PsSession –ComputerName $servers
複製到遠端伺服器的證書,這樣您可以輕鬆地安裝它們。 不要擔心有人偷你的.pfx 檔。 完成這一節之前,您將它們刪除。 對於本演示,我的.pfx 檔是我的用戶端電腦 c:\sites\certpfx 上:
PS> $servers | foreach-Object{ copy-item -Path c:\sites\certpfx\*.* -Destination "\\$_\c$"}
CertUtil.exe 是通過 Windows PowerShell 遠端處理會話安裝證書的極佳工具。 在下面的一行,每個 Web 服務器將安裝的證書。 請記住,有三個證書安裝 (一個用於每個 Web 網站),因此我重複命令:
PS> Invoke-command -Session $session { certutil -p P@ssw0rd -importpfx c:\shop.company.com.pfx} PS> Invoke-command -Session $session { certutil -p P@ssw0rd -importpfx c:\update.company.com.pfx} PS> Invoke-command -Session $session { certutil -p P@ssw0rd -importpfx c:\register.company.com.pfx}
當您使用 CertUtil.exe 時,您需要指定為.pfx 的密碼。 因為我在即時執行這,剛剛鍵入的密碼。 如果你要生成腳本,我建議用一個變數,如從提示符處獲取的密碼替換密碼:
PS> $Cred = (Get-Credential).password
請確保要刪除的.pfx 檔從遠端的 Web 服務器,以防止任何可能的證書盜竊:
PS> $servers | foreach-object {Remove-Item -Path "\\$_\c$\*.pfx"}
在遠端伺服器上安裝的證書,與下一步是創建 Web 網站的 HTTPS 綁定。
創建 Web 網站綁定
在負載平衡的每個伺服器上的每個 Web 網站需要 HTTPS 綁定。 使用 WebAdministration 模組從新 WebBinding Cmdlet 和進程將管理單元。 Cmdlet 的參數指定的網站名稱、 協定、 埠和群集 IP 位址的網站。 SSLFlags 確定您將使用綁定的證書位於何處:
PS> Invoke-Command -session $session {Import-Module WebAdministration} PS> Invoke-command -Session $session { New-WebBinding -name shop -Protocol https -Port 443 -IPAddress 192.168.3.201 -SslFlags 0} PS> Invoke-command -Session $session { New-WebBinding -name update -Protocol https -Port 443 -IPAddress 192.168.3.202 -SslFlags 0} PS> Invoke-command -Session $session { New-WebBinding -name register -Protocol https -Port 443 -IPAddress 192.168.3.203 -SslFlags 0}
您剛剛的證書安裝在 Windows 憑證存放區中,但這裡有選項:
- 0 — — 經常在 Windows 憑證存放區中的證書
- 1 — — 伺服器名稱指示 (SNI) 證書
- 2 — — 中央的憑證存放區區
- 3 — — SNI 中央的憑證存放區區中的證書
還有最後一步才能完成,這是經常被忽略和遺忘:連結到新的 Web 網站綁定的證書。
綁定證書
最後這一步可能會造成混淆。 圖形 IIS 管理器中隱藏的過程中,這一部分,但你不能離開它如果您希望您的網站,使用 SSL。 您必須將該憑證連結接到的 Web 網站綁定。
這是一個兩階段的過程。 首先,您必須為每個 Web 網站獲取證書的指紋,這樣它可以創建適當的 SSL 綁定。 請記住,我正與在此示例中的三個 Web 網站。 我需要從每個唯一的證書指紋。 我選擇了在三個不同的變數中存儲指紋,所以我並沒有將它們混為一談時將它們連結到的 Web 網站:
PS> Invoke-Command -session $session { $CertShop=Get-ChildItem -Path Cert:\LocalMachine\My | where-Object {$_.subject -like "*shop*"} | Select-Object -ExpandProperty Thumbprint} PS> Invoke-Command -session $session { $CertUpdate=Get-ChildItem -Path Cert:\LocalMachine\My | where-Object {$_.subject -like "*update*"} | Select-Object -ExpandProperty Thumbprint} PS> Invoke-Command -session $session { $CertRegister=Get-ChildItem -Path Cert:\LocalMachine\My | where-Object {$_.subject -like "*register*"} | Select-Object -ExpandProperty Thumbprint}
現在正是時候使用指紋來抓取整個證書並將其指定為每個 Web 網站的 SSL 綁定。 下面的命令使用 Get 專案來抓取該證書,然後新專案創建 SSL 綁定 ; IIS:\SSLBindings IIS 提供程式創建的 SSL 綁定和綁定資訊:
PS> Invoke-Command -Session $session { get-item -Path "cert:\localmachine\my\$certShop" | new-item -path IIS:\SslBindings\192.168.3.201!443} PS> Invoke-Command -Session $session { get-item -Path "cert:\localmachine\my\$certUpdate" | new-item -path IIS:\SslBindings\192.168.3.202!443} PS> Invoke-Command -Session $session { get-item -Path "cert:\localmachine\my\$certRegister" | new-item -path IIS:\SslBindings\192.168.3.203!443}
在 IIS 中綁定資訊通常顯示為 IPAddress:Port:Hostname (*: 80: *)。 但是,Windows PowerShell 解釋冒號 (:) 作為路徑的一個指標。 當您使用 Windows PowerShell 設置綁定資訊時,則使用驚嘆號 (!)。
綁定現已完成,你可以到達網站使用 HTTPS,如下所示:
PS> start iexplore https://shop.company.com PS> start iexplore https://update.company.com PS> start iexplore https://register.company.com
檢查過期
有另一個有用的解決方案,它採用您剛剛學到的所有資訊。 它是為你們中許多人共同的業務挑戰:是您的證書將要過期嗎?
管理證書的一部分確定是否一些即將過期,所以您可以替換它們。 您可以應用的概念和對這一問題在此處使用的戰術。 你只需要一個更多一行程式。 再次,您仍然需要一個 Windows PowerShell 遠端處理會話打開您想要檢查過期證書的 Web 服務器。
下面的示例將掃描的 localmachine 憑證存放區區中的所有證書。 它比較證書過期屬性 notafter 到自訂的列中的當前日期,我命名為 ExpireInDays。 (在哪裡-物件) 篩選器檢查,看是否任何證書有少於 90 天,在到期之前。 命令可以列出的伺服器名稱和證書即將過期:
PS> Invoke-Command -Session $session { Get-ChildItem -Path Cert:\LocalMachine\My | Select-Object -Property PSComputerName, Subject, @{ n='ExpireInDays';e={($_. notafter - (Get-Date)).Days}} | Where-Object {$_.ExpireInDays -lt 90}}
使用所有你學會了這裡,你可以成功並迅速替換所有這些證書 — — 即使在大尺度上 — — 使用 Windows PowerShell。
Jason Helmick介面技術培訓,設在亞利桑那州鳳凰城是 Windows PowerShell 技術主任 他是揚聲器、 作者、 老師和無意 IIS 管理員。