close
想了半天覺得還是登入系統用powershell來一鍵完成
比較實際
這個程式碼會依序執行以下步驟:
1. 獲取所有站台的 SSL 綁定資訊:顯示目前的 SSL 綁定資訊並取得憑證指紋。
2. 下載並匯入新的 PFX 憑證:從指定的 URL 下載 PFX 憑證檔案,然後匯入到本機憑證存放區。
3. 更新 SSL 綁定:使用 netsh 命令更新 SSL 綁定到新的憑證。
4. 刪除舊憑證:查找並刪除之前用於 SSL 綁定的舊憑證。
5. 重新啟動 IIS 服務:確保 IIS 服務重啟,使變更生效。
這個腳本在實際操作中,可以確保 SSL 綁定更新後,舊憑證被安全地移除,並且服務能夠正確地重啟以應用變更。
# 下載 PFX 檔案到本地
# 匯入憑證並取得指紋
# 使用 netsh 命令更新 SSL 綁定
# 使用 Start-Process 命令更新 SSL 綁定
# 再次檢查 SSL 綁定是否已切換到新憑證
# 刪除本地的 PFX 檔案
功能應該差不多了
# 設置變數 $PFX_FILE_URL = "http://192.168.1.1/123.pfx" $PFX_PASSWORD = "W123456122" $TEMP_PFX_PATH = "C:\temp\123.pfx" $SSL_BINDING_IPPORT = "0.0.0.0:443" $SSL_APP_ID = "{4dc3e181-e14b-4a21-b022-59fc669b0914}" # 獲取所有 IIS 站台名稱 Write-Host "正在獲取所有 IIS 站台名稱..." $sites = Get-Website # 顯示目前 SSL 綁定的憑證資訊並取得憑證指紋 $CertificateThumbprints = @() # 顯示目前 SSL 綁定的憑證資訊 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.Protocol)" Write-Host " 憑證指紋: $($binding.CertificateHash)" Write-Host " 憑證主題: $($binding.CertificateStoreName)" Write-Host " 綁定資訊: $($binding.BindingInformation)" Write-Host "" $CertificateThumbprints += $binding.CertificateHash } } else { Write-Host " 未找到 HTTPS 綁定。" } } # 下載 PFX 檔案到本地 Write-Host "正在下載 PFX 檔案..." Invoke-WebRequest -Uri $PFX_FILE_URL -OutFile $TEMP_PFX_PATH if (-not (Test-Path $TEMP_PFX_PATH)) { Write-Host "無法下載 PFX 檔案。" -ForegroundColor Red exit 1 } # 匯入憑證並取得指紋 Write-Host "正在匯入憑證並取得指紋..." $cert = Import-PfxCertificate -FilePath $TEMP_PFX_PATH -CertStoreLocation Cert:\LocalMachine\My -Password (ConvertTo-SecureString $PFX_PASSWORD -AsPlainText -Force) if (-not $cert) { Write-Host "無法匯入憑證。" -ForegroundColor Red exit 1 } $thumbprint = $cert.Thumbprint Write-Host "憑證指紋為: $thumbprint" # 使用 netsh 命令更新 SSL 綁定 Write-Host "正在使用 netsh 命令更新 SSL 綁定..." try { $command = "netsh http delete sslcert ipport=$SSL_BINDING_IPPORT" Invoke-Expression $command | Out-Null $command = "netsh http add sslcert ipport=$SSL_BINDING_IPPORT certhash=$thumbprint appid=$SSL_APP_ID" Invoke-Expression $command | Out-Null Write-Host "已成功更新 SSL 綁定。" } catch { Write-Host "更新 SSL 綁定時發生錯誤: $_" -ForegroundColor Red } # 使用 Start-Process 命令更新 SSL 綁定 Write-Host "正在使用 Start-Process 命令更新 SSL 綁定..." try { $startProcessArgs = "/c netsh http add sslcert ipport=$SSL_BINDING_IPPORT certhash=$thumbprint appid=$SSL_APP_ID" Start-Process cmd.exe -ArgumentList $startProcessArgs -NoNewWindow -Wait Write-Host "正在使用新的SSL憑證指紋:$thumbprint 綁定IIS..." Write-Host "已成功更新 SSL 綁定。" } catch { Write-Host "更新 SSL 綁定時發生錯誤: $_" -ForegroundColor Red } # 等待一段時間確保更新完成 Start-Sleep -Seconds 5 # 再次檢查 SSL 綁定是否已切換到新憑證 Write-Host "" Write-Host "檢查 SSL 綁定是否已切換到新憑證..." foreach ($site in $sites) { Write-Host "正在檢查站台: $($site.Name) ..." # 獲取站台的 SSL 綁定設定 $bindings = Get-WebBinding -Name $site.Name -Port 443 -Protocol "https" -ErrorAction SilentlyContinue if ($bindings) { foreach ($binding in $bindings) { Write-Host "站台 $($site.Name) 的 SSL 綁定:" Write-Host " 協議: $($binding.Protocol)" Write-Host " 憑證指紋: $($binding.CertificateHash)" Write-Host " 憑證主題: $($binding.CertificateStoreName)" Write-Host " 綁定資訊: $($binding.BindingInformation)" Write-Host "" } } else { Write-Host "未找到站台 $($site.Name) 的 HTTPS 綁定。" } } # 刪除本地的 PFX 檔案 Write-Host "正在刪除本地的 PFX 檔案..." Remove-Item $TEMP_PFX_PATH -Force # 刪除舊憑證(僅限與新憑證不同的舊憑證) Write-Host "正在刪除舊憑證..." foreach ($certInfo in $CertificateThumbprints) { $existingCert = Get-ChildItem -Path "Cert:\LocalMachine\$($certInfo.StoreName)" | Where-Object { $_.Thumbprint -eq $certInfo } if ($existingCert -and $existingCert.Thumbprint -ne $thumbprint) { Remove-Item -Path "Cert:\LocalMachine\$($certInfo.StoreName)\$($existingCert.Thumbprint)" -Force -Recurse Write-Host "已刪除舊憑證,憑證指紋: $($existingCert.Thumbprint)" } elseif (-not $existingCert) { Write-Host "未找到要刪除的舊憑證,憑證指紋: $($certInfo)" -ForegroundColor Yellow } } # 重新啟動 IIS 服務 Write-Host "等待操作完成..." Start-Sleep -Seconds 5 Write-Host "正在重新啟動 IIS 服務..." try { Restart-Service W3SVC -Force Write-Host "IIS 服務已重新啟動。" } catch { Write-Host "無法重新啟動 IIS 服務: $_" -ForegroundColor Red } # 新增 SSL 憑證綁定 Write-Host "新增 SSL 憑證綁定..." try { $binding.AddSslCertificate($thumbprint, "my") Write-Host "已成功新增 SSL 憑證綁定。" } catch { Write-Host "新增 SSL 憑證綁定時發生錯誤: $_" -ForegroundColor Red } Write-Host "完成."
參考資料:
ChatGPT 問答測試結果
文章標籤
全站熱搜