pkcs11-strumento

pkcs11-tool è uno strumento parte del progetto OpenSC che può essere usato per gestire le chiavi su un dispositivo PKCS#11.

È necessario passare il percorso del modulo PKCS#11 da usare con l’opzione --module:

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

Sostituire /usr/lib/nitrokey/libnethsm_pkcs11.so con il percorso in cui si trova il modulo NetHSM PKCS#11.

È possibile verificare se il modulo funziona con il comando successivo:

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

Si dovrebbe vedere qualcosa di simile a questo:

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

Elenco slot

Informazioni sugli slot disponibili. Gli slot elencati dipendono dalla configurazione dell’array di slot nel file di configurazione p11nethsm.conf. Per ulteriori informazioni sulla configurazione degli slot, consultare il capitolo `Configurazione <pkcs11-setup.html#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

Nota

Se la configurazione supporta più di uno slot, potrebbe essere necessario aggiungere l’opzione --slot <arg> nei comandi di pkcs11-tool per utilizzare quello giusto.

ID chiave

pkcs11-tool utilizza un ID chiave esadecimale per identificare le chiavi. NetHSM utilizza stringhe alfanumeriche come ID chiave. Il modulo PKCS#11 di NetHSM usa i valori grezzi dei byte della stringa per formare l’ID PKCS#11. È possibile ottenere la versione esadecimale di una chiave NetHSM con xxd:

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

È quindi possibile passare questo valore esadecimale a pkcs11-tool con l’opzione --id.

Generare una chiave

Generare una coppia di chiavi e memorizzarla sul NetHSM.

Nota

Lo slot che si vuole utilizzare deve avere un utente andministrator nel file di configurazione. Altrimenti si otterrà un errore 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/Generico

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

Chiavi dell’elenco

Elencare le chiavi memorizzate sul 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

Leggi le chiavi

Leggere la chiave pubblica di una coppia di chiavi memorizzata sul NetHSM. Non è possibile leggere le chiavi private dal NetHSM.

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

Il certificato della coppia di chiavi può essere letto con lo stesso comando cambiando l’opzione --type in cert.

Nota

L’output è in formato DER.

Tasti di scrittura

Scrivere una chiave privata sul NetHSM. La chiave pubblica viene derivata automaticamente dalla chiave privata.

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

Il certificato della coppia di chiavi può essere scritto con lo stesso comando cambiando l’opzione --type in cert.

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

Crittografare

La crittografia dei dati è supportata solo per le chiavi AES.

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

Nota

È necessario imbottire manualmente i dati di ingresso in base alla dimensione del blocco della chiave AES.

Decriptare

AES

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

RSA

È possibile criptare i dati con la chiave pubblica e decriptarli con la chiave privata.

# 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

Segno

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

Per verificare la firma con 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