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#

pkcs11-tool bruger et hexadecimalt nøgle-ID til at identificere nøgler. NetHSM bruger alfanumeriske strenge som nøgle-ID. NetHSMs PKCS#11-modul bruger de rå byteværdier i strengen til at danne PKCS#11-ID’et. Du kan få den hexadecimale version af en NetHSM-nøgle 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

Det slot, du vil bruge, skal have en andministrator-bruger i konfigurationsfilen. Ellers vil du få en CKR_USER_NOT_LOGGED_IN fejl.

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