Sample code for 30+ languages & platforms
PureBasic

Load Particular CA Certs into a Java KeyStore

See more Java KeyStore (JKS) Examples

Opens a PEM file containing many CA root certificates, and creates a Java keystore containing a subset of the certificates.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkTrustedRoots.pb"
IncludeFile "CkCert.pb"
IncludeFile "CkStringBuilder.pb"
IncludeFile "CkJavaKeyStore.pb"

Procedure ChilkatExample()

    success.i = 0

    ; This requires the Chilkat API to have been previously unlocked.
    ; See Global Unlock Sample for sample code.

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

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

    ; Load certificates from a file.
    success = CkTrustedRoots::ckLoadCaCertsPem(troots,"qa_data/curl_cacert.pem")
    If success <> 1
        Debug CkTrustedRoots::ckLastErrorText(troots)
        CkJavaKeyStore::ckDispose(jks)
        CkTrustedRoots::ckDispose(troots)
        ProcedureReturn
    EndIf

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

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

    caseSensitive.i = 0

    i.i = 0
    numCerts.i = CkTrustedRoots::ckNumCerts(troots)
    numAdded.i = 0
    While (i < numCerts)
        cacert.i = CkTrustedRoots::ckGetCert(troots,i)
        CkStringBuilder::ckClear(sbDn)
        CkStringBuilder::ckAppend(sbDn,CkCert::ckSubjectDN(cacert))
        If CkStringBuilder::ckContains(sbDn,"Entrust.net",caseSensitive) = 1
            Debug CkCert::ckSubjectDN(cacert)

            ; The alias is an arbitrary unique string for each cert in the JKS.
            CkStringBuilder::ckClear(sbAlias)
            CkStringBuilder::ckAppend(sbAlias,"cacert_")
            CkStringBuilder::ckAppendInt(sbAlias,i + 1)
            CkJavaKeyStore::ckAddTrustedCert(jks,cacert,CkStringBuilder::ckGetAsString(sbAlias))
            numAdded = numAdded + 1
        EndIf

        CkCert::ckDispose(cacert)

        i = i + 1
    Wend

    ; Verify the number of certs in the JKS equals the number we added.
    numJksCerts.i = CkJavaKeyStore::ckNumTrustedCerts(jks)
    Debug "NumTrustedCerts = " + Str(numJksCerts)
    If numJksCerts <> numAdded
        Debug "Something is amiss!"
        CkJavaKeyStore::ckDispose(jks)
        CkTrustedRoots::ckDispose(troots)
        CkStringBuilder::ckDispose(sbDn)
        CkStringBuilder::ckDispose(sbAlias)
        ProcedureReturn
    EndIf

    ; Save the JKS.
    success = CkJavaKeyStore::ckToFile(jks,"myPassword","qa_data/jks/entrust_caCerts.jks")
    If success <> 1
        Debug CkJavaKeyStore::ckLastErrorText(jks)
        CkJavaKeyStore::ckDispose(jks)
        CkTrustedRoots::ckDispose(troots)
        CkStringBuilder::ckDispose(sbDn)
        CkStringBuilder::ckDispose(sbAlias)
        ProcedureReturn
    EndIf

    Debug "Success."

    ; The output of this program when tested was:

    ; C=US, O=Entrust.net, OU=www.entrust.net/CPS incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Secure Server Certification Authority
    ; O=Entrust.net, OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Certification Authority (2048)
    ; C=US, O="Entrust, Inc.", OU=www.entrust.net/CPS is incorporated by reference, OU="(c) 2006 Entrust, Inc.", CN=Entrust Root Certification Authority
    ; NumTrustedCerts = 3
    ; Success.


    CkJavaKeyStore::ckDispose(jks)
    CkTrustedRoots::ckDispose(troots)
    CkStringBuilder::ckDispose(sbDn)
    CkStringBuilder::ckDispose(sbAlias)


    ProcedureReturn
EndProcedure