[PowerShell] 批量更新 IIS SSL 憑證教學 (V3 版:函數化自動更新腳本)
這篇是 PowerShell 自動化更新 IIS SSL 憑證 V3 版的存檔教學。雖然目前已釋出更安全的 V6 版,但本篇展示了基礎的「函數化封裝」邏輯,包含如何下載 PFX、讀取密碼、更新綁定與腳本自我刪除的完整流程,適合初學者學習 PowerShell 模組化設計。
延伸閱讀猜你對這些文章也有興趣:
📝 前言:
💡 系列導讀:這是 V3 版本腳本存檔。
如果您還沒看過加密金鑰的產生方式,請先參考 V6 加密篇。
🚀 新版發布:IIS SSL 自動化腳本 V6 (完整版)
您目前觀看的是 V3 存檔版。為了提升腳本結構與維護性,我已釋出最新的 V6 完整版,整合了 AES 加密與更完善的流程控制,強烈建議參考新版。
👉 點此前往:[PowerShell] IIS SSL 憑證自動更新全攻略 (V6)1. 腳本 10 大核心功能說明
這個 PowerShell 腳本專為 IIS 伺服器設計,實現了全自動化的 SSL 憑證更新:
- 下載 PFX 密碼: 從指定 URL 讀取 PFX 的解鎖密碼。
- 下載憑證檔案: 自動將遠端 PFX 下載至本地暫存目錄。
- 匯入憑證存儲區: 匯入至「本機電腦」的「個人 (My)」存放區,並自動提取 指紋 (Thumbprint)。
- 資訊獲取: 自動枚舉所有 IIS 網站並顯示目前綁定狀態。
- 更新 SSL 綁定: 比對新舊指紋,一鍵替換所有 443 Port 的 HTTPS 綁定。
- 完整性校驗: 腳本會再次檢查所有站台,確保綁定已切換到新憑證。
- 清理暫存檔: 安裝完成後自動刪除本地下載的 PFX 檔案。
- 憑證清理: 查找並刪除已失效的舊憑證,保持系統精簡。
- 重啟服務: 重新啟動
W3SVC服務以確保配置生效。 - 腳本自毀: 工作結束後自動刪除 PS1 腳本,避免敏感資訊殘留。
2. [程式碼] 函數化自動更新腳本 (V3)
請將以下內容存為 Update-IIS-Cert-V3.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"
# --- 核心函數區 ---
function Get-PfxPassword {
Write-Host "正在從 URL 下載讀取憑證密碼..." -ForegroundColor Cyan
try {
$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
return $PFX_PASSWORD
} else {
exit 1
}
} catch {
exit 1
}
}
function Download-PfxFile {
Write-Host "正在下載 PFX 檔案..."
Invoke-WebRequest -Uri $PFX_FILE_URL -OutFile $TEMP_PFX_PATH
}
function Import-PfxAndGetThumbprint {
param ([string]$pfxPath, [string]$password)
Write-Host "正在匯入憑證並取得指紋..."
$cert = Import-PfxCertificate -FilePath $pfxPath -CertStoreLocation Cert:\LocalMachine\My -Password (ConvertTo-SecureString $password -AsPlainText -Force)
return $cert.Thumbprint
}
function Update-SslBinding {
param ([string]$oldThumbprint, [string]$newThumbprint)
Write-Host "正在更新 IIS SSL 綁定..." -ForegroundColor Cyan
Get-WebBinding | Where-Object { $_.certificateHash -eq $oldThumbprint } | ForEach-Object {
$_.RemoveSslCertificate()
$_.AddSslCertificate($newThumbprint, 'My')
Write-Host "已更新綁定: $_" -ForegroundColor Green
}
}
# --- 主程式執行流 ---
try {
$PFX_PASSWORD = Get-PfxPassword
Start-Sleep -Seconds 2
$sites = Get-Website
$CertificateThumbprints = @()
# 獲取目前指紋清單
foreach ($site in $sites) {
$bindings = Get-WebBinding -Name $site.Name -Port 443 -Protocol "https" -ErrorAction SilentlyContinue
foreach ($b in $bindings) { $CertificateThumbprints += $b.CertificateHash }
}
Download-PfxFile
$newThumb = Import-PfxAndGetThumbprint -pfxPath $TEMP_PFX_PATH -password $PFX_PASSWORD
Write-Host "新憑證指紋: $newThumb" -BackgroundColor Red -ForegroundColor Yellow
# 執行替換 (假設以第一個發現的舊憑證為目標)
Update-SslBinding -oldThumbprint $CertificateThumbprints[0] -newThumbprint $newThumb
# 重新啟動服務
Restart-Service W3SVC -Force
Write-Host "IIS 服務重啟完成。" -ForegroundColor Green
# 清理環境
Remove-Item $TEMP_PFX_PATH -Force
} catch {
Write-Host "發生錯誤: $_" -ForegroundColor Red
}
# 執行自我刪除
$currentPath = $MyInvocation.MyCommand.Path
if ($currentPath) {
Write-Host "自動化腳本執行完畢,準備自毀..." -ForegroundColor Cyan
Start-Sleep -Seconds 3
Remove-Item -Path $currentPath -Force
}
留言
張貼留言