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 <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