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