PKCS11-TOOL(1)
okay bestie, welcome to pkcs11-tool(1) from OpenSC Tools. She's literally the utility for managing and using PKCS #11 security tokens, and she's about to spill every single flag. No cap, we're keeping all the details. ๐
โจ NAME โจ
pkcs11-tool โ utility for managing and using PKCS #11 security tokens. That's the name, that's the whole vibe, periodt. ๐
๐ธ SYNOPSIS ๐ธ
pkcs11-tool [OPTIONS]
She takes options. That's it. Simple. Elegant. Ate. โจ
๐ DESCRIPTION ๐
The pkcs11-tool utility is used to manage the data objects on smart cards and similar PKCS #11 security tokens. Users can list and read PINs, keys and certificates stored on the token. User PIN authentication is performed for those operations that require it.
So yes bestie, she's your token bestie: list stuff, read stuff, and do the PIN auth when the operation needs it. Slay. ๐
๐ OPTIONS ๐
--attr-from filenameโ Extract information fromfilename(DER-encoded certificate file) and create the corresponding attributes when writing an object to the token. Example: the certificate subject name is used to create theCKA_SUBJECTattribute. ๐--change-pin, -cโ Change the user PIN on the token. ๐--unlock-pinโ Unlock User PIN (without--loginunlock in logged in session; otherwise--login-typehas to be'context-specific'). ๐--hash, -hโ Hash some data. ๐ธ--hash-algorithm mechanismโ Specify hash algorithm used with RSA-PKCS-PSS signature or RSA-OAEP decryption. Allowed values are"SHA-1","SHA256","SHA384","SHA512", and some tokens may also allow"SHA224". Default is"SHA-1".- Note that the input to RSA-PKCS-PSS has to be of the size equal to the specified hash algorithm. E.g., for SHA256 the signature input must be exactly 32 bytes long (for mechanisms SHA256-RSA-PKCS-PSS there is no such restriction). For RSA-OAEP, the plaintext input size mLen must be at most keyLen - 2 - 2*hashLen. For example, for RSA 3072-bit key and SHA384, the longest plaintext to encrypt with RSA-OAEP is (with all sizes in bytes): 384 - 2 - 2*48 = 286, aka 286 bytes. ๐ญ
--id id, -d idโ Specify the id of the object to operate on. ๐--init-pinโ Initializes the user PIN. This option differs from--change-pinin that it sets the user PIN for the first time. Once set, the user PIN can be changed using--change-pin. โจ--init-tokenโ Initialize a token: set the token label as well as a Security Officer PIN (the label must be specified using--label). ๐--input-file filename, -i filenameโ Specify the path to a file for input. ๐--keypairgen, -kโ Generate a new key pair (public and private pair.) ๐๐--keygenโ Generate a new key. ๐๏ธ--key-type specificationโ Specify the type and (not always compulsory) flavour (byte-wise symmetric key length, bit-wise asymmetric key length, elliptic curve identifier, etc.) of the key to create, for exampleRSA:2048,EC:prime256v1,EC:ED25519,EC:X448,GOSTR3410-2012-256:B,DES:8,DES3:24,AES:16,AES:,CHACHA20,POLY1305orGENERIC:64. If the key type was incompletely specified, possible values are listed. ๐ฅ--usage-signโ Specify'sign'key usage flag (sets SIGN in privkey, sets VERIFY in pubkey). โ๏ธ--usage-decryptโ Specify'decrypt'key usage flag.- For RSA keys, sets DECRYPT in privkey and ENCRYPT in pubkey. For secret keys, sets both DECRYPT and ENCRYPT. ๐
--usage-deriveโ Specify'derive'key usage flag (EC only). ๐ฑ--usage-wrapโ Specify'wrap'key usage flag. ๐--usage-encapsulateโ Specify'encapsulate'key usage flag (sets DECAPSULATE in privkey, sets ENCAPSULATE in pubkey). ๐ฆ--label name, -a nameโ Specify the name of the object to operate on (or the token label when--init-tokenis used). ๐ท๏ธ--list-mechanisms, -Mโ Display a list of mechanisms supported by the token. โ๏ธ--list-objects, -Oโ Display a list of objects.- The options
--keytype,--label,--idor--application-idcan be used to filter the listed objects. ๐
- The options
--list-slots, -Lโ Display a list of available slots on the token. ๐ฐ--list-token-slots, -Tโ List slots with tokens. ๐ช--list-interfacesโ List interfaces of PKCS #11 3.0 library. ๐--session-rw,โ Forces to open the PKCS#11 session withCKF_RW_SESSION. โ๏ธ--login, -lโ Authenticate to the token before performing other operations. This option is not needed if a PIN is provided on the command line. ๐--login-typeโ Specify login type ('so','user','context-specific'; default:'user'). ๐ค--mechanism mechanism, -m mechanismโ Use the specified mechanism for token operations. See-Mfor a list of mechanisms supported by your token. The mechanism can also be specified in hexadecimal, e.g.,0x80001234. ๐ง--mgf functionโ Use the specified Message Generation Function (MGF) function for RSA-PKCS-PSS signatures or RSA-OAEP decryptions. Supported arguments areMGF1-SHA1toMGF1-SHA512if supported by the driver. The default is based on the hash selection. ๐--module modโ Specify a PKCS#11 module (or library) to load. ๐ฆ--moz-cert filename, -z filenameโ Test a Mozilla-like key pair generation and certificate request. Specify thefilenameto the certificate file. ๐ฆ--output-file filename, -o filenameโ Specify the path to a file for output. ๐ค--pin pin, -p pinโ Use the given pin for token operations. If set toenv:VARIABLE, the value of the environment variableVARIABLEis used. WARNING: Be careful using this option as other users may be able to read the command line from the system or if it is embedded in a script. If set toenv:VARIABLE, the value of the environment variableVARIABLEis used.- This option will also set the
--loginoption. ๐ซฃ
- This option will also set the
--public-key-infoโ Read public key from the module using"CKA_PUBLIC_KEY_INFO"(use with--read-object --type public). The output is a"SubjectPublicKeyInfo"i.e. as used in certificates and openssl. ๐--puk pukโ Supply User PUK on the command line. ๐ข--new-pin pinโ Supply new User PIN on the command line. โจ--sensitiveโ Set theCKA_SENSITIVEattribute (object cannot be revealed in plaintext). ๐--extractableโ Set theCKA_EXTRACTABLEattribute (object can be extracted). ๐ค--undestroyableโ Set theCKA_DESTROYABLEattribute to false (object cannot be destroyed). ๐ก๏ธ--set-id id, -e idโ Set theCKA_IDof the object. ๐--show-info, -Iโ Display general token information. โน๏ธ--sign, -sโ Sign some data. โ๏ธ--decrypt,โ Decrypt some data. ๐--encrypt,โ Encrypt some data. ๐--unwrap,โ Unwrap key. ๐--wrap,โ Wrap key. ๐--derive,โ Derive a secret key using another key and some data. ๐ฑ--derive-pass-der,โ Derive ECDHpass DER encoded pubkey for compatibility with some PKCS#11 implementations. ๐--salt-len bytesโ Specify how many bytes of salt should be used in RSA-PSS signatures. Accepts two special values:"-1"means salt length equals to digest length,"-2"or"-3"means use maximum permissible length. For verify operation"-2"means that the salt length is automatically recovered from signature. The value"-2"for the verify operation is supported for opensc pkcs#11 module only. Default is digest length (-1). ๐ง--slot idโ Specify the id of the slot to use (accepts HEX format with0x..prefix or decimal number). ๐ฐ--slot-description descriptionโ Specify the description of the slot to use. ๐--slot-index indexโ Specify the index of the slot to use. ๐ข--object-index indexโ Specify the index of the object to use. ๐ข--use-lockingโ Tell pkcs11 module it should use OS thread locking. ๐--test-threads optionsโ Test a pkcs11 module's thread implication. (See source code). ๐งต--token-label labelโ Specify the label of token. Will be used the first slot, that has the inserted token with this label. ๐ท๏ธ--so-pin pinโ Use the given pin as the Security Officer PIN for some token operations (token initialization, user PIN initialization, etc). If set toenv:VARIABLE, the value of the environment variableVARIABLEis used. The same warning as--pinalso applies here. ๐ฎ--test, -tโ Perform some tests on the token. This option is most useful when used with either--loginor--pin. ๐งช--test-hotplugโ Test hotplug capabilities (C_GetSlotList+C_WaitForSlotEvent). ๐--privateโ Set theCKA_PRIVATEattribute (object is only viewable after a login). ๐--always-authโ Set theCKA_ALWAYS_AUTHENTICATEattribute to a private key object. If set, the user has to supply the PIN for each use (sign or decrypt) with the key. ๐--allowed-mechanisms mechanismsโ Sets theCKA_ALLOWED_MECHANISMSattribute to a key objects when importing an object or generating a keys. The argument accepts comma-separated list of algorithmsm, that can be used with the given key. โ๏ธ--test-ecโ Test EC (best used with the--loginor--pinoption). ๐ฟ--test-forkโ Test forking and callingC_Initialize()in the child. ๐ด--type type, -y typeโ Specify the type of object to operate on. Valid value arecert,privkey,pubkey,secrkeyanddata. ๐--verbose, -vโ Cause pkcs11-tool to be more verbose.- NB! This does not affect OpenSC debugging level! To set OpenSC PKCS#11 module into debug mode, set the
OPENSC_DEBUGenvironment variable to a non-zero number. ๐ข
- NB! This does not affect OpenSC debugging level! To set OpenSC PKCS#11 module into debug mode, set the
--verify,โ Verify signature of some data. โ--read-object, -rโ Get object'sCKA_VALUEattribute (use with--type). ๐--delete-object, -bโ Delete an object. ๐๏ธ--application-label labelโ Specify the application label of the data object (use with--type data). ๐ท๏ธ--application-id idโ Specify the application ID of the data object (use with--type data). ๐--issuer dataโ Specify the issuer in hexadecimal format (use with--type cert). ๐๏ธ--subject dataโ Specify the subject in hexadecimal format (use with--type cert/privkey/pubkey). ๐--signature-file filenameโ The path to the signature file for signature verification. ๐--signature-format formatโ Format for ECDSA signature:'rs'(default),'sequence','openssl'. โ๏ธ--write-object filename, -w filenameโ Write a key or certificate object to the token.filenamepoints to the DER-encoded certificate or key file. ๐ฅ--generate-random numโ Getnumbytes of random data. ๐ฒ--allow-swโ Allow using software mechanisms that do not have theCKF_HWflag set. May be required when using software tokens and emulators. ๐ป--iv dataโ Initialization vector for symmetric ciphers. The data is hexadecimal number, i.e."000013aa7bffa0". ๐ข--mac-general-param numโ Sets the length of the MAC for the general-length MACing mechanisms tonumbytes. ๐--aaddata โ extra authenticated data for AEAD ciphers ๐ bestie, this one's a hexadecimal number, so no sneaking in anything else, okay?--tag-bits-lennum โ sets the tag length for AEAD ciphers to num bits. that's it, that's the whole job โจ--salt-filefilename โ points at the file holding the salt for HKDF. it's optional ๐ง--info-filefilename โ points at the file holding the info for HKDF. also optional ๐ซถ--urivalue โ drops the PKCS#11 URI for a module, slot, token or object. very main character of you ๐--uri-with-slot-idโ throws the SlotId into the PKCS#11 URI too ๐
โจ EXAMPLES โจ
okay this is the part where it all clicks, i promise ๐
Do a basic functionality test of the card:
pkcs11-tool --test --login
List every certificate sitting on the smart card:
pkcs11-tool --list-objects --type cert
Read the certificate with ID CERT_ID off the card in DER format, then hand it to OpenSSL so it becomes PEM:
pkcs11-tool --read-object --id $CERT_ID --type cert \
--output-file cert.der
openssl x509 -inform DER -in cert.der -outform PEM > cert.pem
Write a certificate onto the token:
pkcs11-tool --login --write-object certificate.der --type cert
Generate a brand new RSA key pair:
pkcs11-tool --login --keypairgen --key-type RSA:2048
Generate a brand new extractable RSA key pair (yes, extractable, she said what she said ๐ฅ):
pkcs11-tool --login --keypairgen --key-type RSA:2048 --extractable
Generate an elliptic curve key pair with OpenSSL and import it to the card as $ID:
openssl genpkey -out EC_private.der -outform DER \
-algorithm EC -pkeyopt ec_paramgen_curve:P-521
pkcs11-tool --write-object EC_private.der --id "$ID" \
--type privkey --label "EC private key" -p "$PIN"
openssl pkey -in EC_private.der -out EC_public.der \
-pubout -inform DER -outform DER
pkcs11-tool --write-object EC_public.der --id "$ID" \
--type pubkey --label "EC public key" -p $PIN
List the private keys:
pkcs11-tool --login --list-objects --type privkey
Sign some data stored in file data using the private key with ID ID, with the RSA-PKCS mechanism:
pkcs11-tool --sign --id $ID --mechanism RSA-PKCS \
--input-file data --output-file data.sig
Same energy, but you pipe the data in from stdin instead of naming an input file:
dd if=data bs=128 count=1 \
| pkcs11-tool --sign --id $ID --mechanism RSA-PKCS \
> data.sig
Verify the signed data:
pkcs11-tool --id ID --verify -m RSA-PKCS \
--input-file data --signature-file data.sig
Encrypt a file using the AES key with ID 85 and the AES-CBC mechanism with padding:
pkcs11-tool --login --encrypt --id 85 -m AES-CBC-PAD \
--iv "00000000000000000000000000000000" \
-i file.txt -o encrypted_file.data
Decipher that encrypted file:
pkcs11-tool --login --decrypt --id 85 -m AES-CBC-PAD \
--iv "00000000000000000000000000000000" \
--i encrypted_file.data -o decrypted.txt
Use the key with ID 75, mechanism AES-CBC-PAD, and initialization vector "00000000000000000000000000000000" to wrap the key with ID 76 into the output file exported_aes.key:
pkcs11-tool --login --wrap --id 75 --mechanism AES-CBC-PAD \
--iv "00000000000000000000000000000000" \
--application-id 76 \
--output-file exported_aes.key
Use the key with ID 22 and mechanism RSA-PKCS to unwrap a key from file aes_wrapped.key. After a successful unwrap operation, a new AES key is created on the token. Its ID is set to 90 and its label is set to unwrapped-key.
โ ๏ธ note bestie: for the MyEID card, the AES key size must be present in the key specification, i.e. AES:16 ๐
pkcs11-tool --login --unwrap --mechanism RSA-PKCS --id 22 \
-i aes_wrapped.key --key-type AES: \
--application-id 90 --application-label unwrapped-key
Use the SO-PIN to initialize or re-set the PIN:
pkcs11-tool --login --login-type so --init-pin
๐ AUTHORS ๐
pkcs11-tool was written by Olaf Kirch <okir@suse.de>. absolute legend behaviour, we stan ๐ซถ
aaaand that's the whole page, bestie!! ๐ธ this one shipped as part of opensc and the page itself is dated 04/19/2026. go forth and handle your keys responsibly, ily, mwah ๐โจ๐๐ฆ
๐ฆ where this page comes from
- fedora 43: opensc 0.27.1-2.fc43 ยท LGPL-2.1-or-later AND BSD-3-Clause
- fedora 44: opensc 0.27.1-2.fc44 ยท LGPL-2.1-or-later AND BSD-3-Clause
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms