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