Effectuer une analyse et une remédiation complètes de l'infrastructure PKI pour les défaillances cryptographiques complexes affectant plusieurs systèmes ou services.
- Analyser la connectivité de la liste de révocation de certificats (CRL) et du protocole de statut de certificat en ligne (OCSP) :
# Tester les points de terminaison CRL et OCSP
$certs = Get-ChildItem Cert:\LocalMachine\My
foreach ($cert in $certs) {
$extensions = $cert.Extensions | Where-Object {$_.Oid.FriendlyName -eq "CRL Distribution Points"}
if ($extensions) {
Write-Host "Certificat : $($cert.Subject)"
Write-Host "URLs CRL : $($extensions.Format($false))"
# Tester l'accessibilité CRL
$crlUrls = $extensions.Format($false) -split "`n" | Where-Object {$_ -match "http"}
foreach ($url in $crlUrls) {
try {
$response = Invoke-WebRequest -Uri $url.Trim() -TimeoutSec 10
Write-Host " CRL accessible : $($url.Trim()) - Statut : $($response.StatusCode)"
} catch {
Write-Host " CRL inaccessible : $($url.Trim()) - Erreur : $($_.Exception.Message)"
}
}
}
}
Vérifier la santé des certificats des contrôleurs de domaine dans les environnements Active Directory :# Vérifier les certificats des contrôleurs de domaine
Get-ADDomainController -Filter * | ForEach-Object {
$dcName = $_.Name
Write-Host "Vérification du DC : $dcName"
try {
$cert = Invoke-Command -ComputerName $dcName -ScriptBlock {
Get-ChildItem Cert:\LocalMachine\My | Where-Object {
$_.Subject -like "*$env:COMPUTERNAME*" -and $_.HasPrivateKey
}
}
if ($cert.NotAfter -lt (Get-Date).AddDays(30)) {
Write-Host " ATTENTION : Le certificat expire bientôt sur $dcName"
}
} catch {
Write-Host " ERREUR : Impossible de vérifier le certificat sur $dcName"
}
}
Valider la synchronisation temporelle à travers l'infrastructure :# Vérifier la synchronisation temporelle (critique pour la validation des certificats)
w32tm /query /status
w32tm /query /peers
# Comparer l'heure locale avec le contrôleur de domaine
$dcTime = Invoke-Command -ComputerName (Get-ADDomainController).Name -ScriptBlock {Get-Date}
$localTime = Get-Date
$timeDiff = ($localTime - $dcTime).TotalSeconds
if ([Math]::Abs($timeDiff) -gt 300) {
Write-Host "ATTENTION : Différence de temps avec le DC de $timeDiff secondes (seuil : 300s)"
Write-Host "Exécuter : w32tm /resync /force"
}
Reconstruire la chaîne de certificats et les relations de confiance :# Vider le cache des certificats et reconstruire les chaînes
CertLM.msc
# Ou via la ligne de commande :
certutil -pulse
certutil -generateSSTFromWU roots.sst
certutil -addstore -f root roots.sst
Vérifier les paramètres de stratégie de groupe affectant les opérations cryptographiques :# Vérifier les paramètres de stratégie de groupe pertinents
Get-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL\00010002" -ErrorAction SilentlyContinue
Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Cryptography\Configuration\Local\SSL\00010002" -ErrorAction SilentlyContinue
Générer un rapport complet sur la santé cryptographique :# Créer un rapport détaillé de l'infrastructure cryptographique
$report = @{}
$report.Timestamp = Get-Date
$report.ComputerName = $env:COMPUTERNAME
$report.Certificates = Get-ChildItem Cert:\LocalMachine\My | Select-Object Subject, NotAfter, HasPrivateKey, Thumbprint
$report.ExpiredCerts = Get-ChildItem Cert:\LocalMachine\My | Where-Object {$_.NotAfter -lt (Get-Date)}
$report.CryptoServices = Get-Service -Name "CryptSvc","BITS","EventLog" | Select-Object Name, Status
$report.RecentCryptoEvents = Get-WinEvent -FilterHashtable @{LogName='Security'; Id=5061; StartTime=(Get-Date).AddDays(-7)} -ErrorAction SilentlyContinue
$report | ConvertTo-Json -Depth 3 | Out-File "C:\temp\CryptoHealthReport_$(Get-Date -Format 'yyyyMMdd_HHmmss').json"
Conseil pro : Dans les environnements d'entreprise, envisagez de mettre en œuvre une gestion automatisée du cycle de vie des certificats et une surveillance pour prévenir les occurrences de l'ID d'événement 5061.