Utiliser le fournisseur CNG et SignTool pour signer des artefacts Windows

Ce guide explique comment créer une clé Cloud HSM pour la signature Microsoft Authenticode via notre fournisseur CNG et SignTool.

Vous trouverez une version de ce tutoriel basée sur un plan Terraform dans le dépôt GitHub kms-solutions.

Cas d'utilisation

Le workflow décrit dans ce document permet de répondre aux besoins de sécurité des entreprises suivants:

  • Signez le micrologiciel avec une clé privée protégée par un HSM FIPS 140-2 de niveau 3.
  • Signez les artefacts Windows à l'aide de l'outil SignTool standard de Windows.

Avant de commencer

Pour suivre ce tutoriel, vous avez besoin des éléments suivants:

  • Une machine Windows avec les artefacts que vous souhaitez signer.
  • La dernière version du fournisseur CNG Cloud KMS, qui peut être installée sur votre machine Windows à l'aide de l'installateur .msi inclus.
  • Cloud Shell ou votre propre machine Linux pour générer une demande de signature de certificat ou un certificat. Sur cette machine, terminez la configuration décrite dans la section Configuration d'OpenSSL pour télécharger et configurer notre bibliothèque PKCS#11.

N'oubliez pas d'exécuter gcloud auth application-default login si ce n'est pas déjà fait.

Si vous ne l'avez pas déjà fait, téléchargez la dernière version du SDK Windows sur votre ordinateur Windows, qui inclut SignTool.

Configuration

Créer une clé de signature hébergée par Cloud KMS

À l'aide de Cloud Shell ou de votre propre machine, créez un trousseau de clés Cloud KMS dans votre projet Google Cloud à l'aide de la commande suivante:

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

Ensuite, créez une clé de signature matérielle EC-P256-SHA256 Cloud KMS dans votre projetGoogle Cloud , dans le trousseau de clés que vous venez de créer:

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"

Télécharger l'attestation HSM

Une attestation HSM est la preuve que votre clé réside dans un HSM. Cette preuve peut être requise par votre autorité de certification (CA) pour émettre un certificat de validation étendue (EV).

Pour télécharger l'attestation HSM associée à votre clé Cloud KMS, procédez comme suit:

  1. Dans la console Google Cloud, accédez à la page Gestion des clés.

    Accéder à Key Management

  2. Sélectionnez le trousseau de clés contenant la clé que vous souhaitez attester, puis sélectionnez la clé.

  3. Cliquez sur Plus pour obtenir la version de clé que vous souhaitez attester, puis sur Valider l'attestation.

  4. Dans la boîte de dialogue Valider l'attestation, cliquez sur Télécharger le groupe d'attestations. Un fichier ZIP contenant les chaînes d'attestation et de certificat est alors téléchargé.

Pour obtenir des instructions détaillées sur la validation de l'attestation téléchargée, consultez la section Analyser l'attestation.

Créer un certificat autosigné avec OpenSSL

Cette étape est facultative, mais elle vous permet de vous familiariser avec les étapes suivantes avant de passer par la procédure et les dépenses d'achat d'un certificat signé par une autorité de certification.

À l'aide de Cloud Shell ou de votre propre machine, générez un certificat autosigné avec la clé de signature hébergée par Cloud KMS. Vous pouvez utiliser OpenSSL pour utiliser un URI PKCS #11 au lieu d'un chemin de fichier et identifier la clé par son libellé. Dans la bibliothèque PKCS #11 Cloud KMS, le libellé de clé équivaut au nom 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 cette commande échoue, il est possible que PKCS11_MODULE_PATH ait été défini de manière incorrecte ou que vous ne disposiez pas des autorisations nécessaires pour utiliser la clé de signature Cloud KMS.

Vous devriez maintenant avoir un certificat semblable à celui-ci :

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

Copiez le certificat sur votre ordinateur Windows afin de pouvoir l'utiliser avec SignTool pour signer vos artefacts.

Créer une nouvelle requête de signature de certificat

Vous pouvez générer une demande de signature de certificat (CSR) pour une clé de signature Cloud HSM. Suivez ces étapes si votre autorité de certification exige une demande de signature de certificat afin de générer un nouveau certificat pour la signature du code.

À l'aide de Cloud Shell ou de votre propre machine, exécutez la commande suivante:

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

Remplacez les éléments suivants :

  • CERTIFICATE_NAME: nom du certificat que vous souhaitez générer.
  • DIGEST_FLAG: indicateur indiquant le type de récapitulatif. Utilisez -sha256, -sha384 ou -sha512, en fonction de l'algorithme de la clé.
  • KEY_ID: ID de ressource complet d'une version de clé de signature asymétrique (par exemple, projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1).
  • REQUEST_NAME: nom de la demande de signature de certificat.

Assurez-vous d'utiliser les options -sigopt appropriées pour le type de clé que vous utilisez.

Vous ne pouvez pas utiliser d'ID d'objet de plus de 100 caractères avec OpenSSL. Utilisez des noms KeyRing et CryptoKey courts, ou utilisez pkcs11:object=KEY_NAME à la place. Pour en savoir plus sur la limite d'ID d'objet OpenSSL, consultez le problème associé sur GitHub.

Maintenant que vous disposez de votre requête de signature de certificat, vous pouvez la fournir à votre autorité de certification (CA) pour obtenir le certificat de signature. Utilisez le certificat fourni par votre autorité de certification dans la section suivante.

Signer un artefact avec SignTool

Maintenant que vous avez créé un certificat (autosigné ou obtenu auprès de l'autorité de certification) et l'avez copié sur votre ordinateur Windows, vous pouvez l'utiliser pour signer un artefact Windows.

Utilisez SignTool pour signer les artefacts à l'aide de votre clé Cloud KMS et de votre certificat.

"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

Remplacez les éléments suivants :

  • PATH_TO_SIGNTOOL.EXE: chemin d'accès à signtool.exe (par exemple, C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.19041.0\\x64\\signtool.exe).
  • PATH_TO_CA.CERT: chemin d'accès à votre certificat ca.cert.
  • PATH_TO_ARTIFACT_TO_SIGN: chemin d'accès à l'artefact que vous souhaitez signer.

Pour une explication détaillée de chaque option de commande et des formats de fichier d'artefact compatibles, consultez la documentation officielle de SignTool.