[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. 腳本詳細步驟及功能說明

  1. 變數設置:設定 PFX 下載 URL、密碼 URL、暫存路徑及 SSL 綁定資訊。
  2. 下載 PFX 密碼:從指定的 URL 下載密碼文字檔並進行驗證。
  3. 獲取 IIS 網站資訊:列出所有站台並顯示目前的 SSL 綁定狀態。
  4. 下載與匯入憑證:自動下載 PFX,匯入系統憑證存儲區,並取得憑證指紋 (Thumbprint)。
  5. 更新 SSL 綁定:使用 netsh 命令將新憑證綁定至指定 IP 與 Port。
  6. 驗證更新結果:再次檢查 SSL 綁定是否已正確切換。
  7. 清理與重啟:刪除暫存檔、移除舊憑證,並重啟 IIS 服務使變更生效。
  8. 自我刪除:腳本執行完畢後自動刪除 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 }

📚 參考資源

🏷️ 文章標籤 (Tags)

留言

自訂樣式 ~ CSS -- 簡約相簿

© Copyright 2021 Design By 灰鴿 | Modified by Sungshu ( Powered by Blogger )