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