Sample code for 30+ languages & platforms
Perl Requires Chilkat v9.5.0.91+

PKCS11 Find Certificate with Key Usage on Smart Card or USB Token

See more PKCS11 Examples

Demonstrates how to find and return the 1st certificate on a smart card or USB token with a desired intended key usage.

Chilkat Perl Downloads

Chilkat2 Perl
use strict;
use warnings;
use Chilkat2;

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

# Note: Chilkat's PKCS11 implementation runs on Windows, Linux, Mac OS X, and other supported operating systems.

my $pkcs11 = Chilkat2::Pkcs11->new;

$pkcs11->SharedLibPath('aetpkss1.dll');

my $success = $pkcs11->Initialize();
if (!$success) {
    print $pkcs11->LastErrorText, "\n";
    exit;
}

# Pass -1 for the slotID to open a session on the first non-empty slot.
my $slotID = -1;

# Open a session.
my $readWrite = 1;
$success = $pkcs11->OpenSession($slotID, $readWrite);
if (!$success) {
    print $pkcs11->LastErrorText, "\n";
    exit;
}

# Make it an authenticated session by calling Login.
#
# If we don't authenticate, then we won't be able to see the private keys, and thus
# we won't know which certificates have an associated private key stored on the smart card.

# The smart card PIN is passed to the Login method.
# userType 1 indicates a "Normal User".
my $userType = 1;
my $pin = '0000';
$success = $pkcs11->Login($userType, $pin);
if (!$success) {
    print $pkcs11->LastErrorText, "\n";
    $success = $pkcs11->CloseSession();
    exit;
}

# --------------------------------------------------------------------------

my $cert = Chilkat2::Cert->new;

# Find a certificate with an intended key usage.
# Possible key usages to find are:
#
# DigitalSignature
# NonRepudiation
# KeyEncipherment
# DataEncipherment
# CertificateSigning
# CrlSigning
#
# To find a cert having any one of several usages, pass a comma-separated list of usages:
$success = $pkcs11->FindCert('keyUsage', 'NonRepudiation,DigitalSignature', $cert);
if ($success) {
    print 'Cert with private key: ', $cert->SubjectCN, "\n";
} else {
    print "No certificates having the intended key usage were found.\n";
}

# --------------------------------------------------------------------------

# Revert to an unauthenticated session by calling Logout.
$success = $pkcs11->Logout();
if (!$success) {
    print $pkcs11->LastErrorText, "\n";
    $success = $pkcs11->CloseSession();
    exit;
}

# When finished, close the session.
# It is important to close the session (memory leaks will occur if the session is not properly closed).
$success = $pkcs11->CloseSession();
if (!$success) {
    print $pkcs11->LastErrorText, "\n";
    exit;
}

print "Success.\n";