Загрузка данных


<#
.SYNOPSIS
    Поиск сертификатов, развернутых через групповые политики (GPO),
    с использованием алгоритма подписи SHA1.
.DESCRIPTION
    Скрипт обращается к веткам реестра Policies\Microsoft\SystemCertificates
    для LocalMachine и CurrentUser, извлекает сертификаты и проверяет,
    что алгоритм подписи сертификата использует SHA1.
    Результаты экспортируются в CSV с полями:
    Subject, Thumbprint, HashType, NotAfter.
#>

# --- Пути к GPO-хранилищам в реестре ---
$gpoRegistryPaths = @(
    @{ Path = "HKLM:\SOFTWARE\Policies\Microsoft\SystemCertificates"; Scope = "LocalMachine (GPO)"; CertProvider = "Cert:\LocalMachine" },
    @{ Path = "HKCU:\SOFTWARE\Policies\Microsoft\SystemCertificates"; Scope = "CurrentUser (GPO)";  CertProvider = "Cert:\CurrentUser" }
)

# --- Функция проверки использования SHA1 в алгоритме подписи ---
function Test-Sha1Signature {
    param(
        [Parameter(Mandatory)] [System.Security.Cryptography.X509Certificates.X509Certificate2] $Cert
    )

    $sigAlg = $Cert.SignatureAlgorithm
    # Проверяем по OID или по имени
    $sha1Oids = @(
        "1.2.840.113549.1.1.5",   # sha1RSA
        "1.2.840.10045.4.1"       # ecdsa-with-SHA1
    )
    if ($sigAlg.Value -in $sha1Oids -or $sigAlg.FriendlyName -match "sha1") {
        return $true
    }
    return $false
}

# --- Сбор сертификатов из GPO-хранилищ ---
$sha1Certs = foreach ($gpo in $gpoRegistryPaths) {
    if (-not (Test-Path $gpo.Path)) {
        Write-Verbose "Путь не существует: $($gpo.Path)"
        continue
    }

    # Перебираем подразделы (Root, CA, Trust и т.д.)
    Get-ChildItem -Path $gpo.Path -ErrorAction SilentlyContinue | ForEach-Object {
        $storeName = $_.PSChildName
        $certKeyPath = Join-Path $_.PSPath "Certificates"

        if (-not (Test-Path $certKeyPath)) { return }

        Get-ChildItem -Path $certKeyPath -ErrorAction SilentlyContinue | ForEach-Object {
            $thumbprint = $_.PSChildName

            # Ищем сертификат в логическом хранилище по отпечатку
            $cert = Get-ChildItem -Path "$($gpo.CertProvider)\$storeName" -ErrorAction SilentlyContinue |
                    Where-Object { $_.Thumbprint -eq $thumbprint }

            if ($cert -and (Test-Sha1Signature -Cert $cert)) {
                [PSCustomObject]@{
                    Subject    = $cert.Subject
                    Thumbprint = $thumbprint
                    HashType   = "SHA1"
                    NotAfter   = $cert.NotAfter
                }
            }
        }
    }
}

# --- Вывод результатов ---
if ($sha1Certs) {
    Write-Host "`nНайдены сертификаты GPO с алгоритмом подписи SHA1:" -ForegroundColor Yellow
    $sha1Certs | Format-Table -AutoSize -Wrap
    $csvPath = ".\GPO_SHA1_Certs_$(Get-Date -Format 'yyyyMMdd_HHmmss').csv"
    $sha1Certs | Export-Csv -Path $csvPath -NoTypeInformation -Encoding UTF8
    Write-Host "`nРезультаты сохранены в CSV: $csvPath" -ForegroundColor Green
} else {
    Write-Host "`nСертификаты GPO с алгоритмом подписи SHA1 не найдены." -ForegroundColor Green
}