PKCS#11 с pkcs11-tool#

Това ръководство описва използването на PKCS#11 драйвера за NetHSM. Ръководството използва инструменти от OpenSC. Моля, направете справка с тяхната документация, за да научите как да ги използвате във вашата операционна система.

Important

Този драйвер все още е ранна версия на концепцията, която изпълнява само функциите, необходими за работа с TLS сървъри.

Инсталиране на приложението Nitrokey#

Инсталиране на предварително компилирана библиотека#

  1. Изтеглете архив с най-новата версия от страницата releases на хранилището. Използвайте архива с изданието, което съдържа името на вашата операционна система в заглавието.

  2. Изтеглете файловете от изтегления архив с програма за архивиране по ваш избор.

  3. Копирайте извлечената библиотека в съответния път във вашата операционна система. Пътят зависи от вашата инсталация и конфигурация на OpenSC.

Компилиране от изходния код#

Important

Този драйвер може да се компилира само с официалния компилатор на Go. Не използвайте компилатора GNU Go (GCC-Go). Моля, вижте техния уебсайт ` <https://go.dev/doc/install>` __, за да научите как да го инсталирате.

  1. Изтеглете архив с най-новата версия от страницата releases на хранилището. Използвайте архива с изданието, което съдържа в заглавието си Изходен код.

  2. Изтеглете файловете от изтегления архив с програма за архивиране по ваш избор.

  3. В директорията с извлечения изходен код изпълнете следната команда, за да компилирате библиотеката.

    ./build.sh
    
  4. Копирайте извлечената библиотека в съответния път във вашата операционна система. Пътят зависи от вашата инсталация и конфигурация на OpenSC.

Статична конфигурация на DNS#

Файлът за конфигуриране 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 сертификатът не е подписан от удостоверяващ орган (CA), съдържащ се в хранилището за сертификати на операционната система.

Конфигурационният файл трябва да бъде записан или в следните пътища, или в директорията, в която се изпълнява приложението.

  • $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

Note

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

Генериране на ключове#

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

Note

В момента драйверът PKCS#11 не поддържа тази функция. Ключовата двойка може да бъде генерирана с nitropy или с REST API заявка. За да научите повече за това как да генерирате ключ, моля, вижте глава Генериране на ключ.

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

Покажете информация за ключовете и сертификатите в Key Store на 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

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

Четете ключове и сертификати от Key Store на 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.

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

Записване на ключове и сертификати в Key Store на 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