En esta guía, se proporcionan instrucciones para 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 instructivo basada en un modelo de Terraform en el repositorio de GitHub de kms-solutions.
Casos de uso
El flujo de trabajo que se describe en este documento ayuda a abordar las siguientes necesidades de seguridad de la empresa:
- Firma el firmware con una clave privada protegida por un HSM de nivel 3 del estándar FIPS 140-2.
- Firma 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 con 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 has hecho.
Si aún no lo hiciste, descarga el SDK de Windows más reciente en tu máquina con Windows, que incluye SignTool.
Configuración
Crea una clave de firma alojada en Cloud KMS
Con Cloud Shell o tu propia máquina, crea un llavero de Cloud KMS 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 deGoogle 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 del HSM
Una certificación de HSM es una prueba de que tu clave reside en un HSM. Es posible que tu autoridad certificadora (AC) requiera esta prueba para emitir un certificado de validación extendida (EV).
Para descargar la certificación de HSM asociada con tu clave de Cloud KMS, completa los siguientes pasos:
En la consola de Google Cloud, ve a la página Administración de claves.
Selecciona el llavero de claves que contiene la clave que deseas certificar y, luego, selecciona la clave.
Haz clic en Más more_vert para la versión de clave que deseas certificar y, luego, en Verificar certificación.
En el diálogo Verificar certificación, haz clic en Descargar paquete de certificación. Esta acción descarga un archivo ZIP que contiene las cadenas de certificación y de certificados.
Consulta Cómo analizar la certificación para obtener instrucciones completas sobre cómo verificar 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 usar un URI PKCS #11 en lugar de una ruta de acceso de archivo y así identificar la clave por su etiqueta. En la biblioteca PKCS #11 de Cloud KMS, la etiqueta de 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 que se vea así:
-----BEGIN CERTIFICATE-----
...
...
...
-----END CERTIFICATE-----
Copia el certificado en tu máquina con Windows para que puedas usarlo con SignTool y firmar tus artefactos.
Crea una solicitud de firma de certificado nueva
Puedes generar una solicitud de firma de certificado (CSR) para una clave de firma de Cloud HSM. Completa estos pasos si tu autoridad certificadora requiere una CSR para generar un certificado nuevo para la 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
Reemplaza lo siguiente:
CERTIFICATE_NAME
: Es un nombre para el certificado que deseas 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
: El ID de recurso completamente calificado 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
: Es un nombre para la solicitud de firma de certificado.
Asegúrate de usar las opciones de -sigopt
correctas para el tipo de clave que usas.
No puedes usar un ID de objeto de más de 100 caracteres con OpenSSL. Usa nombres cortos para KeyRing
y CryptoKey
, o 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 autoridad certificadora (AC) para obtener el certificado de firma. Usa el certificado que proporcionó tu AC en la siguiente sección.
Firma un artefacto con SignTool
Ahora que creaste correctamente un certificado (autofirmado o obtenido de la AC) y lo copiaste a tu máquina de 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
Reemplaza lo siguiente:
PATH_TO_SIGNTOOL.EXE
: La ruta de acceso asigntool.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 a tu certificadoca.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 los formatos de archivo de artefactos compatibles, consulta la documentación oficial de SignTool.