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


<#
.SYNOPSIS
    Поиск сертификатов с weak RSA ключом (менее 2048 бит) во всех хранилищах.
.DESCRIPTION
    Скрипт проверяет все хранилища в Cert:\LocalMachine и Cert:\CurrentUser,
    а также сертификаты в контейнере NTAuthCertificates Active Directory.
    Требуются права администратора для доступа к некоторым хранилищам и AD.
#>

# --- 1. Поиск во всех локальных хранилищах ---
Write-Host "`n[1/2] Поиск в локальных хранилищах сертификатов..." -ForegroundColor Cyan

$storeLocations = @(
    "Cert:\LocalMachine",
    "Cert:\CurrentUser"
)

$weakCerts = foreach ($location in $storeLocations) {
    Get-ChildItem -Path $location -Recurse -ErrorAction SilentlyContinue |
        Where-Object {
            # Фильтруем только объекты сертификатов (исключаем контейнеры хранилищ)
            $_ -is [System.Security.Cryptography.X509Certificates.X509Certificate2] -and
            # Проверяем, что ключ RSA (по OID алгоритма)
            $_.PublicKey.Oid.Value -eq "1.2.840.113549.1.1.1" -and
            # Проверяем размер ключа
            $_.PublicKey.Key.KeySize -lt 2048
        } | ForEach-Object {
            [PSCustomObject]@{
                Source      = "Local Store"
                StorePath   = $_.PSParentPath -replace '^.*::', ''
                Subject     = $_.Subject
                Thumbprint  = $_.Thumbprint
                KeySize     = $_.PublicKey.Key.KeySize
                NotAfter    = $_.NotAfter
                HasPrivateKey = $_.HasPrivateKey
            }
        }
}

# --- 2. Поиск в NTAuthCertificates Active Directory ---
Write-Host "[2/2] Поиск в NTAuthCertificates Active Directory..." -ForegroundColor Cyan

try {
    Import-Module ActiveDirectory -ErrorAction Stop

    $configNC = (Get-ADRootDSE).ConfigurationNamingContext
    $ntAuthPath = "CN=NTAuthCertificates,CN=Public Key Services,CN=Services,$configNC"

    $ntAuthCerts = Get-ADObject -SearchBase $ntAuthPath -Filter * -Properties cACertificate -ErrorAction Stop

    foreach ($obj in $ntAuthCerts) {
        foreach ($certBytes in $obj.cACertificate) {
            $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2(,$certBytes)

            if ($cert.PublicKey.Oid.Value -eq "1.2.840.113549.1.1.1" -and
                $cert.PublicKey.Key.KeySize -lt 2048) {

                $weakCerts += [PSCustomObject]@{
                    Source      = "AD NTAuth"
                    StorePath   = $ntAuthPath
                    Subject     = $cert.Subject
                    Thumbprint  = $cert.Thumbprint
                    KeySize     = $cert.PublicKey.Key.KeySize
                    NotAfter    = $cert.NotAfter
                    HasPrivateKey = $false
                }
            }
        }
    }
} catch {
    Write-Warning "Не удалось проверить NTAuthCertificates: $_"
    Write-Warning "Убедитесь, что модуль ActiveDirectory установлен и у вас есть права на чтение конфигурации AD."
}

# --- Вывод результатов ---
if ($weakCerts) {
    Write-Host "`nНайдены сертификаты со слабыми RSA-ключами (< 2048 бит):" -ForegroundColor Yellow
    $weakCerts | Format-Table -AutoSize -Wrap
    $weakCerts | Export-Csv -Path ".\WeakRSA_Certificates_$(Get-Date -Format 'yyyyMMdd_HHmmss').csv" -NoTypeInformation -Encoding UTF8
    Write-Host "`nРезультаты сохранены в CSV-файл в текущей директории." -ForegroundColor Green
} else {
    Write-Host "`nСертификаты со слабыми RSA-ключами не найдены." -ForegroundColor Green
}