pkcs11-tool

pkcs11-tool est un outil faisant partie du projet OpenSC qui peut être utilisé pour gérer les clés sur un dispositif PKCS#11.

Vous devez indiquer l’emplacement du module PKCS#11 à utiliser avec l’option --module :

pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so

Remplacez /usr/lib/nitrokey/libnethsm_pkcs11.so par le chemin d’accès au module PKCS#11 de NetHSM.

Vous pouvez tester le fonctionnement du module à l’aide de la commande suivante :

pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --show-info

Vous devriez voir quelque chose comme ceci :

Cryptoki version 2.40
Manufacturer     Nitrokey
Library          Nitrokey PKCS#11 library (ver 0.1)

Liste des machines à sous

Les informations sur les slots disponibles. Les slots listés dépendent de la configuration du tableau des slots dans le fichier de configuration p11nethsm.conf. Pour en savoir plus sur la configuration des slots, veuillez vous référer au chapitre Configuration.

pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --list-slots
Slot 0 (0x0): NetHSM
  token label        : LocalHSM
  token manufacturer : Nitrokey GmbH
  token model        : NetHSM
  token flags        : rng, token initialized, PIN initialized
  hardware version   : 0.1
  firmware version   : 0.1
  serial num         : unknown
  pin min/max        : 0/0

Note

Si votre configuration supporte plus d’un slot, vous devrez peut-être ajouter l’option --slot <arg> dans les commandes pkcs11-tool pour utiliser le bon slot.

ID clés

pkcs11-tool utilise un identifiant hexadécimal pour identifier les clés. NetHSM utilise des chaînes alphanumériques comme identifiant de clé. Le module PKCS#11 de NetHSM utilise les valeurs brutes des octets de la chaîne pour former l’identifiant PKCS#11. Vous pouvez obtenir la version hexadécimale d’une clé NetHSM avec xxd :

echo -n "MyKey" | xxd -p
4d794b6579

Vous pouvez ensuite transmettre cette valeur hexagonale à pkcs11-tool avec l’option --id.

Générer une clé

Générer une paire de clés et la stocker sur le NetHSM.

Note

Le slot que vous voulez utiliser doit avoir un utilisateur andministrator dans le fichier de configuration. Sinon vous obtiendrez une erreur CKR_USER_NOT_LOGGED_IN.

RSA

pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --keypairgen --key-type rsa:2048 --label "rsakey"

ECDSA

pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --keypairgen --key-type EC:prime256v1 --label "eckey"

AES/Générique

pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --keygen --key-type AES:256 --label "aeskey"

Clés de liste

Liste des clés stockées sur le NetHSM.

pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --list-objects
Using slot 0 with a present token (0x0)
Public Key Object; RSA 2048 bits
  label:      rsakey
  ID:         7273616b6579
  Usage:      none
  Access:     none
Private Key Object; RSA
  label:      rsakey
  ID:         7273616b6579
  Usage:      decrypt, sign
  Access:     sensitive, always sensitive, never extractable

Clés de lecture

Lire la clé publique d’une paire de clés stockée sur le NetHSM. Il n’est pas possible de lire les clés privées du NetHSM.

pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --read-object --type pubkey --label rsakey --output-file rsakey.pub

Le certificat de la paire de clés peut être lu avec la même commande en remplaçant l’option --type par cert.

Note

La sortie est au format DER.

Clés d’écriture

Inscrivez une clé privée sur le NetHSM. La clé publique est automatiquement dérivée de la clé privée.

pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --write-object rsakey.key --type privkey --id 7273616b6579

Le certificat de la paire de clés peut être écrit avec la même commande en remplaçant l’option --type par cert.

pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --write-object rsakey.crt --type cert --id 7273616b6579

Crypter

Le cryptage des données n’est possible que pour les clés AES.

echo "NetHSM rulez!  " | pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --encrypt --id 6165736b6579 --mechanism AES_CBC --output-file encrypted.txt

Note

Vous devez adapter manuellement les données d’entrée à la taille du bloc de la clé AES.

Décryptage

AES

pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --decrypt --id 6165736b6579 --mechanism AES_CBC --input-file encrypted.txt

RSA

Vous pouvez crypter des données avec la clé publique et les décrypter avec la clé privée.

# get the public key first
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --read-object --type pubkey --id 7273616b6579 --output-file public.der

# encrypt some data with OpenSSL
echo 'NetHSM rulez!NetHSM rulez!' | openssl pkeyutl -encrypt -pubin -inkey public.der -keyform DER -out data.crypt
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --decrypt --id 7273616b6579 --mechanism RSA-PKCS --input-file data.crypt

Signe

echo "NetHSM rulez!" | openssl dgst -sha256 -binary |  pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --sign --label rsakey --mechanism RSA-PKCS-PSS --hash-algorithm SHA256 --output-file data.sig --signature-format openssl

Pour vérifier la signature avec OpenSSL :

# get the public key
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --read-object --type pubkey --label rsakey --output-file public.der

echo 'NetHSM rulez!' | openssl dgst -keyform DER -verify public.der -sha256 -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:-1 -signature data.sig