pkcs11-herramienta#
pkcs11-tool es una herramienta que forma parte del proyecto OpenSC y que puede utilizarse para gestionar claves en un dispositivo PKCS#11.
Es necesario pasar la ubicación del módulo PKCS#11 a utilizar con la opción --module
:
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so
Sustituya /usr/lib/nitrokey/libnethsm_pkcs11.so
por la ruta donde se encuentra el módulo PKCS#11 de NetHSM.
Puede comprobar si el módulo funciona con el siguiente comando:
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --show-info
Deberías ver algo como esto:
Cryptoki version 2.40
Manufacturer Nitrokey
Library Nitrokey PKCS#11 library (ver 0.1)
Lista de ranuras#
La información sobre las ranuras disponibles. Las ranuras listadas dependen de la configuración de la matriz de ranuras en el archivo de configuración p11nethsm.conf. Para obtener más información sobre la configuración de las ranuras, consulte el capítulo Configuración <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
Nota
Si su configuración admite más de una ranura, es posible que tenga que añadir la opción --slot <arg>
en los comandos de pkcs11-tool para utilizar la correcta.
Claves de identificación#
pkcs11-tool utiliza un ID de clave hexadecimal para identificar las claves. NetHSM utiliza cadenas alfanuméricas como ID de clave. El módulo PKCS#11 de NetHSM utiliza los valores brutos de bytes de la cadena para formar el ID PKCS#11. Puede obtener la versión hexadecimal de una clave NetHSM con xxd
:
echo -n "MyKey" | xxd -p
4d794b6579
A continuación, puede pasar este valor hexadecimal a pkcs11-tool con la opción --id
.
Generar una clave#
Genera un par de claves y lo almacena en el NetHSM.
Nota
La ranura que desea utilizar necesita tener un usuario andministrator en el archivo de configuración. De lo contrario obtendrá un error 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/Genérica#
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --keygen --key-type AES:256 --label "aeskey"
Lista de claves#
Enumerar las claves almacenadas en el 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
Leer las llaves#
Leer la clave pública de un par de claves almacenado en el NetHSM. No es posible leer claves privadas del NetHSM.
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --read-object --type pubkey --label rsakey --output-file rsakey.pub
El certificado del par de claves puede leerse con el mismo comando cambiando la opción --type
por cert
.
Nota
La salida está en formato DER.
Teclas de escritura#
Escriba una clave privada en el NetHSM. La clave pública se deriva automáticamente de la clave privada.
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --write-object rsakey.key --type privkey --id 7273616b6579
El certificado del par de claves puede escribirse con el mismo comando cambiando la opción --type
por cert
.
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --write-object rsakey.crt --type cert --id 7273616b6579
Cifrar#
El cifrado de datos sólo es compatible con claves AES.
echo "NetHSM rulez! " | pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --encrypt --id 6165736b6579 --mechanism AES_CBC --output-file encrypted.txt
Nota
Hay que ajustar manualmente los datos de entrada al tamaño de bloque de la clave AES.
Descifrar#
AES#
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --decrypt --id 6165736b6579 --mechanism AES_CBC --input-file encrypted.txt
RSA#
Puedes cifrar datos con la clave pública y descifrarlos con la clave privada.
# 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
Firma#
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
Para verificar la firma con 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