modules/HomeLab.Security/Public/Get-VpnCertificate.ps1
<#
.SYNOPSIS Retrieves VPN certificates from the certificate store. .DESCRIPTION Gets VPN certificates from the CurrentUser certificate store, with optional filtering. .PARAMETER CertificatePattern Optional pattern to filter certificates by name. .PARAMETER RootCertificatesOnly If specified, returns only root certificates. .PARAMETER ClientCertificatesOnly If specified, returns only client certificates. .EXAMPLE Get-VpnCertificate -RootCertificatesOnly .EXAMPLE Get-VpnCertificate -CertificatePattern "MyVPN*" .OUTPUTS Hashtable containing success status and certificates. .NOTES Author: Jurie Smit Date: March 6, 2025 #> function Get-VpnCertificate { [CmdletBinding()] param( [Parameter(Mandatory = $false)] [string]$CertificatePattern, [Parameter(Mandatory = $false)] [switch]$RootCertificatesOnly, [Parameter(Mandatory = $false)] [switch]$ClientCertificatesOnly ) Write-LogSafely -Message "Retrieving VPN certificates from certificate store" -Level INFO # Check for conflicting parameters if ($RootCertificatesOnly -and $ClientCertificatesOnly) { Write-LogSafely -Message "Both RootCertificatesOnly and ClientCertificatesOnly specified. These options are mutually exclusive." -Level WARNING return @{ Success = $false Message = "Conflicting parameters: Cannot specify both RootCertificatesOnly and ClientCertificatesOnly." Certificates = @() } } try { $certificates = Get-ChildItem -Path Cert:\CurrentUser\My -ErrorAction Stop # Filter by pattern if provided if ($CertificatePattern) { $certificates = $certificates | Where-Object { $_.Subject -like "*$CertificatePattern*" } } # Filter by certificate type if requested if ($RootCertificatesOnly) { $certificates = $certificates | Where-Object { $_.HasPrivateKey -and $_.Subject -like "*vpn-root*" } } if ($ClientCertificatesOnly) { $certificates = $certificates | Where-Object { $_.HasPrivateKey -and $_.Subject -notlike "*vpn-root*" } } Write-LogSafely -Message "Retrieved $($certificates.Count) certificates matching criteria" -Level INFO return @{ Success = $true Message = "Retrieved $($certificates.Count) certificates." Certificates = $certificates } } catch { Write-LogSafely -Message "Error retrieving VPN certificates: $_" -Level ERROR return @{ Success = $false Message = "Failed to retrieve certificates: $_" Error = $_ Certificates = @() } } } |