Signature de code avec Google Cloud KMS
Le service Google Cloud KMS vous offre l'accès à un HSM cloud certifié FIPS 140-2 Niveau 3, garantissant une sécurité optimale. Il vous permet de signer du code de manière sécurisée et rapide, où que vous soyez. De plus, les coûts par nombre d'opérations (signatures) sont très compétitifs. Cloud KMS prend également en charge les signatures via Microsoft Cryptography API: Next Generation (CNG), assurant une intégration fluide et conforme.
Pour configurer et signer du code, il faut suivre les étapes suivantes que nous examinerons étape par étape :
- Installez le CNG provider
- Créez un Key Ring et une clé privée
- Créez un CSR et obtenez un certificat
- Signez votre artefact
Téléchargez le CNG provider et les paquets
Le provider CNG a été publié par Google dans son dépôt sur GitHub. Ces fichiers peuvent être installés sur votre système Windows à l'aide du fichier d'installation .msi. Ce programme nécessite une configuration via un fichier YAML, que vous pouvez trouver dans ce guide.
Nous vous recommandons de créer la clé privée et la requête CSR sur un système Linux (vous pouvez utiliser WSL sous Windows). Bien qu'il soit possible d'installer OpenSSL dans PowerShell sur Windows, vous rencontrerez probablement moins de complications sous Linux. Cette approche est également recommandé dans le guide officiel de Google.
Pour communiquer avec le cloud, nous utiliserons l'application gcloud du paquet google-cloud-cli.
Créez un Key Ring et une clé privée dans Cloud HSM
Les étapes suivantes doivent être effectuées sous Linux. Créez un nouveau Key Ring (anneau de clés) pour l'API Cloud Key Management Service (KMS) et créez-y une clé privée qui est protégée par Cloud HSM. Sélectionnez l'algorithme RSA asymétrique pour la signature avec une taille de clé de 3072b, car SignTool ne peut pas utiliser les clés EC en combinaison avec Google Cloud KMS CNG.
Tout d'abord, connectez-vous à votre compte Google sous Linux et autorisez la session (cela fonctionne aussi pour Windows PowerShell) :
gcloud auth application-default login
Voici comment créer un Key Ring pour placer la clé privée:
gcloud kms keyrings create KEYRING-NAME \
--location=europe-west3 \
--project=PROJECT-NAME
Placez la clé privée dans ce Key Ring. Nous la générerons également à l'aide de l'utilitaire gcloud; complétez les noms (en majuscules) selon la réalité (nom du projet dans GCP) et votre dénomination.
gcloud kms keys create KEY-NAME --keyring=KEYRING-NAME --location=europe-west3 --purpose=asymmetric-signing --protection-level=hsm --default-algorithm=rsa-sign-pkcs1-3072-sha256 --project=PROJECT-NAME
Une fois que vous aurez créé la première version de la clé, nous recommandons d'aller dans le détail et copier son nom de ressource depuis la Cloud Console, car vous aurez besoin de cette information pour le KEY_ID. Il ressemble à ceci : projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1
Revenez maintenant sur Windows, où il sera nécessaire de créer encore un fichier config.yaml avec la configuration pour l'intégration KMS. Dans le PowerShell, entrez le suivant :
$yaml = @"
resources:
- crypto_key_version: "projects/PROJECT-NAME/locations/europe-west3/keyRings/KEYRING-NAME/cryptoKeys/KEY-NAME/cryptoKeyVersions/1"
"@
$yaml = $yaml -replace "`t"," "
$utf8NoBom = New-Object System.Text.UTF8Encoding($false)
[System.IO.File]::WriteAllText('C:\Windows\KMSCNG\config.yaml', $yaml, $utf8NoBom)
Création de la CSR
Il n'est naturellement pas possible d'importer un certificat avec une clé privée dans le HSM, tout comme il n'est pas possible de l'exporter. La clé privée et la CSR doivent donc être créés dans le HSM, et vous passez ensuite la CSR à SSLmarket pour qu'elle soit signé par DigiCert. L'importation du certificat émis est dans l'étape suivante.
Il est préférable de créer la CSR sur Linux, à l'aide de la bibliothèque libengine-pkcs11-openssl, libkmsp11 et de l'API. Bien sûr, vous aurez aussi besoin du paquet google-cloud-cli.
La création de la CSR ressemble à ceci (après pkcs11:object=, complétez le nom de la clé (CryptoKey) selon GCP) :
openssl req -new \
-subj "/C=CZ/O=ZONER /CN=ZONER" \
-sha256 -engine pkcs11 -keyform engine \
-key "pkcs11:object=KEY_NAME;type=private" \
-reqexts v3_req -config <(cat /etc/ssl/openssl.cnf; printf "\n[v3_req]\nextendedKeyUsage=codeSigning\n") \
-out cs-request.csr
La demande CSR pour DigiCert sera dans le fichier cs-request.csr dans le dossier où vous travaillez actuellement. Envoyez-nous cette CSR.
Obtention du certificat
Faites signer la CSR créé par DigiCert et vous recevrez un nouveau certificat Code Signing. Vous n'avez pas besoin de l'insérer dans Google Cloud Console, il suffit d'y avoir la clé privée. Nous travaillerons localement avec le certificat sur Windows, enregistrez-le quelque part sur votre disque en tant que fichier.
Signez vos artefacts
Continuons sur Windows. Depuis 2024, Google a publié le Cloud KMS CNG Provider, qui s'enregistre dans Windows en tant que Crypto Service Provider (CSP) / Key Storage Provider (KSP) sous le nom de Google Cloud KMS Provider. Grâce à cela, SignTool peut utiliser les clés dans le cloud et elles n'ont pas besoin d'être uniquement localement sur un token.
Nous signerons à l'aide de SignTool de Windows SDK, de la version x64 ; nous vous recommandons la version la plus récente. Assurez-vous que vous entrez les bons paramètres (voir explications sous l'exemple).
Exemple de signature à l'aide de SignTool et PowerShell :
& $SignTool sign `
/v /debug `
/fd sha256 /td sha256 `
/tr http://timestamp.digicert.com `
/f "PATH_TO_CERT" `
/csp "Google Cloud KMS Provider" `
/kc "projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1" `
"PATH_TO_FILE_TO_SIGN"
Explications :
- /f PATH_TO_CERT est le chemin vers le fichier contenant le certificat de signature de code (la partie publique). Ce fichier consolidé est crée chez nous et si vous sélectionnez la méthode de stockage HSM, vous le recevrez à votre email.
- /csp détermine le CNG provider, car il peut y en avoir plusieurs sous Windows. Google Cloud KMS Provider est enregistré comme par exemple « Microsoft Software Key Storage Provider ».
- /kc (Key Container) est le chemin vers la clé et sa version (KMS CryptoKeyVersion), correspondant à KEY_ID déjà mentionné.
Lors de la signature, vous verrez quel certificat a été choisi pour la signature et le résultat. Étant donné que SignTool a un problème avec la liaison du certificat à la clé privée dans le cloud (via CSP/KSP), nous recommandons d'avoir le certificat enregistré localement dans un fichier. La sélection par nom d'organisation ou hachage SHA1 du certificat est problématique et souvent non fonctionnelle ; seul le certificat dans un fichier fonctionne.
The following certificate was selected :
Issued to : ZONER a.s.
Issued by : DigiCert Trusted G4 Code Signing RSA4096 SHA384 2021 CA1
Expires : Wed Nov 12 01:59:59 2025
SHA1 hash : F9BC96AC1764AD9F2072780FFB64940538A3B292
The following additional certificates will be attached :
Issued to : DigiCert Trusted G4 Code Signing RSA4096 SHA384 2021 CA1
Issued by : DigiCert Trusted Root G4
Expires : Tue Apr 29 01:59:59 2036
SHA1 hash : 7B0F360B775F76C94A12CA48445AA2D2A875701C
Done Adding Additional Store
Successfully signed : C:\Users\jindrich.zechmeister\HelloSign.exe
Number of files successfully Signed : 1
Number of warnings : 0
Number of errors : 0
Bonus - vérification de la signature
Nous pouvons vérifier le nouveau signature numérique créée avec SignTool.
PS C:\Users\jindrich.zechmeister> signtool verify /pa c:\Users\jindrich.zechmeister\App.exe
File: c:\Users\jindrich.zechmeister\App.exe
Index Algorithm Timestamp
========================================
0 sha256 RFC3161
Successfully verified: c:\Users\jindrich.zechmeister\App.exe
Le fichier EXE signé est signé avec succès !
Sources:
- Article : You can now sign Microsoft Windows artifacts with keys protected by Cloud HSM, disponible sur le Blog de Google Cloud.
- GCP Docs : Provider for Microsoft Cryptography API: Next Generation (CNG)
- GCP Docs : Use CNG Provider and SignTool to sign Windows artifacts
Nous sommes désolés que vous n'ayez pas trouvé les informations que vous recherchiez.
Aidez-nous à améliorer cet article. Vous cherchez autre chose ? N'hésitez pas à nous écrire.