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#
pkcs11-tool bruger et hexadecimalt nøgle-ID til at identificere nøgler. NetHSM bruger alfanumeriske strenge som nøgle-ID. NetHSMs PKCS#11-modul bruger de rå byteværdier i strengen til at danne PKCS#11-ID’et. Du kan få den hexadecimale version af en NetHSM-nøgle 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
Det slot, du vil bruge, skal have en andministrator-bruger i konfigurationsfilen. Ellers vil du få en CKR_USER_NOT_LOGGED_IN fejl.
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