pkcs11-tool

pkcs11-tool е инструмент, част от проекта OpenSC, който може да се използва за управление на ключове в устройство PKCS#11.

Трябва да предадете местоположението на модула PKCS#11, който да използвате, с опцията --module:

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

Заменете /usr/lib/nitrokey/libnethsm_pkcs11.so с пътя, по който се намира модулът PKCS#11 на NetHSM.

Можете да проверите дали модулът работи със следващата команда:

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

Трябва да видите нещо подобно:

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

Списък на слотовете

Информацията за наличните слотове. Изброените слотове зависят от конфигурацията на масива от слотове в конфигурационния файл p11nethsm.conf. За да научите повече за конфигурацията на слотовете, моля, вижте глава Конфигурация.

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

Note

Ако конфигурацията ви поддържа повече от един слот, може да се наложи да добавите опцията --slot <arg> в командите на pkcs11-tool, за да използвате правилния слот.

Идентификатори на ключове

pkcs11-tool използва шестнадесетичен идентификатор на ключове за идентифициране на ключовете. NetHSM използва буквено-цифрови низове като идентификатор на ключове. Модулът PKCS#11 на NetHSM използва суровите байтови стойности на низа, за да формира идентификатора PKCS#11. Можете да получите шестнадесетичната версия на ключ на NetHSM с xxd:

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

След това можете да предадете тази шестнадесетична стойност на pkcs11-tool с опцията --id.

Генериране на ключ

Генерирайте двойка ключове и я съхранявайте в NetHSM.

Note

Слотът, който искате да използвате, трябва да има потребител andministrator в конфигурационния файл. В противен случай ще получите грешка 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"

Списък с ключове

Избройте ключовете, съхранявани в 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

Прочетете ключовете

Прочетете публичния ключ на двойка ключове, съхранена в NetHSM. Не е възможно да се четат частни ключове от NetHSM.

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

Сертификатът на двойката ключове може да бъде прочетен със същата команда, като опцията --type се промени на cert.

Note

Изходът е във формат DER.

Ключове за писане

Запишете частен ключ в NetHSM. Публичният ключ се получава автоматично от частния ключ.

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

Сертификатът на двойката ключове може да бъде записан със същата команда, като опцията --type се промени на cert.

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

Криптиране

Шифроването на данни се поддържа само за ключове AES.

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

Note

Трябва ръчно да подредите входните данни до размера на блока на ключа AES.

Декриптиране

AES

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

RSA

Можете да криптирате данни с публичния ключ и да ги декриптирате с частния ключ.

# 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

Знак

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

За да проверите подписа с 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