Sample code for 30+ languages & platforms
PowerShell

Backup Windows Current User / Personal Certificates to a .zip

See more Certificates Examples

Demonstrates how to backup the certificates in the Windows registry-based Current User certificate store (in the "Personal" Logical Store as seen in certmgr.msc), to a zip archive. Certificates having an exportable private key are exported to .pfx files. Certificates with no private key, or with a non-exportable private key, are exported to .cer files.

Obviously, this example only runs on Windows computers.

Chilkat PowerShell Downloads

PowerShell
Add-Type -Path "C:\chilkat\ChilkatDotNet47-x64\ChilkatDotNet47.dll"

$success = $false

$certStore = New-Object Chilkat.CertStore

$readOnly = $true
$success = $certStore.OpenCurrentUserStore($readOnly)
if (!$success) {
    $($certStore.LastErrorText)
    exit
}

$pfxPassword = "secret"

$allSuccess = $true
$numSuccess = 0

$zip = New-Object Chilkat.Zip
$zip.NewZip("qa_output/personalCerts.zip")

$certData = New-Object Chilkat.BinData
$sbFilename = New-Object Chilkat.StringBuilder

# Iterate over the certificates in the Current User store.
$cert = New-Object Chilkat.Cert
$numCerts = $certStore.NumCertificates
$i = 0
while ($i -lt $numCerts) {
    $certStore.GetCert($i,$cert)
    $("DN = " + $cert.SubjectDN)

    $sbFilename.SetString("cert")
    $sbFilename.AppendInt($i + 1)

    $bHasPrivateKey = $cert.HasPrivateKey()
    if (($bHasPrivateKey -eq $true) -and ($cert.PrivateKeyExportable -eq $true)) {
        # Export to a .pfx
        $success = $cert.ExportToPfxBd($pfxPassword,$true,$certData)
        if ($success -eq $true) {
            $sbFilename.Append(".pfx")
            $zip.AddBd($sbFilename.GetAsString(),$certData)
        }

    }
    else {
        # Export to a .cer
        $success = $cert.ExportCertDerBd($certData)
        if ($success -eq $true) {
            $sbFilename.Append(".cer")
            $zip.AddBd($sbFilename.GetAsString(),$certData)
        }

    }

    if ($success -ne $true) {
        $allSuccess = $false
    }
    else {
        $numSuccess = $numSuccess + 1
    }

    $i = $i + 1
}

if ($numSuccess -gt 0) {
    $success = $zip.WriteZipAndClose()
    if ($success -ne $true) {
        $($zip.LastErrorText)
        $allSuccess = $false
    }

}

$("All success = " + $allSuccess)