pkcs11-tool#

pkcs11-tool este un instrument care face parte din proiectul OpenSC și care poate fi utilizat pentru a gestiona cheile pe un dispozitiv PKCS#11.

Trebuie să treceți locația modulului PKCS#11 care urmează să fie utilizat cu opțiunea --module:

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

Înlocuiți /usr/lib/nitrokey/libnethsm_pkcs11.so cu calea în care se află modulul NetHSM PKCS#11.

Puteți testa dacă modulul funcționează cu următoarea comandă:

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

Ar trebui să vedeți ceva de genul acesta:

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

Lista sloturilor#

Informații despre sloturile disponibile. Sloturile listate depind de configurația matricei de sloturi din fișierul de configurare p11nethsm.conf. Pentru a afla mai multe despre configurarea sloturilor, consultați capitolul 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

Notă

Dacă configurația dvs. acceptă mai mult de un slot, este posibil să trebuiască să adăugați opțiunea --slot <arg> în comenzile pkcs11-tool pentru a-l utiliza pe cel corect.

ID-uri cheie#

pkcs11-tool utilizează un ID hexazecimal al cheii pentru a identifica cheile. NetHSM utilizează șiruri alfanumerice ca ID de cheie. Modulul PKCS#11 al NetHSM utilizează valorile brute ale șirului de octeți pentru a forma ID-ul PKCS#11. Puteți obține versiunea hexazecimală a unei chei NetHSM cu xxd:

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

Apoi puteți transmite această valoare hexagonală către pkcs11-tool cu opțiunea --id.

Generarea unei chei#

Generați o pereche de chei și stocați-o pe NetHSM.

Notă

Slotul pe care doriți să îl utilizați trebuie să aibă un utilizator andministrator în fișierul de configurare. În caz contrar, veți primi o eroare 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/Generic#

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

Chei de listă#

Enumeră cheile stocate pe 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

Chei de citire#

Citiți cheia publică a unei perechi de chei stocate pe NetHSM. Nu este posibilă citirea cheilor private de pe NetHSM.

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

Certificatul perechii de chei poate fi citit cu aceeași comandă prin schimbarea opțiunii --type în cert.

Notă

Rezultatul este în format DER.

Chei de scriere#

Scrieți o cheie privată pe NetHSM. Cheia publică este derivată automat din cheia privată.

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

Certificatul perechii de chei poate fi scris cu aceeași comandă prin schimbarea opțiunii --type în cert.

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

Criptare#

Criptarea datelor este acceptată numai pentru cheile AES.

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

Notă

Trebuie să completați manual datele de intrare la dimensiunea blocului cheii AES.

Decriptare#

AES#

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

RSA#

Puteți cripta datele cu cheia publică și le puteți decripta cu cheia privată.

# 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

Semnează#

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

Pentru a verifica semnătura cu 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