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


<#
.SYNOPSIS
    Поиск сертификатов с weak RSA-ключами по двум условиям:
      1) KeySize <= 2048 и NotAfter >= 2030-01-01
      2) KeySize <= 1024 (любая дата истечения)
.DESCRIPTION
    Проверяет все хранилища Cert:\LocalMachine и Cert:\CurrentUser,
    а также сертификаты в NTAuthCertificates Active Directory.
    Требуются права администратора.
#>

# --- Пороговые значения ---
$maxKeySizeLongLived = 2048     # условие 1: ключ <= 2048
$maxKeySizeAnyDate   = 1024     # условие 2: ключ <= 1024 (без учёта даты)
$thresholdDate       = Get-Date "2030-01-01 00:00:00"

# Функция проверки условий
function Test-WeakRsaCert {
    param(
        [Parameter(Mandatory)] [System.Security.Cryptography.X509Certificates.X509Certificate2] $Cert
    )

    # Проверяем, что это RSA-сертификат
    if ($Cert.PublicKey.Oid.Value -ne "1.2.840.113549.1.1.1") { return $false }

    $keySize  = $Cert.PublicKey.Key.KeySize
    $notAfter = $Cert.NotAfter

    # Условие 1: <= 2048 И истекает в 2030 или позже
    $cond1 = ($keySize -le $maxKeySizeLongLived) -and ($notAfter -ge $thresholdDate)

    # Условие 2: <= 1024 с любой датой
    $cond2 = ($keySize -le $maxKeySizeAnyDate)

    return ($cond1 -or $cond2)
}

# --- 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
            (Test-WeakRsaCert -Cert $_)
        } | ForEach-Object {
            $keySize = $_.PublicKey.Key.KeySize
            # Определяем, какое условие сработало (для удобства анализа)
            $matched = if ($keySize -le $maxKeySizeAnyDate) {
                "KeySize<=1024 (any date)"
            } else {
                "KeySize<=2048 & NotAfter>=2030"
            }

            [PSCustomObject]@{
                Source        = "Local Store"
                StorePath     = $_.PSParentPath -replace '^.*::', ''
                Subject       = $_.Subject
                Thumbprint    = $_.Thumbprint
                KeySize       = $keySize
                NotAfter      = $_.NotAfter
                HasPrivateKey = $_.HasPrivateKey
                MatchedRule   = $matched
            }
        }
}

# --- 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 (Test-WeakRsaCert -Cert $cert) {
                $keySize = $cert.PublicKey.Key.KeySize
                $matched = if ($keySize -le $maxKeySizeAnyDate) {
                    "KeySize<=1024 (any date)"
                } else {
                    "KeySize<=2048 & NotAfter>=2030"
                }

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

# --- Вывод результатов ---
if ($weakCerts) {
    Write-Host "`nНайдены сертификаты, удовлетворяющие условиям:" -ForegroundColor Yellow
    Write-Host "  1) RSA KeySize <= 2048 и NotAfter >= 2030-01-01"
    Write-Host "  2) RSA KeySize <= 1024 (любая дата истечения)"
    Write-Host ""

    $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

    # Дополнительная разбивка по правилам
    Write-Host "`nСводка по правилам:" -ForegroundColor Cyan
    $weakCerts | Group-Object MatchedRule | Format-Table Name, Count -AutoSize
} else {
    Write-Host "`nСертификаты, удовлетворяющие заданным условиям, не найдены." -ForegroundColor Green
}