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