<#
.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
}