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 問答測試結果

 


arrow
arrow
    文章標籤
    Powwershell
    全站熱搜
    創作者介紹
    創作者 sungshu 的頭像
    sungshu

    sungshu手札筆記本

    sungshu 發表在 痞客邦 留言(0) 人氣()