Perl Requires Chilkat v9.5.0.87+
Chilkat2 Perl
ScMinidriver - Import a Certificate and Private Key to a Smart Card or USB Token
See more ScMinidriver Examples
Demonstrates how to import a certificate and its private key to a key container on a smart card or USB token.Note: The ScMinidriver functionality is for Windows-only because ScMinidriver DLLs only exist on Windows.
Chilkat Perl Downloads
use strict;
use warnings;
use Chilkat2;
# This example requires the Chilkat API to have been previously unlocked.
# See Global Unlock Sample for sample code.
my $scmd = Chilkat2::ScMinidriver->new;
# Reader names (smart card readers or USB tokens) can be discovered
# via List Readers or Find Smart Cards
my $readerName = 'SCM Microsystems Inc. SCR33x USB Smart Card Reader 0';
my $success = $scmd->AcquireContext($readerName);
if (!$success) {
print $scmd->LastErrorText, "\n";
exit;
}
# If successful, the name of the currently inserted smart card is available:
print 'Card name: ', $scmd->CardName, "\n";
# To import a cert + private key, we'll need to be PIN authenticated.
# For more details about smart card PIN authentication, see the Smart Card PIN Authentication Example
my $pinId = 'user';
my $retval = $scmd->PinAuthenticate($pinId, '000000');
if ($retval != 0) {
print "PIN Authentication failed.\n";
$scmd->DeleteContext();
exit;
}
my $cert = Chilkat2::Cert->new;
# Load the cert + private key from a .p12/.pfx
# We got this .p12 from https://badssl.com/download/
my $password = 'badssl.com';
$success = $cert->LoadPfxFile('qa_data/pfx/badssl.com-client.p12', $password);
if (!$success) {
print $cert->LastErrorText, "\n";
$scmd->DeleteContext();
exit;
}
# Let's import this certificate as the "signature" key/cert in key container #6.
my $containerIndex = 6;
my $keySpec = 'sig';
$success = $scmd->ImportCert($cert, $containerIndex, $keySpec, $pinId);
if (!$success) {
print $scmd->LastErrorText, "\n";
} else {
print "Successfully imported the cert + private key onto the smart card.\n";
}
# When finished with operations that required authentication, you may if you wish, deauthenticate the session.
$success = $scmd->PinDeauthenticate('user');
if (!$success) {
print $scmd->LastErrorText, "\n";
}
# Delete the context when finished with the card.
$success = $scmd->DeleteContext();
if (!$success) {
print $scmd->LastErrorText, "\n";
}