pkcs11-verktyg#

pkcs11-tool är ett verktyg som ingår i projektet OpenSC och som kan användas för att hantera nycklar på en PKCS#11-enhet.

Du måste ange platsen för den PKCS#11-modul som ska användas med alternativet --module:

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

Ersätt /usr/lib/nitrokey/libnethsm_pkcs11.so med sökvägen där NetHSM PKCS#11-modulen finns.

Du kan testa om modulen fungerar med nästa kommando:

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

Du bör se något i stil med detta:

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

Lista över spelautomater#

Information om tillgängliga slots. Vilka slots som visas beror på konfigurationen av slots-arrayen i konfigurationsfilen p11nethsm.conf. Mer information om konfigurationen av slots finns i 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

Observera

Om din konfiguration stöder mer än en kortplats kan du behöva lägga till alternativet --slot <arg> i pkcs11-tool-kommandon för att använda rätt kortplats.

Nyckel-ID#

pkcs11-tool använder ett hexadecimalt nyckel-ID för att identifiera nycklar. NetHSM använder alfanumeriska strängar som nyckel-ID. NetHSM:s PKCS#11-modul använder de råa bytevärdena i strängen för att bilda PKCS#11-ID. Du kan få den hexadecimala versionen av en NetHSM-nyckel med xxd:

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

Du kan sedan skicka detta hexadecimala värde till pkcs11-tool med alternativet --id.

Skapa en nyckel#

Generera ett nyckelpar och lagra det på NetHSM.

Observera

Den slot du vill använda måste ha en andministrator-användare i konfigurationsfilen. Annars kommer du att få ett CKR_USER_NOT_LOGGED_IN-fel.

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"

Lista nycklar#

Lista de nycklar som finns lagrade 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 nycklar#

Läs den publika nyckeln i ett nyckelpar som lagras på NetHSM. Det är inte möjligt att läsa privata nycklar från NetHSM.

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

Certifikatet för nyckelparet kan läsas med samma kommando genom att ändra alternativet --type till cert.

Observera

Utdata är i DER-format.

Skriv nycklar#

Skriv en privat nyckel på NetHSM. Den offentliga nyckeln härleds automatiskt från den privata nyckeln.

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

Certifikatet för nyckelparet kan skrivas med samma kommando genom att ändra alternativet --type till cert.

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

Kryptera#

Kryptering av data stöds endast för AES-nycklar.

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

Observera

Du måste manuellt fylla i indata till AES-nyckelns blockstorlek.

Avkryptera#

AES#

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

RSA#

Du kan kryptera data med den offentliga nyckeln och dekryptera dem med den privata nyckeln.

# 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

Skylt#

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

Verifiera 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