Sample code for 30+ languages & platforms
PureBasic

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 PureBasic Downloads

PureBasic
IncludeFile "CkCertStore.pb"
IncludeFile "CkZip.pb"
IncludeFile "CkBinData.pb"
IncludeFile "CkCert.pb"
IncludeFile "CkStringBuilder.pb"

Procedure ChilkatExample()

    success.i = 0

    certStore.i = CkCertStore::ckCreate()
    If certStore.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    readOnly.i = 1
    success = CkCertStore::ckOpenCurrentUserStore(certStore,readOnly)
    If Not success
        Debug CkCertStore::ckLastErrorText(certStore)
        CkCertStore::ckDispose(certStore)
        ProcedureReturn
    EndIf

    pfxPassword.s = "secret"

    allSuccess.i = 1
    numSuccess.i = 0

    zip.i = CkZip::ckCreate()
    If zip.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkZip::ckNewZip(zip,"qa_output/personalCerts.zip")

    certData.i = CkBinData::ckCreate()
    If certData.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    sbFilename.i = CkStringBuilder::ckCreate()
    If sbFilename.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; Iterate over the certificates in the Current User store.
    cert.i = CkCert::ckCreate()
    If cert.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    numCerts.i = CkCertStore::ckNumCertificates(certStore)
    i.i = 0
    While i < numCerts
        CkCertStore::ckGetCert(certStore,i,cert)
        Debug "DN = " + CkCert::ckSubjectDN(cert)

        CkStringBuilder::ckSetString(sbFilename,"cert")
        CkStringBuilder::ckAppendInt(sbFilename,i + 1)

        bHasPrivateKey.i = CkCert::ckHasPrivateKey(cert)
        If (bHasPrivateKey = 1) AND (CkCert::ckPrivateKeyExportable(cert) = 1)
            ; Export to a .pfx
            success = CkCert::ckExportToPfxBd(cert,pfxPassword,1,certData)
            If success = 1
                CkStringBuilder::ckAppend(sbFilename,".pfx")
                CkZip::ckAddBd(zip,CkStringBuilder::ckGetAsString(sbFilename),certData)
            EndIf

        Else
            ; Export to a .cer
            success = CkCert::ckExportCertDerBd(cert,certData)
            If success = 1
                CkStringBuilder::ckAppend(sbFilename,".cer")
                CkZip::ckAddBd(zip,CkStringBuilder::ckGetAsString(sbFilename),certData)
            EndIf

        EndIf

        If success <> 1
            allSuccess = 0
        Else
            numSuccess = numSuccess + 1
        EndIf

        i = i + 1
    Wend

    If numSuccess > 0
        success = CkZip::ckWriteZipAndClose(zip)
        If success <> 1
            Debug CkZip::ckLastErrorText(zip)
            allSuccess = 0
        EndIf

    EndIf

    Debug "All success = " + Str(allSuccess)


    CkCertStore::ckDispose(certStore)
    CkZip::ckDispose(zip)
    CkBinData::ckDispose(certData)
    CkStringBuilder::ckDispose(sbFilename)
    CkCert::ckDispose(cert)


    ProcedureReturn
EndProcedure