pkcs11-tool

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 <pkcs11-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 und Etiketten

NetHSM verwendet alphanumerische Zeichenketten als Schlüssel-IDs. Das NetHSM PKCS#11-Modul zeigt die Schlüssel-ID auf dem NetHSM als PKCS#11-Bezeichnung des Schlüssels und eine hexadezimale Darstellung davon als PKCS#11-ID an. Das pkcs11-tool verwendet eine hexadezimale Schlüssel-ID zur Identifizierung von Schlüsseln, kann also die generierte PKCS#11-ID verwenden.

Wichtig

Die Schlüssel-IDs auf dem NetHSM sind alphanumerische Zeichenketten, daher sind nur die Zeichen A-Z, a-z und 0-9 erlaubt. Ungültige Zeichen, die über PKCS#11-Labels übergeben werden, führen zu einem PKCS11 function C_GenerateKeyPair failed: rv = CKR_FUNCTION_FAILED (0x6) Fehler.

Sie können die hexadezimale Version einer NetHSM-Schlüssel-ID 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

The slot you want to use needs to have an administrator user in the configuration file. Otherwise you will get a CKR_USER_NOT_LOGGED_IN error.

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

Schlüssel 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.

Schlüssel 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