pkcs11-tool

pkcs11-tool je nástroj, který je součástí projektu OpenSC a který lze použít ke správě klíčů na zařízení PKCS#11.

Umístění modulu PKCS#11, který chcete použít, musíte předat pomocí volby --module:

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

Nahraďte /usr/lib/nitrokey/libnethsm_pkcs11.so cestou, kde je umístěn modul NetHSM PKCS#11.

Dalším příkazem můžete otestovat, zda modul funguje:

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

Měli byste vidět něco takového:

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

Seznam slotů

Informace o dostupných slotech. Uvedené sloty závisí na konfiguraci pole slotů v konfiguračním souboru p11nethsm.conf. Další informace o konfiguraci slotů naleznete v kapitole Konfigurace.

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

Poznámka

Pokud vaše konfigurace podporuje více než jeden slot, možná budete muset v příkazech pkcs11-tool přidat volbu --slot <arg>, abyste použili ten správný.

ID klíčů

Nástroj pkcs11-tool používá k identifikaci klíčů hexadecimální ID klíče. NetHSM používá jako ID klíče alfanumerické řetězce. Modul PKCS#11 NetHSM používá k vytvoření ID PKCS#11 surové hodnoty bajtů řetězce. Hexadecimální verzi klíče NetHSM můžete získat pomocí adresy xxd:

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

Tuto hexadecimální hodnotu pak můžete předat nástroji pkcs11 pomocí volby --id.

Generování klíče

Vygenerujte pár klíčů a uložte jej do zařízení NetHSM.

Poznámka

Slot, který chcete použít, musí mít v konfiguračním souboru uživatele andministrator. Jinak se zobrazí chyba 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"

Seznam klíčů

Seznam klíčů uložených v zařízení 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

Přečtěte si klíče

Čtení veřejného klíče páru klíčů uloženého v zařízení NetHSM. Soukromé klíče z NetHSM číst nelze.

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

Certifikát páru klíčů lze přečíst stejným příkazem změnou volby --type na cert.

Poznámka

Výstup je ve formátu DER.

Klíče pro zápis

Zapište soukromý klíč do zařízení NetHSM. Veřejný klíč je automaticky odvozen od soukromého klíče.

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

Certifikát páru klíčů lze zapsat stejným příkazem změnou volby --type na cert.

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

Šifrování

Šifrování dat je podporováno pouze pro klíče AES.

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

Poznámka

Vstupní data musíte ručně doplnit na velikost bloku klíče AES.

Dešifrování

AES

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

RSA

Data můžete zašifrovat veřejným klíčem a dešifrovat soukromým klíčem.

# 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

Podepsat

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

Ověření podpisu pomocí protokolu 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