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

En esta guía, se proporcionan instrucciones para crear una clave de Cloud HSM para Microsoft Firma de Authenticode a través de nuestro proveedor de CNG y SignTool.

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

Casos de uso

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

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

Antes de comenzar

Para completar este instructivo, necesitas lo siguiente:

  • Una máquina Windows con los artefactos que deseas firmar
  • La versión más reciente 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 documentada 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 hiciste.

Si todavía no lo hiciste, descarga el SDK de Windows más reciente en tu máquina de Windows, con SignTool.

Configuración

Crea una clave de firma alojada en Cloud KMS

Usa Cloud Shell o tu propia máquina para crear un Cloud KMS. el llavero de claves en tu proyecto de Google Cloud con el siguiente comando:

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

Luego, crea una clave de firma de hardware EC-P256-SHA256 de Cloud KMS en tu proyecto de Google Cloud, en el llavero 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"

Descarga la certificación de HSM

Una certificación de HSM es la prueba de que tu clave reside en un HSM. Esta prueba podría ser exigidos por tu autoridad certificadora (AC) para emitir una validación extendida (VE) certificado.

Para descargar la certificación de HSM asociada con tu clave de Cloud KMS, completa los siguientes pasos:

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

    Ir a Key Management

  2. Selecciona el llavero de claves que contiene la clave que quieres certificar y, luego, selecciona la clave.

  3. Haz clic en Más . para la versión de clave que quieres certificar y, luego, haz clic en Verificar certificación.

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

Consulta Analiza la certificación para obtener instrucciones completas sobre cómo verificarás la certificación descargada.

Crea un certificado autofirmado con OpenSSL

Este paso es opcional, pero te ayuda a familiarizarte con los pasos posteriores antes de realizar el proceso y el gasto de comprar un certificado firmado por una AC.

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 utilizar un PKCS #11 URI en lugar de una ruta de acceso al archivo e identifica la clave por su etiqueta. En la PKCS #11 de Cloud KMS, la etiqueta de la clave es equivalente al Nombre de la 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. es posible que no tengas los permisos adecuados para usar Cloud KMS clave de firma de Google.

Ahora debería tener un certificado que se vea así:

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

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

Crea una solicitud de firma de certificado nueva

Puedes generar una solicitud de firma de certificado (CSR) para un Cloud HSM. clave de firma de Google. Completa estos pasos si tu autoridad certificadora requiere una CSR para generar un certificado nuevo para la firma de código.

Con Cloud Shell o 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

Reemplaza lo siguiente:

  • CERTIFICATE_NAME: Es un nombre para el certificado que queremos generar.
  • DIGEST_FLAG: Es una marca que indica el tipo de resumen. Usa -sha256, -sha384 o -sha512, según el algoritmo de la clave.
  • KEY_ID: Es el ID de recurso completamente calificado de un objeto asimétrico. versión de la clave de firma, por ejemplo, projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1
  • REQUEST_NAME: Es un nombre para la solicitud de firma de certificado.

Asegúrate de usar las opciones de -sigopt correctas para el tipo de llave que quieres usan.

No puedes usar un ID de objeto de más de 100 caracteres con OpenSSL. Usar corta Nombres KeyRing y CryptoKey, o bien usa pkcs11:object=KEY_NAME en su lugar. 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 proporcionarla a tu certificado Autoridad (AC) para obtener el certificado de firma. Usa el certificado proporcionado por tu AC en la siguiente sección.

Firma un artefacto con SignTool

Ahora que creaste correctamente un certificado (ya sea autofirmado o obtenido de la autoridad certificadora) y lo copió en su máquina Windows puedes usarlo para firmar artefactos 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

Reemplaza lo siguiente:

  • PATH_TO_SIGNTOOL.EXE: La ruta de acceso a signtool.exe (p. ej., C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.19041.0\\x64\\signtool.exe).
  • PATH_TO_CA.CERT: Es la ruta de acceso al certificado ca.cert.
  • PATH_TO_ARTIFACT_TO_SIGN: La ruta de acceso al artefacto que deseas firmar.

Para obtener una explicación detallada de cada opción de comando y archivo de artefactos compatible consulta la documentación oficial de SignTool.