pkcs11-værktøj

pkcs11-tool er et værktøj, der er en del af OpenSC-projektet, og som kan bruges til at administrere nøgler på en PKCS#11-enhed.

Du skal angive placeringen af det PKCS#11-modul, der skal bruges, med --module optionen:

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

Erstat /usr/lib/nitrokey/libnethsm_pkcs11.so med den sti, hvor NetHSM PKCS#11-modulet er placeret.

Du kan teste, om modulet fungerer, med den næste kommando:

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

Du bør se noget i denne retning:

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

Liste slots

Oplysningerne om de tilgængelige slots. De viste slots afhænger af konfigurationen af slots-arrayet i konfigurationsfilen p11nethsm.conf. For at lære mere om konfigurationen af slots henvises til kapitlet Konfiguration.

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

Bemærk

Hvis din konfiguration understøtter mere end ét slot, kan det være nødvendigt at tilføje --slot <arg> i pkcs11-tool-kommandoer for at bruge det rigtige.

Nøgle-id’er og etiketter

NetHSM bruger alfanumeriske strenge som nøgle-id’er. NetHSM PKCS#11-modulet viser nøgle-ID’et på NetHSM som PKCS#11-label for nøglen og en hexadecimal repræsentation af den som PKCS#11-ID. * pkcs11-tool* bruger et hexadecimalt nøgle-id til at identificere nøgler og kan derfor bruge det genererede PKCS#11-id.

Vigtigt

Nøgle-id’erne på NetHSM er alfanumeriske strenge, og derfor er kun tegnene A-Z, a-z og 0-9 tilladt. Ugyldige tegn, der sendes gennem PKCS#11-labels, vil resultere i en PKCS11 function C_GenerateKeyPair failed: rv = CKR_FUNCTION_FAILED (0x6)-fejl.

Du kan få den hexadecimale version af et NetHSM-nøgle-ID med xxd:

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

Du kan derefter sende denne hex-værdi til pkcs11-tool med --id optionen.

Generer en nøgle

Generer et nøglepar, og gem det på NetHSM.

Bemærk

The slot you want to use needs to have an administrator user in the configuration file. Otherwise you will get a CKR_USER_NOT_LOGGED_IN error.

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/Generisk

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

Liste over nøgler

Vis de nøgler, der er gemt på 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

Læs nøgler

Læs den offentlige nøgle til et nøglepar, der er gemt på NetHSM. Det er ikke muligt at læse private nøgler fra NetHSM.

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

Nøgleparrets certifikat kan læses med samme kommando ved at ændre --type optionen til cert.

Bemærk

Outputtet er i DER-format.

Skriv taster

Skriv en privat nøgle på NetHSM. Den offentlige nøgle udledes automatisk af den private nøgle.

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

Nøgleparrets certifikat kan skrives med den samme kommando ved at ændre --type til cert.

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

Krypter

Kryptering af data understøttes kun for AES-nøgler.

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

Bemærk

Du er nødt til manuelt at udfylde inputdataene til AES-nøglens blokstørrelse.

Dekrypter

AES

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

RSA

Du kan kryptere data med den offentlige nøgle og dekryptere dem med den private nøgle.

# 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

Skilt

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

For at verificere signaturen med 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