Ce guide explique comment créer une clé Cloud HSM pour la signature Microsoft Authenticode via PKCS#11 et Jsign.
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 des artefacts Windows sans avoir à utiliser signtool.
Avant de commencer
Pour suivre ce tutoriel, vous avez besoin des éléments suivants:
- Une machine Windows avec les artefacts que vous souhaitez signer. Assurez-vous que Java est installé sur cette machine.
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.
N'oubliez pas d'exécuter gcloud auth application-default login
si ce n'est pas déjà fait.
Sur votre ordinateur Windows, téléchargez le dernier fichier JAR de la version Jsign à l'aide de la commande PowerShell suivante:
wget https://github.com/ebourg/jsign/releases/download/JSIGN.VERSION/jsign-JSIGN.VERSION.jar -O jsign.jar
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:
Dans la console Google Cloud, accédez à la page Gestion des clés.
Sélectionnez le trousseau de clés contenant la clé que vous souhaitez attester, puis sélectionnez la clé.
Cliquez sur Plus more_vert pour obtenir la version de clé que vous souhaitez attester, puis sur Valider l'attestation.
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 de 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 Jsign 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.
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 Jsign
Maintenant que vous avez créé un certificat (autosigné ou obtenu auprès de l'autorité de certification) et que vous l'avez copié sur votre ordinateur Windows, vous pouvez l'utiliser pour signer un artefact Windows.
Pour obtenir la liste des formats de fichier compatibles, exécutez la commande jsign --help
.
Utilisez Jsign pour signer les artefacts à l'aide de votre clé Cloud KMS et de votre certificat.
java -jar PATH_TO_JSIGN.JAR --storetype GOOGLECLOUD \
--storepass $(gcloud auth application-default print-access-token) \
--keystore projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING \
--alias KEY_NAME \
--certfile PATH_TO_CA.CERT
PATH_TO_ARTIFACT_TO_SIGN
Remplacez les éléments suivants :
PATH_TO_JSIGN.JAR
: chemin d'accès àjsign.jar
.PATH_TO_CA.CERT
: chemin d'accès à votre certificatca.cert
.PATH_TO_ARTIFACT_TO_SIGN
: chemin d'accès à l'artefact que vous souhaitez signer.
Pour obtenir une explication détaillée de chaque option de commande, consultez la documentation officielle de Jsign.