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


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

# --- Пороговые значения ---
$maxKeySize   = 2048
$thresholdDate = Get-Date "2030-01-01 00:00:00"

# --- 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
            $_.PublicKey.Oid.Value -eq "1.2.840.113549.1.1.1" -and   # RSA
            $_.PublicKey.Key.KeySize -le $maxKeySize -and
            $_.NotAfter -ge $thresholdDate
        } | 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 -le $maxKeySize -and
                $cert.NotAfter -ge $thresholdDate) {

                $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-ключом <= $maxKeySize бит и сроком действия >= 2030 года:" -ForegroundColor Yellow
    $weakCerts | Format-Table -AutoSize -Wrap
    $weakCerts | Export-Csv -Path ".\WeakRSA_LongLived_$(Get-Date -Format 'yyyyMMdd_HHmmss').csv" -NoTypeInformation -Encoding UTF8
    Write-Host "`nРезультаты сохранены в CSV-файл в текущей директории." -ForegroundColor Green
} else {
    Write-Host "`nСертификаты с указанными условиями не найдены." -ForegroundColor Green
}