ps/Modules/Alkami.DevOps.Certificates/Public/Export-Certificates.ps1

154 lines
4.6 KiB
PowerShell
Raw Permalink Normal View History

2023-05-30 22:51:22 -07:00
function Export-Certificates {
<#
.SYNOPSIS
Exports certificates from a machine.
.PARAMETER exportPassword
The password used to secure the certificate with
.PARAMETER exportPath
The path the certificates are exported to. If no path is defined, the current working directory is used
.PARAMETER skipRootCerts
When this flag is supplied it will skip the exporting of certificates in the 'Root' store
.PARAMETER skipPersonalCerts
When this flag is supplied it will skip the exporting of certificates in the 'My' store
.PARAMETER skipTrustedCerts
When this flag is supplied it will skip the exporting of certificates in the 'Trusted' store
.PARAMETER skipIACerts
When this flag is supplied it will skip the exporting of certificates in the 'CertificateAuthority' store
#>
[CmdletBinding()]
Param(
[parameter(Mandatory=$false)]
[string]$exportPassword,
[Parameter(Mandatory=$false)]
[string]$exportPath = $PWD,
[Parameter(Mandatory=$false)]
[switch]$skipRootCerts,
[Parameter(Mandatory=$false)]
[switch]$skipPersonalCerts,
[Parameter(Mandatory=$false)]
[switch]$skipTrustedCerts,
[Parameter(Mandatory=$false)]
[switch]$skipIACerts
)
if (!$skipPersonalCerts.IsPresent -and !$exportPassword)
{
throw "Export Password cannot be null"
}
if ($skipRootCerts.IsPresent -and $skipPersonalCerts.IsPresent -and $skipTrustedCerts.IsPresent -and $skipIACerts.IsPresent)
{
throw "All Skip Switches cannot be set"
}
if (!(Test-Path $exportPath))
{
[System.IO.Directory]::CreateDirectory($exportPath) | Out-Null
}
## Removing because of issues mocking. This shouldn't be an issue.
# Clear-Host
[System.Reflection.Assembly]::LoadWithPartialName("System.Security.Cryptography") | Out-Null
## TODO: Don't just blindly set the $ErrorActionPreference
$ErrorActionPreference = "Stop"
[Collections.Generic.List[Alkami.Ops.Common.Exceptions.CertificateExportException]]$exportErrors = @()
if (!($skipPersonalCerts.IsPresent))
{
Write-Host "Exporting Personal Certs"
$pfxExportPath = (Join-Path $exportPath "Personal")
if (!(Test-Path $pfxExportPath))
{
Write-Host "Creating directory at $pfxExportPath"
[System.IO.Directory]::CreateDirectory($pfxExportPath) | Out-Null
}
$errors = Export-Cert -exportPath $pfxExportPath $exportPassword -storeName ([System.Security.Cryptography.X509Certificates.StoreName]::My)
$exportErrors.AddRange($errors)
}
if (!($skipIACerts.IsPresent))
{
Write-Host "Exporting IA Certs"
$iaExportPath = (Join-Path $exportPath "IA")
if (!(Test-Path $iaExportPath))
{
[System.IO.Directory]::CreateDirectory($iaExportPath) | Out-Null
}
$errors = Export-Cert -exportPath $iaExportPath -storeName ([System.Security.Cryptography.X509Certificates.StoreName]::CertificateAuthority)
$exportErrors.AddRange($errors)
}
if (!($skipRootCerts.IsPresent))
{
Write-Host "Exporting Root Certs"
$rootExportPath = (Join-Path $exportPath "Root")
if (!(Test-Path $rootExportPath))
{
[System.IO.Directory]::CreateDirectory($rootExportPath) | Out-Null
}
$errors = Export-Cert -exportPath $rootExportPath -storeName ([System.Security.Cryptography.X509Certificates.StoreName]::Root)
$exportErrors.AddRange($errors)
}
if (!($skipTrustedCerts.IsPresent))
{
Write-Host "Exporting Trusted Certs"
$trustedPeopleExportPath = (Join-Path $exportPath "TrustedPeople")
if (!(Test-Path $trustedPeopleExportPath))
{
[System.IO.Directory]::CreateDirectory($trustedPeopleExportPath) | Out-Null
}
$errors = Export-Cert -exportPath $trustedPeopleExportPath -storeName ([System.Security.Cryptography.X509Certificates.StoreName]::TrustedPeople)
$exportErrors.AddRange($errors)
}
foreach ($exportError in $exportErrors)
{
[Alkami.Ops.Common.Exceptions.CertificateExportException]$strongError = $exportError
Write-Warning ("{0}" -f $strongError.Message)
Write-Warning ("`tError: {0}" -f $strongError.BaseExceptionMessage.TrimEnd())
Write-Warning ("`tName: {0}" -f $strongError.CertificateName)
Write-Warning ("`tThumbprint: {0}" -f $strongError.CertificateThumbPrint)
Write-Warning ("`tSubject: {0}" -f $strongError.Subject.Trim())
Write-Output `n
}
}