pkcs11-tool#
pkcs11-tool to narzędzie będące częścią projektu OpenSC, które może być używane do zarządzania kluczami na urządzeniu PKCS#11.
Musisz przekazać lokalizację modułu PKCS#11 do użycia z opcją --module
:
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so
Zastąp /usr/lib/nitrokey/libnethsm_pkcs11.so
ścieżką, w której znajduje się moduł NetHSM PKCS#11.
Możesz sprawdzić, czy moduł działa za pomocą następnego polecenia:
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --show-info
Powinieneś zobaczyć coś takiego:
Cryptoki version 2.40
Manufacturer Nitrokey
Library Nitrokey PKCS#11 library (ver 0.1)
Lista slotów#
Informacje o dostępnych slotach. Wymienione sloty zależą od konfiguracji tablicy slotów w pliku konfiguracyjnym p11nethsm.conf. Aby dowiedzieć się więcej o konfiguracji slotów, zapoznaj się z rozdziałem Konfiguracja.
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
Informacja
Jeśli konfiguracja obsługuje więcej niż jedno gniazdo, może być konieczne dodanie opcji --slot <arg>
w poleceniach pkcs11-tool, aby użyć właściwego.
Identyfikatory kluczy#
pkcs11-tool używa szesnastkowego identyfikatora klucza do identyfikacji kluczy. NetHSM używa ciągów alfanumerycznych jako identyfikatorów kluczy. Moduł PKCS#11 NetHSM wykorzystuje nieprzetworzone wartości bajtowe łańcucha do utworzenia identyfikatora PKCS#11. Szesnastkową wersję klucza NetHSM można uzyskać za pomocą xxd
:
echo -n "MyKey" | xxd -p
4d794b6579
Następnie można przekazać tę wartość szesnastkową do pkcs11-tool z opcją --id
.
Generowanie klucza#
Wygeneruj parę kluczy i zapisz ją w pamięci NetHSM.
Informacja
Slot, którego chcesz użyć, musi mieć użytkownika andministrator w pliku konfiguracyjnym. W przeciwnym razie pojawi się błąd 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/Generic#
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --keygen --key-type AES:256 --label "aeskey"
Lista kluczy#
Lista kluczy przechowywanych w 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
Czytaj Klucze#
Odczyt klucza publicznego pary kluczy przechowywanej w NetHSM. Odczyt kluczy prywatnych z NetHSM nie jest możliwy.
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --read-object --type pubkey --label rsakey --output-file rsakey.pub
Certyfikat pary kluczy można odczytać za pomocą tego samego polecenia, zmieniając opcję --type
na cert
.
Informacja
Dane wyjściowe są w formacie DER.
Napisz klucze#
Zapisz klucz prywatny w NetHSM. Klucz publiczny jest automatycznie wyprowadzany z klucza prywatnego.
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --write-object rsakey.key --type privkey --id 7273616b6579
Certyfikat pary kluczy można zapisać za pomocą tego samego polecenia, zmieniając opcję --type
na cert
.
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --write-object rsakey.crt --type cert --id 7273616b6579
Szyfruj#
Szyfrowanie danych jest obsługiwane tylko dla kluczy AES.
echo "NetHSM rulez! " | pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --encrypt --id 6165736b6579 --mechanism AES_CBC --output-file encrypted.txt
Informacja
Dane wejściowe należy ręcznie uzupełnić do rozmiaru bloku klucza AES.
Odszyfrować#
AES#
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --decrypt --id 6165736b6579 --mechanism AES_CBC --input-file encrypted.txt
RSA#
Dane można szyfrować za pomocą klucza publicznego i odszyfrowywać za pomocą klucza prywatnego.
# 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
Podpisać#
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
Aby zweryfikować podpis za pomocą 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