pkcs11-tool#
pkcs11-tool - инструмент, входящий в состав проекта OpenSC, который может быть использован для управления ключами на устройстве PKCS#11.
С помощью опции --module
необходимо передать расположение модуля PKCS#11, который необходимо использовать:
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so
Замените /usr/lib/nitrokey/libnethsm_pkcs11.so
на путь, по которому расположен модуль NetHSM PKCS#11.
Проверить работоспособность модуля можно с помощью следующей команды:
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
Примечание
Если ваша конфигурация поддерживает более одного слота, возможно, придется добавить опцию --slot <arg>
в команды pkcs11-tool, чтобы использовать нужный слот.
Ключевые идентификаторы#
В pkcs11-tool для идентификации ключей используется шестнадцатеричный идентификатор ключа. NetHSM использует в качестве идентификатора ключа буквенно-цифровые строки. Модуль NetHSM PKCS#11 использует необработанные значения байтов строки для формирования идентификатора PKCS#11. Получить шестнадцатеричную версию ключа NetHSM можно с помощью команды xxd
:
echo -n "MyKey" | xxd -p
4d794b6579
Затем это шестнадцатеричное значение можно передать в pkcs11-tool с помощью опции --id
.
Генерация ключа#
Сгенерируйте пару ключей и сохраните ее на NetHSM.
Примечание
В конфигурационном файле слота, который вы хотите использовать, должен быть указан пользователь 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
.
Примечание
Выходные данные представлены в формате 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
Примечание
Приходится вручную подгонять входные данные под размер блока ключа 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