Sample code for 30+ languages & platforms
PureBasic

SFTP use Cert's Private Key from PFX (.pfx/.p12)

See more SFTP Examples

Demonstrates how to use the private key associated with a certificate from a .pfx/.p12 file.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkSshKey.pb"
IncludeFile "CkCert.pb"
IncludeFile "CkPrivateKey.pb"
IncludeFile "CkSFtp.pb"

Procedure ChilkatExample()

    success.i = 0

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

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

    pfxFilepath.s = "qa_data/pfx/my.pfx"
    pfxPassword.s = "secret"

    ; A PFX typically contains certificates in the chain of authentication.
    ; The Chilkat cert object will choose the certificate w/
    ; private key farthest from the root authority cert.
    ; To access all the certificates in a PFX, use the 
    ; Chilkat certificate store object instead.
    success = CkCert::ckLoadPfxFile(cert,pfxFilepath,pfxPassword)
    If success = 0
        Debug CkCert::ckLastErrorText(cert)
        CkCert::ckDispose(cert)
        ProcedureReturn
    EndIf

    ; Get the private key.  
    privKey.i = CkPrivateKey::ckCreate()
    If privKey.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkCert::ckGetPrivateKey(cert,privKey)
    If success = 0
        Debug CkCert::ckLastErrorText(cert)
        CkCert::ckDispose(cert)
        CkPrivateKey::ckDispose(privKey)
        ProcedureReturn
    EndIf

    privKeyPem.s = CkPrivateKey::ckGetPkcs8Pem(privKey)
    If CkPrivateKey::ckLastMethodSuccess(privKey) = 0
        Debug CkPrivateKey::ckLastErrorText(privKey)
        CkCert::ckDispose(cert)
        CkPrivateKey::ckDispose(privKey)
        ProcedureReturn
    EndIf

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

    success = CkSshKey::ckFromOpenSshPrivateKey(sshKey,privKeyPem)
    If success = 0
        Debug CkSshKey::ckLastErrorText(sshKey)
        CkCert::ckDispose(cert)
        CkPrivateKey::ckDispose(privKey)
        CkSshKey::ckDispose(sshKey)
        ProcedureReturn
    EndIf

    ; Connect to an SSH/SFTP server
    sftp.i = CkSFtp::ckCreate()
    If sftp.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkSFtp::ckConnect(sftp,"sftp.example.com",22)
    If success = 0
        Debug CkSFtp::ckLastErrorText(sftp)
        CkCert::ckDispose(cert)
        CkPrivateKey::ckDispose(privKey)
        CkSshKey::ckDispose(sshKey)
        CkSFtp::ckDispose(sftp)
        ProcedureReturn
    EndIf

    ; Authenticate with the SSH server using a username + private key.
    ; (The private key serves as the password.  The username identifies
    ; the SSH user account on the server.)
    success = CkSFtp::ckAuthenticatePk(sftp,"mySshLogin",sshKey)
    If success = 0
        Debug CkSFtp::ckLastErrorText(sftp)
        CkCert::ckDispose(cert)
        CkPrivateKey::ckDispose(privKey)
        CkSshKey::ckDispose(sshKey)
        CkSFtp::ckDispose(sftp)
        ProcedureReturn
    EndIf

    Debug "OK, the connection and authentication with the SSH server is completed."

    ; This example is only to show the connection + authentication using a private key associated with a certificate in the Windows certificate store...


    CkCert::ckDispose(cert)
    CkPrivateKey::ckDispose(privKey)
    CkSshKey::ckDispose(sshKey)
    CkSFtp::ckDispose(sftp)


    ProcedureReturn
EndProcedure