Dargslan.WinPKI.psm1

function Get-PKIAudit {
    <#
    .SYNOPSIS
        Audit PKI certificate authority and issued certificates
    .DESCRIPTION
        Windows PKI and certificate authority audit toolkit — CA configuration, templates, issued certs, CRL, OCSP, and PKI health
        Part of the Dargslan Windows Admin Toolkit — https://dargslan.com
    .PARAMETER Json
        Output results as JSON
    .EXAMPLE
        Get-PKIAudit
    .EXAMPLE
        Get-PKIAudit -Json
    .LINK
        https://dargslan.com
    .LINK
        https://www.powershellgallery.com/profiles/Dargslan
    #>

    [CmdletBinding()]
    param([switch]$Json)

    $report = [ordered]@{
        CAConfig = certutil -CAInfo 2>$null | Where-Object { $_ -match "\S" } | Select-Object -First 20 | ForEach-Object { $_.Trim() }
        Templates = certutil -catemplates 2>$null | Where-Object { $_ -match "\S" } | Select-Object -First 30 | ForEach-Object { $_.Trim() }
        CRL = certutil -URL "ldap:" 2>$null | Where-Object { $_ -match "\S" } | Select-Object -First 10
        LocalCerts = Get-ChildItem Cert:\LocalMachine\My -ErrorAction SilentlyContinue | Select-Object Subject, Issuer, NotAfter, Thumbprint, HasPrivateKey | Select-Object -First 30
        ExpiringCerts = Get-ChildItem Cert:\LocalMachine\My -ErrorAction SilentlyContinue | Where-Object { $_.NotAfter -lt (Get-Date).AddDays(30) } | Select-Object Subject, NotAfter
        RootCAs = Get-ChildItem Cert:\LocalMachine\Root -ErrorAction SilentlyContinue | Measure-Object | Select-Object Count
        Warnings = @()
    }
    $report.ExpiringCerts | ForEach-Object { $report.Warnings += "Certificate expiring soon: $($_.Subject) on $($_.NotAfter)" }
    $report.Summary = [PSCustomObject]@{ LocalCertCount = ($report.LocalCerts | Measure-Object).Count; ExpiringCount = ($report.ExpiringCerts | Measure-Object).Count; RootCACount = $report.RootCAs.Count }
    if ($Json) { return $report | ConvertTo-Json -Depth 3 }
    Write-Host "`n [PKI Audit - 2026]" -ForegroundColor Cyan
    $report.Summary | Format-List
    if ($report.LocalCerts) { $report.LocalCerts | Format-Table Subject, NotAfter, HasPrivateKey -AutoSize }
    if ($report.Warnings) { $report.Warnings | ForEach-Object { Write-Host " Warning: $_" -ForegroundColor Yellow } }
    return $report
}

Export-ModuleMember -Function Get-PKIAudit