pkcs11-værktøj¶
pkcs11-tool er et værktøj, der er en del af OpenSC-projektet, og som kan bruges til at administrere nøgler på en PKCS#11-enhed.
Du skal angive placeringen af det PKCS#11-modul, der skal bruges, med --module optionen:
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so
Erstat /usr/lib/nitrokey/libnethsm_pkcs11.so med den sti, hvor NetHSM PKCS#11-modulet er placeret.
Du kan teste, om modulet fungerer, med den næste kommando:
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --show-info
Du bør se noget i denne retning:
Cryptoki version 2.40
Manufacturer Nitrokey
Library Nitrokey PKCS#11 library (ver 0.1)
Liste slots¶
Oplysningerne om de tilgængelige slots. De viste slots afhænger af konfigurationen af slots-arrayet i konfigurationsfilen p11nethsm.conf. For at lære mere om konfigurationen af slots henvises til kapitlet Konfiguration.
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
Bemærk
Hvis din konfiguration understøtter mere end ét slot, kan det være nødvendigt at tilføje --slot <arg> i pkcs11-tool-kommandoer for at bruge det rigtige.
Nøgle-id’er og etiketter¶
NetHSM bruger alfanumeriske strenge som nøgle-id’er. NetHSM PKCS#11-modulet viser nøgle-ID’et på NetHSM som PKCS#11-label for nøglen og en hexadecimal repræsentation af den som PKCS#11-ID. * pkcs11-tool* bruger et hexadecimalt nøgle-id til at identificere nøgler og kan derfor bruge det genererede PKCS#11-id.
Vigtigt
Nøgle-id’erne på NetHSM er alfanumeriske strenge, og derfor er kun tegnene A-Z, a-z og 0-9 tilladt. Ugyldige tegn, der sendes gennem PKCS#11-labels, vil resultere i en PKCS11 function C_GenerateKeyPair failed: rv = CKR_FUNCTION_FAILED (0x6)-fejl.
Du kan få den hexadecimale version af et NetHSM-nøgle-ID med xxd:
echo -n "MyKey" | xxd -p
4d794b6579
Du kan derefter sende denne hex-værdi til pkcs11-tool med --id optionen.
Generer en nøgle¶
Generer et nøglepar, og gem det på NetHSM.
Bemærk
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/Generisk¶
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --keygen --key-type AES:256 --label "aeskey"
Liste over nøgler¶
Vis de nøgler, der er gemt på NetHSM.
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
Læs nøgler¶
Læs den offentlige nøgle til et nøglepar, der er gemt på NetHSM. Det er ikke muligt at læse private nøgler fra NetHSM.
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --read-object --type pubkey --label rsakey --output-file rsakey.pub
Nøgleparrets certifikat kan læses med samme kommando ved at ændre --type optionen til cert.
Bemærk
Outputtet er i DER-format.
Skriv taster¶
Skriv en privat nøgle på NetHSM. Den offentlige nøgle udledes automatisk af den private nøgle.
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --write-object rsakey.key --type privkey --id 7273616b6579
Nøgleparrets certifikat kan skrives med den samme kommando ved at ændre --type til cert.
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --write-object rsakey.crt --type cert --id 7273616b6579
Krypter¶
Kryptering af data understøttes kun for AES-nøgler.
echo "NetHSM rulez! " | pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --encrypt --id 6165736b6579 --mechanism AES_CBC --output-file encrypted.txt
Bemærk
Du er nødt til manuelt at udfylde inputdataene til AES-nøglens blokstørrelse.
Dekrypter¶
AES¶
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --decrypt --id 6165736b6579 --mechanism AES_CBC --input-file encrypted.txt
RSA¶
Du kan kryptere data med den offentlige nøgle og dekryptere dem med den private nøgle.
# 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
Skilt¶
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
For at verificere signaturen med OpenSSL:
# 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