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