PKCS#11 с помощью pkcs11-tool#
Это руководство описывает использование драйвера PKCS#11 для NetHSM. В руководстве используются инструменты из OpenSC. Пожалуйста, обратитесь к их документации, чтобы узнать, как использовать их в вашей операционной системе.
Важно
Этот драйвер все еще является ранней реализацией Proof of Concept, которая реализует только функции, необходимые для работы TLS-серверов.
Установка#
Установите предварительно скомпилированную библиотеку#
Загрузите архив с последним выпуском со страницы releases репозитория. Используйте архив с релизом, в заголовке которого содержится название вашей операционной системы.
Извлеките файлы из загруженного архива с помощью выбранной вами программы архивации.
Скопируйте извлеченную библиотеку в соответствующий путь в вашей операционной системе. Путь зависит от установки и конфигурации OpenSC.
Компиляция из исходного кода#
Важно
Этот драйвер может быть скомпилирован только с помощью официального компилятора Go. Не используйте компилятор GNU Go (GCC-Go). Пожалуйста, обратитесь к их сайту ` <https://go.dev/doc/install>` __, чтобы узнать, как его установить.
Скачайте архив с последним релизом со страницы releases репозитория. Используйте архив с релизом, в названии которого содержится Source code.
Извлеките файлы из загруженного архива с помощью выбранной вами программы архивации.
В директории с извлеченным исходным кодом выполните следующую команду для компиляции библиотеки.
./build.sh
./build.sh
Скопируйте извлеченную библиотеку в соответствующий путь в вашей операционной системе. Путь зависит от установки и конфигурации OpenSC.
Конфигурация#
Конфигурационный файл p11nethsm.conf необходим и используется для настройки соединения между драйвером PKCS#11 и NetHSM.
Пример конфигурационного файла выглядит следующим образом.
YAML 1.1
---
p11nethsm:
logfile: /tmp/p11nethsm.log
maxsessioncount: 5
debug: true
slots:
- label: NetHSM1
description: NetHSM Zone A
url: "https://nethsmdemo.nitrokey.com/api/v1"
# certSHA256:
# - "0C:66:DC:EB:4D:12:C3:24:FC:82:F4:1D:4C:16:44:12:1D:00:79:FF:36:96:65:E2:21:C4:36:94:F7:8E:22:89"
user: "operator"
password: "env:NETHSM_PASS"
Измените конфигурационный файл p11nethsm.conf в соответствии с вашим окружением.
Конфигурационный файл может включать несколько слотов в массиве slots. Слоты представляют несколько развертываний NetHSM. Поле label слота должно содержать уникальное имя. Ключи url, user и password являются обязательными. В целях безопасности рекомендуется передавать пароль в переменной окружения. Для этого в ключе password передается env:NETHSM_PASS, где NETHSM_PASS - имя переменной окружения, содержащей пароль. Ключ certSHA256 необходимо установить, если сертификат TLS не подписан центром сертификации (ЦС), содержащимся в хранилище сертификатов операционной системы.
Файл конфигурации должен быть сохранен либо в следующих каталогах, либо в каталоге, в котором выполняется приложение.
$HOME/.nitrokey
/etc/nitrokey/
Управление ключами#
Информация#
Показать информацию о версии cryptoki и драйвере PKCS#11.
$ pkcs11-tool --module p11nethsm.so --show-info
Cryptoki version 2.40
Manufacturer Nitrokey GmbH
Library NetHSM PKCS#11 module (ver 0.1)
Using slot 0 with a present token (0x0)
Список слотов#
Информация о доступных слотах. Перечисленные слоты зависят от конфигурации массива слотов в конфигурационном файле p11nethsm.conf. Чтобы узнать больше о конфигурации слотов, обратитесь к главе Конфигурация.
$ pkcs11-tool --module p11nethsm.so --list-slots
Available slots:
Slot 0 (0x0): NetHSM Zone A
token label : NetHSM1
token manufacturer : Nitrokey GmbH
token model : NetHSM
token flags : rng, token initialized, PIN initialized, readonly
hardware version : 0.1
firmware version : 0.1
serial num : 0
pin min/max : 3/256
Примечание
Если ваша конфигурация поддерживает более одного слота, возможно, вам придется добавить опцию –slot <arg> в команды pkcs11-tool, чтобы использовать нужный слот.
Генерировать ключи#
Сгенерируйте пару ключей и сохраните ее на NetHSM.
Примечание
В настоящее время драйвер PKCS#11 не поддерживает эту функцию. Пара ключей может быть сгенерирована с помощью nitropy или запроса REST API. Чтобы узнать больше о том, как сгенерировать ключ, обратитесь к главе Generate Key.
Ключи списка#
Показать информацию о ключах и сертификатах в хранилище ключей ** на NetHSM.
$ pkcs11-tool --module p11nethsm.so --list-objects
Using slot 0 with a present token (0x0)
Private Key Object; RSA
label: myFirstKey
ID: 6d7946697273744b6579
Usage: decrypt, sign
Access: sensitive, always sensitive, never extractable
Public Key Object; RSA 0 bits
label: myFirstKey
ID: 6d7946697273744b6579
Usage: none
Access: none
Читать ключи#
Считывание ключей и сертификатов из хранилища ключей ** на NetHSM. Невозможно считывать закрытые ключи с NetHSM.
Открытый ключ пары ключей может быть прочитан следующим образом.
$ pkcs11-tool --module p11nethsm.so --read-object --type pubkey --label myFirstKey -o public.key
Сертификат пары ключей можно прочитать следующим образом.
$ pkcs11-tool --module p11nethsm.so --read-object --type cert --label myFirstKey -o public.key
Возвращаемые сертификаты или открытые ключи имеют кодировку ASN.1. Данные могут быть декодированы с помощью инструмента dumpasn1, поскольку они содержат данные в формате DER. Формат DER может быть преобразован в формат PEM с помощью OpenSSL.
Ключи для записи#
Запись ключей и сертификатов в хранилище ключей ** на NetHSM.
Закрытый ключ пары ключей можно записать следующим образом.
$ pkcs11-tool --module p11nethsm.so --write-object secret.key --type privkey --label myFirstKey
Открытый ключ пары ключей можно записать следующим образом.
$ pkcs11-tool --module p11nethsm.so --write-object public.key --type pubkey --label myFirstKey
Сертификат пары ключей можно записать следующим образом.
$ pkcs11-tool --module p11nethsm.so --write-object cert.pub --type cert --label myFirstKey
Основные операции#
Зашифровать#
NetHSM не может шифровать данные с помощью асимметричных ключей, но он предоставляет открытый ключ, который может быть использован для шифрования. Обратитесь к главе Show Key Details, или получите ключ, как описано в главе Read Keys <pkcs11_with_pkcs11.html#read-keys>, чтобы узнать больше о том, как получить открытый ключ. В примере предполагается, что открытый ключ находится в файле public.pem.
Данные могут быть зашифрованы с помощью OpenSSL следующим образом.
$ echo 'NetHSM rulez!' | openssl pkeyutl -encrypt -pubin \
-inkey public.pem \
-pkeyopt rsa_padding_mode:oaep \
-pkeyopt rsa_oaep_md:sha512 \
-pkeyopt rsa_mgf1_md:sha512 \
-out encrypted.data
Расшифровать#
NetHSM может расшифровывать данные для закрытого ключа, хранящегося в Key Store на NetHSM. В данном примере используется зашифрованное сообщение из предыдущей главы Encrypt.
$ pkcs11-tool --module p11nethsm.so --decrypt \
--mechanism RSA-PKCS-OAEP \
--input-file encrypted.data \
--label myFirstKey \
--hash-algorithm SHA512
NetHSM rulez!
Подпишитесь#
NetHSM может подписывать данные закрытым ключом, хранящимся в Key Store на NetHSM. Для подписей с ключом RSA и ECDSA сначала необходимо вычислить дайджест.
Для вычисления дайджеста сначала необходимо получить данные. Сообщение создается следующим образом.
$ echo 'NetHSM rulez!' | pkcs11-tool --module p11nethsm.so \
--sign \
--mechanism SHA512-RSA-PKCS-PSS \
--output-file sig.data \
--label myFirstKey
Созданная подпись может быть проверена с помощью OpenSSL следующим образом.
$ echo 'NetHSM rulez!' | openssl dgst -keyform PEM \
-verify public.pem \
-sha512 \
-sigopt rsa_padding_mode:pss \
-sigopt rsa_pss_saltlen:-1 \
-signature sig.data