Usar el proveedor de CNG y SignTool para firmar artefactos de Windows

En esta guía se explica cómo crear una clave de Cloud HSM para la firma de Microsoft Authenticode a través de nuestro proveedor de CNG y SignTool.

Puedes encontrar una versión de este tutorial basada en Terraform en el repositorio de GitHub kms-solutions.

Casos prácticos

El flujo de trabajo descrito en este documento ayuda a abordar las siguientes necesidades de seguridad empresarial:

  • Firmar el firmware con una clave privada protegida por un HSM con certificación FIPS 140-2 de nivel 3.
  • Firma artefactos de Windows con la herramienta estándar SignTool de Windows.

Antes de empezar

Para completar este tutorial, necesitas lo siguiente:

  • Un equipo Windows con los artefactos que quieras firmar.
  • La última versión del proveedor de CNG de Cloud KMS, que se puede instalar en tu máquina Windows con el instalador .msi incluido.
  • Cloud Shell o tu propia máquina Linux para generar una solicitud de firma de certificado o un certificado. En esta máquina, completa la configuración que se describe en Configuración de OpenSSL para descargar y configurar nuestra biblioteca PKCS#11.

Recuerda ejecutar gcloud auth application-default login si aún no lo has hecho.

Si aún no lo has hecho, descarga el SDK de Windows más reciente en tu máquina Windows, que incluye SignTool.

Configuración

Crear una clave de firma alojada en Cloud KMS

En Cloud Shell o en tu propia máquina, crea un conjunto de claves de Cloud KMS en tu proyecto Google Cloud con el siguiente comando:

gcloud kms keyrings create "KEY_RING" --location "LOCATION"

A continuación, crea una EC-P256-SHA256clave de firma de hardwareGoogle Cloud de Cloud KMS en tu proyecto, en el conjunto de claves que acabas de crear:

gcloud kms keys create "KEY_NAME" --keyring "KEY_RING" \
  --project "PROJECT_ID" --location "LOCATION" \
  --purpose "asymmetric-signing" --default-algorithm "ec-sign-p256-sha256" \
  --protection-level "hsm"

Descargar la atestación del HSM

Una atestación de HSM es una prueba de que tu clave reside en un HSM. Es posible que tu autoridad de certificación (CA) te pida esta prueba para emitir un certificado de validación ampliada (VA).

Para descargar la atestación de HSM asociada a tu clave de Cloud KMS, sigue estos pasos:

  1. En la consola de Google Cloud , ve a la página Gestión de claves.

    Ir a Administración de claves

  2. Seleccione el llavero que contenga la clave que quiera certificar y, a continuación, seleccione la clave.

  3. Haga clic en Más en la versión de la clave que quiera verificar y, a continuación, haga clic en Verificar atestación.

  4. En el cuadro de diálogo Verificar atestación, haz clic en Descargar paquete de atestación. Se descargará un archivo ZIP que contiene las cadenas de certificación y atestación.

Consulta Analizar la certificación para obtener instrucciones completas sobre cómo verificar la certificación descargada.

Crear un certificado autofirmado con OpenSSL

Este paso es opcional, pero te ayuda a familiarizarte con los pasos posteriores antes de llevar a cabo el proceso y el gasto de comprar un certificado firmado por una autoridad de certificación.

Con Cloud Shell o tu propia máquina, genera un certificado autofirmado con la clave de firma alojada en Cloud KMS. Puedes usar OpenSSL para usar un URI PKCS #11 en lugar de una ruta de archivo e identificar la clave por su etiqueta. En la biblioteca PKCS #11 de Cloud KMS, la etiqueta de la clave equivale al nombre de CryptoKey.

openssl req -new -x509 -days 3650 -subj '/CN=test/' -sha256 -engine pkcs11 \
  -keyform engine -key pkcs11:object=KEY_NAME > ca.cert

Si este comando falla, es posible que PKCS11_MODULE_PATH se haya configurado de forma incorrecta o que no tengas los permisos adecuados para usar la clave de firma de Cloud KMS.

Ahora debería tener un certificado con este aspecto:

-----BEGIN CERTIFICATE-----
...
...
...
-----END CERTIFICATE-----

Copia el certificado en tu máquina Windows para poder usarlo con SignTool y firmar tus artefactos.

Crear una solicitud de firma de certificado

Puedes generar una solicitud de firma de certificado (CSR) para una clave de firma de Cloud HSM. Sigue estos pasos si tu autoridad de certificación requiere una CSR para generar un nuevo certificado de firma de código.

En Cloud Shell o en tu propia máquina, ejecuta el siguiente comando:

openssl req -new -subj '/CN=CERTIFICATE_NAME/' DIGEST_FLAG \
  -engine pkcs11 -keyform engine \
  -key pkcs11:id=KEY_ID > REQUEST_NAME.csr

Haz los cambios siguientes:

  • CERTIFICATE_NAME: el nombre del certificado que quieras generar.
  • DIGEST_FLAG: una marca que indica el tipo de resumen. Usa -sha256, -sha384 o -sha512 en función del algoritmo de la clave.
  • KEY_ID: el ID de recurso completo de una versión de clave de firma asimétrica. Por ejemplo, projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1.
  • REQUEST_NAME: un nombre para la solicitud de firma del certificado.

Asegúrate de usar las opciones de -sigopt correctas para el tipo de clave que estés usando.

No puedes usar un ID de objeto de más de 100 caracteres con OpenSSL. Usa nombres cortos para KeyRing y CryptoKey, o bien usa pkcs11:object=KEY_NAME. Para obtener más información sobre el límite de ID de objeto de OpenSSL, consulta el problema relacionado en GitHub.

Ahora que tienes tu CSR, puedes proporcionárselo a tu autoridad de certificación para obtener el certificado de firma. Usa el certificado proporcionado por tu AC en la siguiente sección.

Firmar un artefacto con SignTool

Ahora que has creado un certificado (autofirmado u obtenido de la autoridad de certificación) y lo has copiado en tu máquina Windows, puedes usarlo para firmar un artefacto de Windows.

Usa SignTool para firmar los artefactos con tu clave de Cloud KMS y tu certificado.

"PATH_TO_SIGNTOOL.EXE" sign ^
  /v /debug /fd sha256 /t http://timestamp.digicert.com ^
  /f PATH_TO_CA.CERT ^
  /csp "Google Cloud KMS Provider" ^
  /kc projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1 ^
  PATH_TO_ARTIFACT_TO_SIGN

Haz los cambios siguientes:

  • PATH_TO_SIGNTOOL.EXE: la ruta a signtool.exe (por ejemplo, C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.19041.0\\x64\\signtool.exe).
  • PATH_TO_CA.CERT: la ruta a tu certificado ca.cert.
  • PATH_TO_ARTIFACT_TO_SIGN: la ruta al artefacto que quieres firmar.

Para obtener una explicación detallada de cada opción de comando y de los formatos de archivo de artefacto admitidos, consulta la documentación oficial de SignTool.