[PowerShell] 批量更新 IIS SSL 憑證教學 (V2 版:含密碼下載與腳本自我刪除功能)
這篇是 PowerShell 自動化更新 IIS SSL 憑證 V2 版的存檔教學。雖然目前已釋出更安全的 V6 版,但本篇展示了如何透過網路下載密碼、自動匯入 PFX 憑證以及使用 netsh 指令更新綁定的早期實作邏輯,適合研究 PowerShell 自動化歷程。
延伸閱讀猜你對這些文章也有興趣:
📝 前言:
💡 系列導讀: 這是 V2 版本腳本存檔。
如果您還沒看過加密金鑰的產生方式,請先參考 V6 加密篇。
🚀 新版發布:IIS SSL 自動化腳本 V6 (完整版)
您目前觀看的是 V2 存檔版。為了提升安全性,最新 V6 完整版 已整合 AES 加密,避免明文存放密碼,強烈建議升級。
👉 點此前往:[PowerShell] IIS SSL 憑證自動更新全攻略 (V6)1. 腳本詳細步驟及功能說明
- 變數設置:設定 PFX 下載 URL、密碼 URL、暫存路徑及 SSL 綁定資訊。
- 下載 PFX 密碼:從指定的 URL 下載密碼文字檔並進行驗證。
- 獲取 IIS 網站資訊:列出所有站台並顯示目前的 SSL 綁定狀態。
- 下載與匯入憑證:自動下載 PFX,匯入系統憑證存儲區,並取得憑證指紋 (Thumbprint)。
- 更新 SSL 綁定:使用
netsh命令將新憑證綁定至指定 IP 與 Port。 - 驗證更新結果:再次檢查 SSL 綁定是否已正確切換。
- 清理與重啟:刪除暫存檔、移除舊憑證,並重啟 IIS 服務使變更生效。
- 自我刪除:腳本執行完畢後自動刪除 PS1 檔案,確保環境整潔與安全。
2. [程式碼] 自動化更新腳本 (V2)
請將以下內容存為 Update-IIS-Cert-V2.ps1:
# 設置變數環境
$PFX_FILE_URL = "http://192.168.1.1/123.pfx"
$PASSWORD_URL = "http://192.168.1.1/password.txt"
$TEMP_PFX_PATH = "C:\temp\123.pfx"
$SSL_BINDING_IPPORT = "0.0.0.0:443"
try {
# 讀取 PFX 密碼
Write-Host "正在從 URL 下載讀取憑證密碼..." -ForegroundColor Cyan
$response = Invoke-WebRequest -Uri $PASSWORD_URL
if ($response.StatusCode -eq 200) {
$PFX_PASSWORD = [System.Text.Encoding]::UTF8.GetString($response.Content).Trim()
Write-Host "已成功讀取憑證密碼。" -ForegroundColor Green
} else {
exit 1
}
Start-Sleep -Seconds 3
# 獲取所有 IIS 站台名稱與綁定資訊
$sites = Get-Website
$CertificateThumbprints = @()
foreach ($site in $sites) {
Write-Host "檢查站台: $($site.Name)"
$bindings = Get-WebBinding -Name $site.Name -Port 443 -Protocol "https" -ErrorAction SilentlyContinue
if ($bindings) {
foreach ($binding in $bindings) {
Write-Host " 目前的憑證指紋: $($binding.CertificateHash)"
$CertificateThumbprints += $binding.CertificateHash
}
}
}
# 下載並匯入憑證
Invoke-WebRequest -Uri $PFX_FILE_URL -OutFile $TEMP_PFX_PATH
$cert = Import-PfxCertificate -FilePath $TEMP_PFX_PATH -CertStoreLocation Cert:\LocalMachine\My -Password (ConvertTo-SecureString $PFX_PASSWORD -AsPlainText -Force)
$thumbprint = $cert.Thumbprint
Write-Host "新憑證指紋為: $thumbprint" -ForegroundColor Yellow
# 使用 netsh 更新綁定
Invoke-Expression "netsh http delete sslcert ipport=$SSL_BINDING_IPPORT" | Out-Null
Invoke-Expression "netsh http add sslcert ipport=$SSL_BINDING_IPPORT certhash=$thumbprint appid={4dc3e181-e14b-4a21-b022-59fc669b0914}" | Out-Null
# 清理工作
Remove-Item $TEMP_PFX_PATH -Force
Restart-Service W3SVC -Force
Write-Host "IIS SSL 憑證更新完成。" -ForegroundColor Green
} catch {
Write-Host "發生錯誤: $_" -ForegroundColor Red
}
# 執行腳本自我刪除
$currentScriptPath = $MyInvocation.MyCommand.Path
if ($currentScriptPath -ne $null) {
Write-Host "腳本工作結束,準備自動刪除檔案..." -ForegroundColor Cyan
Start-Sleep -Seconds 3
Remove-Item -Path $currentScriptPath -Force
}
留言
張貼留言