Usar una clave de Cloud HSM con OpenSSL

En esta guía se explica cómo configurar OpenSSL para usar una clave de Cloud HSM en Debian 11 (Bullseye). Estas instrucciones se pueden aplicar en general aunque uses otro SO u otro entorno, pero ten en cuenta que puede haber ligeras diferencias.

Requisitos

Descarga una versión de la biblioteca para empezar. Para obtener más información sobre la biblioteca PKCS #11, consulta la guía de usuario.

Antes de empezar, instala el paquete libengine-pkcs11-openssl.

sudo apt-get update
sudo apt-get install libengine-pkcs11-openssl

Configuración

Definir la variable de entorno PKCS11_MODULE_PATH.

Para que openssl use nuestra biblioteca PKCS #11, define la variable de entorno PKCS11_MODULE_PATH:

export PKCS11_MODULE_PATH="/path/to/libkmsp11.so"

Para definir la variable de entorno de forma permanente, añade export PKCS11_MODULE_PATH="/path/to/libkmsp11.so" a /etc/profile ejecutando el siguiente comando:

echo 'export PKCS11_MODULE_PATH="/path/to/libkmsp11.so"' | sudo tee -a /etc/profile

Configuración de la biblioteca PKCS #11

La biblioteca PKCS #11 requiere un archivo de configuración YAML para localizar los recursos de Cloud KMS. El archivo YAML debe configurar al menos un token PKCS #11.

Si usas OpenSSL con otro proceso que pueda bifurcarse (por ejemplo, Apache o Nginx), también debes asegurarte de que el campo refresh_interval_secs no se defina o se defina en 0.

Archivo de configuración de ejemplo:

---
tokens:
  - key_ring: "projects/my-project/locations/us-central1/keyRings/my-keyring"

Con esta configuración, todas las claves de firma y descifrado asimétricas de my-keyring estarán disponibles en la biblioteca.

Debes definir los permisos del archivo de configuración para que solo el propietario del archivo pueda escribir en él. Dirige KMS_PKCS11_CONFIG a tu archivo de configuración:

export KMS_PKCS11_CONFIG="/path/to/pkcs11-config.yaml"

De nuevo, puedes hacer que este ajuste sea permanente añadiéndolo a /etc/profile.

echo 'export KMS_PKCS11_CONFIG="/path/to/pkcs11-config.yaml"' | sudo tee -a /etc/profile

Ejecutar comandos de OpenSSL

Una vez que el motor y la biblioteca estén configurados correctamente, podrá usar el motor en los comandos de OpenSSL.

Cuando crees firmas asimétricas, ten en cuenta que las claves de Cloud KMS solo pueden usar un único resumen. Por ejemplo, un CryptoKeyVersion con el algoritmo EC_SIGN_P256_SHA256 siempre debe usarse junto con un resumen SHA-256. Esto corresponde a la marca -sha256 de OpenSSL. Las claves que requieren resúmenes SHA-384 o SHA-512 deben usarse con las marcas -sha384 o -sha512.

Crear una firma

Si hay una clave llamada foo en el conjunto de claves configurado, usa el siguiente comando para crear una firma en bar.txt:

openssl dgst -sha256 -engine pkcs11 -keyform engine -sign pkcs11:object=foo bar.txt

La salida de este comando es binaria sin formato.

Este comando da por hecho que estás usando una clave que toma un resumen SHA-256, por lo que se ha usado el argumento -sha256. Las opciones -sha384 o -sha512 serían adecuadas para las claves de Cloud HSM que usen esos tipos de digest.

En el caso de las claves RSA-PSS, recuerda usar las opciones -sigopt que hemos comentado anteriormente.

Crear una solicitud de firma de certificado

También puedes generar una solicitud de firma de certificado (CSR) para una clave de firma de Cloud HSM. Esto es útil si tu autoridad de certificación requiere una CSR para generar un nuevo certificado de firma de código o para proteger las sesiones web TLS.

openssl req -new -subj '/CN=test/' -sha256 -engine pkcs11 \
  -keyform engine -key pkcs11:object=foo > my-request.csr

Generar un nuevo certificado autofirmado

Para el desarrollo y las pruebas locales, puedes usar un certificado autofirmado para una clave de firma de Cloud HSM. Los certificados autofirmados también son útiles para firmar tokens SAML.

openssl req -new -x509 -days 3650 -subj '/CN=test/' -sha256 -engine pkcs11 \
  -keyform engine -key pkcs11:object=foo > my-request.crt

Solucionar problemas con PKCS #11 Spy

PKCS #11 Spy es una herramienta de código abierto que registra el contenido de las interacciones a través de una interfaz PKCS #11. Para ello, se coloca entre la aplicación y la biblioteca PKCS #11, y registra todas las llamadas que se realizan. Esto puede ser útil para solucionar problemas.

Para usar PKCS #11 Spy, debes tener instalado el paquete opensc. El paquete opensc contiene PKCS #11 Spy. Para asegurarte de que opensc está instalado, ejecuta el siguiente comando:

sudo apt-get install opensc

A continuación, define la variable de entorno PKCS11_MODULE_PATH para que OpenSSL apunte a la biblioteca PKCS #11 Spy ejecutando el siguiente comando:

export PKCS11_MODULE_PATH=/usr/lib/x86_64-linux-gnu/pkcs11-spy.so

Por último, apunta PKCS #11 Spy a la biblioteca PKCS #11 de Cloud HSM configurando las variables de entorno PKCS11SPY y PKCS11SPY_OUTPUT. Para definir estas variables de entorno, ejecuta los siguientes comandos:

export PKCS11SPY="/path/to/libkmsp11.so"
# Optional, stderr will be used for logging if not set
export PKCS11SPY_OUTPUT="/path/to/pkcs11-spy.log"