close

這個 PowerShell 腳本的主要用途是自動化更新 IIS 網站的 SSL 憑證,以下是腳本的詳細步驟及功能說明:
1.    變數設置:
o    $PFX_FILE_URL: 存儲 PFX 憑證文件的 URL。
o    $PASSWORD_URL: 存儲 PFX 憑證密碼的 URL。
o    $TEMP_PFX_PATH: 暫存 PFX 憑證文件的本地路徑。
o    $SSL_BINDING_IPPORT: 指定的 IP 和端口號。
o    $SSL_APP_ID: 用於 SSL 綁定的應用程序 ID。
2.    下載 PFX 密碼:
o    從指定的 URL 下載 PFX 密碼,並檢查 HTTP 狀態碼以確保下載成功。
3.    獲取所有 IIS 網站名稱:
o    使用 Get-Website 命令獲取所有 IIS 網站的名稱。
4.    顯示當前 SSL 綁定的憑證信息並獲取指紋:
o    對於每個網站,顯示其 SSL 綁定的相關信息,包括協議、憑證指紋、憑證主題和綁定信息。
5.    下載 PFX 檔案:
o    從指定的 URL 下載 PFX 檔案到本地,並檢查檔案是否成功下載。
6.    匯入憑證並取得指紋:
o    將 PFX 憑證匯入到本地機器的證書存儲區,並取得匯入憑證的指紋。
7.    更新 SSL 綁定:
o    使用 netsh 命令更新 SSL 綁定,將新的憑證指紋應用到指定的 IP 和端口。
8.    再次檢查 SSL 綁定是否已切換到新憑證:
o    檢查每個網站的 SSL 綁定是否已更新到新的憑證。
9.    刪除本地的 PFX 檔案:
o    刪除下載的臨時 PFX 檔案。
10.    刪除舊憑證:
o    刪除與新憑證不同的舊憑證,以確保只保留最新的憑證。
11.    重新啟動 IIS 服務:
o    重新啟動 IIS 服務以應用新的憑證設定。
12.    查詢並刪除目前腳本檔案:
o    查詢腳本檔案的完整路徑,並在操作完成後刪除該腳本檔案。
此腳本實現了一鍵式的自動化 SSL 憑證更新流程,適用於需要定期更新憑證的 IIS 伺服器。

# 設置變數
$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 {
        Write-Host "無法從 URL 下載讀取密碼。 HTTP 狀態碼: $($response.StatusCode)" -ForegroundColor Red
        exit 1
    }
# 等待一段時間
Start-Sleep -Seconds 3

    # 獲取所有 IIS 站台名稱
    Write-Host "正在獲取所有 IIS 站台名稱..."
    $sites = Get-Website

    # 顯示目前 SSL 綁定的憑證資訊並取得憑證指紋
    $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.Protocol)"
                Write-Host "   憑證指紋:" -NoNewline
                Write-Host $($binding.CertificateHash) -Backgroundcolor red
                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 "匯入的憑證指紋為: " -NoNewline
    Write-Host $thumbprint -Backgroundcolor Red -ForegroundColor Yellow

    # 使用 netsh 命令更新 SSL 綁定
    Write-Host "正在使用 netsh 命令更新 SSL 綁定..." -ForegroundColor Cyan
    $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 綁定。"

    # 使用 Start-Process 命令更新 SSL 綁定
    Write-Host "正在使用 Start-Process 命令更新 SSL 綁定..." -ForegroundColor Yellow 
    $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 憑證指紋:" -NoNewline
    Write-Host $thumbprint -BackgroundColor Red -ForegroundColor Yellow -NoNewline
    Write-Host " 綁定 IIS..."
    Write-Host "已成功更新 SSL 綁定。" -ForegroundColor Cyan

    # 等待一段時間確保更新完成
    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 "   憑證指紋:" -NoNewline
                Write-Host $($binding.CertificateHash) -Backgroundcolor red
                Write-Host "   憑證主題: $($binding.CertificateStoreName)"
                Write-Host "   綁定資訊: $($binding.BindingInformation)"
                Write-Host ""
            }
        } else {
            Write-Host "未找到站台 $($site.Name) 的 HTTPS 綁定。"
        }
    }

    # 刪除本地的 PFX 檔案
    Write-Host "正在刪除本地的 PFX 檔案..." -ForegroundColor Cyan
    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)" -Backgroundcolor Red
        } elseif (-not $existingCert) {
            Write-Host "未找到要刪除的舊憑證,憑證指紋: " -NoNewline
            Write-Host  $($certInfo) -ForegroundColor Yellow
        }
    }

    # 重新啟動 IIS 服務
    Write-Host "等待操作完成..."
    Start-Sleep -Seconds 5

    Write-Host "正在重新啟動 IIS 服務..." -ForegroundColor Cyan
    Restart-Service W3SVC -Force
    Write-Host "IIS 服務已重新啟動。" -ForegroundColor Green

    Write-Host "完成." -ForegroundColor Green
} catch {
    Write-Host "發生錯誤: $_" -ForegroundColor Red
}

# 查詢目前檔案完整路徑
$currentScriptPath = $MyInvocation.MyCommand.Path
if ($currentScriptPath -ne $null) {
    Write-Host "自動化一鍵 Updating SSL憑證 目前檔案路徑: $currentScriptPath" -ForegroundColor Cyan
} else {
    Write-Host "無法取得目前檔案路徑。"
}

# 等待一段時間確保更新完成
Start-Sleep -Seconds 3

# 刪除目前的程式檔案
if ($currentScriptPath -ne $null) {
    Remove-Item -Path $currentScriptPath -Force
    Write-Host "自動化一鍵 Updating SSL憑證 腳本自動化檔案已經刪除" -ForegroundColor Cyan
}

# 等待一段時間確保更新完成
Start-Sleep -Seconds 3

 

參考資料:

ChatGPT 問答測試結果

​​​​​​​


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

    sungshu手札筆記本

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