pkcs11-Werkzeug#

pkcs11-tool ist ein Tool des OpenSC Projekts, das zur Verwaltung von Schlüsseln auf einem PKCS#11-Gerät verwendet werden kann.

Sie müssen den Speicherort des zu verwendenden PKCS#11-Moduls mit der Option --module übergeben:

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

Ersetzen Sie /usr/lib/nitrokey/libnethsm_pkcs11.so durch den Pfad, unter dem sich das NetHSM PKCS#11-Modul befindet.

Mit dem nächsten Befehl können Sie testen, ob das Modul funktioniert:

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

Sie sollten etwa so aussehen:

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

Slots auflisten#

Die Informationen über die verfügbaren Steckplätze. Die aufgelisteten Slots hängen von der Konfiguration des Slot-Arrays in der Konfigurationsdatei p11nethsm.conf ab. Um mehr über die Konfiguration von Slots zu erfahren, lesen Sie bitte das Kapitel Konfiguration <setup.html#Configuration>`_.

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

Bemerkung

Wenn Ihre Konfiguration mehr als einen Slot unterstützt, müssen Sie eventuell die Option --slot <arg> in den pkcs11-tool-Befehlen hinzufügen, um den richtigen Slot zu verwenden.

Schlüssel-IDs#

pkcs11-tool verwendet eine hexadezimale Schlüssel-ID, um Schlüssel zu identifizieren. NetHSM verwendet alphanumerische Zeichenketten als Schlüssel-ID. Das PKCS#11-Modul von NetHSM verwendet die rohen Byte-Werte des Strings, um die PKCS#11-ID zu bilden. Sie können die hexadezimale Version eines NetHSM-Schlüssels mit xxd erhalten:

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

Diesen Hex-Wert können Sie dann mit der Option --id an pkcs11-tool übergeben.

Einen Schlüssel generieren#

Erzeugen Sie ein Schlüsselpaar und speichern Sie es auf dem NetHSM.

Bemerkung

Der Slot, den Sie verwenden wollen, muss einen andministrator-Benutzer in der Konfigurationsdatei haben. Andernfalls erhalten Sie den Fehler 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/Generisch#

pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --keygen --key-type AES:256 --label "aeskey"

Schlüssel auflisten#

Liste der auf dem NetHSM gespeicherten Schlüssel.

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

Tasten lesen#

Lesen des öffentlichen Schlüssels eines auf dem NetHSM gespeicherten Schlüsselpaares. Es ist nicht möglich, private Schlüssel vom NetHSM zu lesen.

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

Das Zertifikat des Schlüsselpaares kann mit demselben Befehl gelesen werden, indem die Option --type in cert geändert wird.

Bemerkung

Die Ausgabe erfolgt im DER-Format.

Tasten schreiben#

Schreiben Sie einen privaten Schlüssel auf dem NetHSM. Der öffentliche Schlüssel wird automatisch von dem privaten Schlüssel abgeleitet.

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

Das Zertifikat des Schlüsselpaares kann mit demselben Befehl geschrieben werden, indem die Option --type in cert geändert wird.

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

Verschlüsseln Sie#

Die Verschlüsselung von Daten wird nur für AES-Schlüssel unterstützt.

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

Bemerkung

Sie müssen die Eingabedaten manuell auf die Blockgröße des AES-Schlüssels auffüllen.

Entschlüsseln#

AES#

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

RSA#

Sie können Daten mit dem öffentlichen Schlüssel verschlüsseln und mit dem privaten Schlüssel entschlüsseln.

# 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

Unterschrift#

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

Um die Signatur mit OpenSSL zu überprüfen:

# 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