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