PKCS#11 con pkcs11-tool#

Esta guía describe el uso del controlador PKCS#11 para el NetHSM. La guía utiliza herramientas de OpenSC. Consulte su documentación para aprender a utilizarlas en su sistema operativo.

Importante

Este controlador es todavía una implementación de prueba de concepto temprana que sólo implementa las funciones necesarias para operar servidores TLS.

Instalación#

Instalar la biblioteca precompilada#

  1. Descargue un archivo con la última versión desde la página de versiones ` <https://github.com/Nitrokey/nethsm-pkcs11/releases>` __ del repositorio. Utilice el archivo de la versión que contenga el nombre de su sistema operativo en el título.

  2. Extraiga los ficheros del archivo descargado con un programa de archivado de su elección.

  3. Copie la biblioteca extraída en la ruta correspondiente de su sistema operativo. La ruta depende de su instalación y configuración de OpenSC.

Compilar desde el código fuente#

Importante

Este controlador sólo se puede compilar con el compilador Go oficial. No utilice el compilador GNU Go (GCC-Go). Por favor, consulte su sitio web ` <https://go.dev/doc/install>` __ para aprender a instalarlo.

  1. Descargue un archivo con la última versión desde la página releases del repositorio. Utilice el archivo de la versión que contenga Código fuente en el título.

  2. Extraiga los ficheros del archivo descargado con un programa de archivado de su elección.

  3. En el directorio con el código fuente extraído ejecute el siguiente comando para compilar la biblioteca.

    ./build.sh
    
  4. Copie la biblioteca extraída en la ruta correspondiente de su sistema operativo. La ruta depende de su instalación y configuración de OpenSC.

Configuración#

El archivo de configuración p11nethsm.conf es necesario y se utiliza para configurar la conexión entre el controlador PKCS#11 y el NetHSM.

Un ejemplo de archivo de configuración tiene el siguiente aspecto.

YAML 1.1
---
p11nethsm:
  logfile: /tmp/p11nethsm.log
  maxsessioncount: 5
  debug: true
  slots:
  - label: NetHSM1
    description: NetHSM Zone A
    url: "https://nethsmdemo.nitrokey.com/api/v1"
    # certSHA256:
    #   - "0C:66:DC:EB:4D:12:C3:24:FC:82:F4:1D:4C:16:44:12:1D:00:79:FF:36:96:65:E2:21:C4:36:94:F7:8E:22:89"
    user: "operator"
    password: "env:NETHSM_PASS"

Modifique el archivo de configuración p11nethsm.conf según su entorno.

El archivo de configuración puede incluir múltiples ranuras, dentro de la matriz slots. Las ranuras representan múltiples despliegues de NetHSM. El campo label de una ranura debe contener un nombre único. Las claves url, user y password son obligatorias. Por razones de seguridad se recomienda pasar la contraseña en una variable de entorno. Para ello se pasa env:NETHSM_PASS en la clave password, donde NETHSM_PASS es el nombre de la variable de entorno que contiene la contraseña. La clave certSHA256 debe ser establecida si el certificado TLS no está firmado por una Autoridad de Certificación (CA) contenida en el almacén de certificados del sistema operativo.

El archivo de configuración debe guardarse en las siguientes rutas o en el directorio donde se ejecuta la aplicación.

  • $HOME/.nitrokey

  • /etc/nitrokey/

Gestión de claves#

Información#

Muestra información sobre la versión de cryptoki, y el controlador PKCS#11.

$ pkcs11-tool --module p11nethsm.so --show-info
Cryptoki version 2.40
Manufacturer     Nitrokey GmbH
Library          NetHSM PKCS#11 module (ver 0.1)
Using slot 0 with a present token (0x0)

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 saber más sobre la configuración de las ranuras, consulte el capítulo Configuración <pkcs11_with_pkcs11-tool.html#configuration>`_.

$ pkcs11-tool --module p11nethsm.so --list-slots
Available slots:
Slot 0 (0x0): NetHSM Zone A
  token label        : NetHSM1
  token manufacturer : Nitrokey GmbH
  token model        : NetHSM
  token flags        : rng, token initialized, PIN initialized, readonly
  hardware version   : 0.1
  firmware version   : 0.1
  serial num         : 0
  pin min/max        : 3/256

Nota

Si su configuración admite más de una ranura, tal vez tenga que añadir la opción –slot <arg> en los comandos de pkcs11-tool para utilizar la correcta.

Generar claves#

Genera un par de claves y lo almacena en el NetHSM.

Nota

El controlador PKCS#11 actualmente no soporta esta característica. Se puede generar un par de claves con nitropy o con una solicitud de la API REST. Para saber más sobre cómo generar una clave, consulte el capítulo Generar clave.

Lista de claves#

Muestra información sobre las claves y certificados en el Key Store en un NetHSM.

$ pkcs11-tool --module p11nethsm.so --list-objects
Using slot 0 with a present token (0x0)
Private Key Object; RSA
  label:      myFirstKey
  ID:         6d7946697273744b6579
  Usage:      decrypt, sign
  Access:     sensitive, always sensitive, never extractable
Public Key Object; RSA 0 bits
  label:      myFirstKey
  ID:         6d7946697273744b6579
  Usage:      none
  Access:     none

Leer las llaves#

Leer claves y certificados del Key Store en un NetHSM. No es posible leer claves privadas desde el NetHSM.

La clave pública de un par de claves puede leerse como sigue.

$ pkcs11-tool --module p11nethsm.so --read-object --type pubkey --label myFirstKey -o public.key

El certificado de un par de claves puede leerse como sigue.

$ pkcs11-tool --module p11nethsm.so --read-object --type cert --label myFirstKey -o public.key

Los certificados o claves públicas devueltos están codificados en ASN.1. Los datos pueden descodificarse con la herramienta dumpasn1, ya que contienen datos en formato DER. El formato DER se puede convertir a formato PEM con OpenSSL.

Teclas de escritura#

Escriba claves y certificados en el Key Store en un NetHSM.

La clave privada de un par de claves puede escribirse como sigue.

$ pkcs11-tool --module p11nethsm.so --write-object secret.key --type privkey --label myFirstKey

La clave pública de un par de claves puede escribirse como sigue.

$ pkcs11-tool --module p11nethsm.so --write-object public.key --type pubkey --label myFirstKey

El certificado de un par de claves puede escribirse como sigue.

$ pkcs11-tool --module p11nethsm.so --write-object cert.pub --type cert --label myFirstKey

Operaciones clave#

Cifrar#

El NetHSM no puede cifrar datos con claves asimétricas, pero proporciona la clave pública que puede utilizarse para el cifrado. Consulte el capítulo Mostrar detalles de la clave, o recupere la clave como se describe en el capítulo Leer claves <pkcs11_con_pkcs11.html#read-keys>, para saber más sobre cómo recuperar la clave pública. El ejemplo asume la clave pública en el archivo public.pem.

Los datos pueden ser encriptados con OpenSSL de la siguiente manera.

$ echo 'NetHSM rulez!' | openssl pkeyutl -encrypt -pubin \
   -inkey public.pem \
   -pkeyopt rsa_padding_mode:oaep \
   -pkeyopt rsa_oaep_md:sha512 \
   -pkeyopt rsa_mgf1_md:sha512 \
   -out encrypted.data

Descifrar#

El NetHSM puede descifrar los datos de una clave privada almacenada en el Key Store en el NetHSM. Este ejemplo utiliza el mensaje cifrado del capítulo anterior Cifrar.

$ pkcs11-tool --module p11nethsm.so --decrypt \
   --mechanism RSA-PKCS-OAEP \
   --input-file encrypted.data \
   --label myFirstKey \
   --hash-algorithm SHA512
NetHSM rulez!

Firma#

El NetHSM puede firmar datos para una clave privada almacenada en el almacenamiento de claves del NetHSM. Para las firmas con una clave RSA y ECDSA, se debe calcular primero un compendio.

Para calcular un compendio se necesitan primero los datos. Se crea un mensaje de la siguiente manera.

$ echo 'NetHSM rulez!' | pkcs11-tool --module p11nethsm.so \
   --sign \
   --mechanism SHA512-RSA-PKCS-PSS \
   --output-file sig.data \
   --label myFirstKey

La firma creada puede ser verificada con OpenSSL de la siguiente manera.

$ echo 'NetHSM rulez!' | openssl dgst -keyform PEM \
   -verify public.pem \
   -sha512 \
   -sigopt rsa_padding_mode:pss \
   -sigopt rsa_pss_saltlen:-1 \
   -signature sig.data