Загрузка данных
<#
.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
}