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 s'adresse aux entreprises suivantes : en matière de sécurité:
- Signez le micrologiciel à l'aide d'une clé privée protégée par un module HSM FIPS140-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, suivez la configuration décrite dans la section Configurer 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 fichier JAR de la version JAR la plus récente. à 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 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 projet Google 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 : 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 l'attestation et le certificat est alors téléchargé chaînes.
Consultez la section Analyser l'attestation pour obtenir des instructions complètes sur la manière de valider l'attestation téléchargée.
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é à l'aide de la clé de signature hébergée par Cloud KMS. Vous pouvez utiliser OpenSSL pour utiliser URI PKCS #11 au lieu d'un chemin d'accès au fichier et identifiez la clé par son étiquette. Dans bibliothèque Cloud KMS PKCS #11, le libellé de clé équivaut à la 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.
vous ne disposez peut-être pas des autorisations nécessaires pour utiliser l'API Cloud KMS
clé de signature.
Vous devriez maintenant avoir un certificat semblable à celui-ci :
-----BEGIN CERTIFICATE-----
...
...
...
-----END CERTIFICATE-----
Copiez le certificat sur votre machine Windows afin de pouvoir l'utiliser avec Utilisez 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 instance Cloud HSM clé de signature. Suivez ces étapes si votre autorité de certification exige une CSR afin de générer un nouveau certificat pour la signature de 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 que vous voulez générer.DIGEST_FLAG
: indicateur indiquant le type de condensé. Utilisez-sha256
,-sha384
ou-sha512
selon l'algorithme de la clé.KEY_ID
: ID de ressource complet d'une instance version de clé de signature (par exemple,projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1
REQUEST_NAME
: nom de la requête de signature de certificat.
Veillez à utiliser les options -sigopt
appropriées pour le type de clé que vous
utilisent.
Maintenant que vous disposez de votre requête de signature de certificat, vous pouvez la transmettre à votre certificat pour obtenir le certificat de signature. Utiliser 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 fichiers 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
: le chemin d'accès à l'artefact que que vous voulez signer.
Pour obtenir une explication détaillée de chaque option de commande, consultez la documentation officielle de Jsign.