Sample code for 30+ languages & platforms
PureBasic

SSH Authentication using an SSH Certificate

See more SSH Examples

Demonstrates how to authenticate using an SSH certificate.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkSshKey.pb"
IncludeFile "CkStringBuilder.pb"
IncludeFile "CkSsh.pb"

Procedure ChilkatExample()

    success.i = 0

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

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

    success = CkStringBuilder::ckLoadFile(sbSshCert,"qa_data/sshCert/user_ecdsa_key-cert.pub","utf-8")
    If success = 0
        Debug "Failed to load user_ecdsa_key-cert.pub"
        CkStringBuilder::ckDispose(sbSshCert)
        ProcedureReturn
    EndIf

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

    success = CkStringBuilder::ckLoadFile(sbPrivKey,"qa_data/sshKeys/user_ecdsa_key","utf-8")
    If success = 0
        Debug "Failed to load user_ecdsa_key"
        CkStringBuilder::ckDispose(sbSshCert)
        CkStringBuilder::ckDispose(sbPrivKey)
        ProcedureReturn
    EndIf

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

    ; Provide the password if the user_ecdsa_key is stored in an encrypted format.
    CkSshKey::setCkPassword(key, "secret")
    success = CkSshKey::ckFromOpenSshPrivateKey(key,CkStringBuilder::ckGetAsString(sbPrivKey))
    If success = 0
        Debug CkSshKey::ckLastErrorText(key)
        CkStringBuilder::ckDispose(sbSshCert)
        CkStringBuilder::ckDispose(sbPrivKey)
        CkSshKey::ckDispose(key)
        ProcedureReturn
    EndIf

    ; Indicate that the SSH certificate is to be used for authentication.
    ; The UseSshCertificate method was added in Chilkat v11.0.0
    CkSshKey::ckUseSshCertificate(key,CkStringBuilder::ckGetAsString(sbSshCert))

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

    hostname.s = "ssh.example.com"
    port.i = 22
    success = CkSsh::ckConnect(ssh,hostname,port)
    If success <> 1
        Debug CkSsh::ckLastErrorText(ssh)
        CkStringBuilder::ckDispose(sbSshCert)
        CkStringBuilder::ckDispose(sbPrivKey)
        CkSshKey::ckDispose(key)
        CkSsh::ckDispose(ssh)
        ProcedureReturn
    EndIf

    success = CkSsh::ckAuthenticatePk(ssh,"myLogin",key)
    If success <> 1
        Debug CkSsh::ckLastErrorText(ssh)
        CkStringBuilder::ckDispose(sbSshCert)
        CkStringBuilder::ckDispose(sbPrivKey)
        CkSshKey::ckDispose(key)
        CkSsh::ckDispose(ssh)
        ProcedureReturn
    EndIf

    Debug "Public-Key Authentication using an SSH Certificate was Successful!"


    CkStringBuilder::ckDispose(sbSshCert)
    CkStringBuilder::ckDispose(sbPrivKey)
    CkSshKey::ckDispose(key)
    CkSsh::ckDispose(ssh)


    ProcedureReturn
EndProcedure