Utilizzare Jsign e PKCS#11 per firmare gli artefatti di Windows

Questa guida fornisce istruzioni per la creazione di una chiave Cloud HSM per la firma di Microsoft Authenticode tramite PKCS#11 e Jsign.

Casi d'uso

Il flusso di lavoro descritto in questo documento aiuta a soddisfare le seguenti esigenze di sicurezza aziendale:

  • Firma il firmware con una chiave privata protetta da un HSM FIPS140-2 di livello 3.
  • Firma gli artefatti di Windows senza dover utilizzare signtool.

Prima di iniziare

Per completare questo tutorial, hai bisogno di quanto segue:

  • Un computer Windows con gli artefatti che vuoi firmare. Assicurati che Java sia installato su questa macchina.
  • Cloud Shell o la tua macchina Linux, per generare una richiesta di firma di certificato o un certificato. Su questa macchina, completa la configurazione documentata in OpenSSL setup.

Ricordati di eseguire gcloud auth application-default login se non l'hai ancora fatto.

Sul tuo computer Windows, scarica il file JAR release più recente utilizzando il seguente comando PowerShell:

wget https://github.com/ebourg/jsign/releases/download/JSIGN.VERSION/jsign-JSIGN.VERSION.jar -O jsign.jar

Configurazione

Crea una chiave di firma ospitata su Cloud KMS

Utilizzando Cloud Shell o la tua macchina, crea un keyring Cloud KMS nel progetto Google Cloud utilizzando questo comando:

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

Quindi, crea una chiave di firma hardware EC-P256-SHA256 di Cloud KMS nel tuo progetto Google Cloud, nel keyring appena creato:

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"

Scarica l'attestazione HSM

Un'attestazione HSM è la prova che la chiave si trova in un HSM. L'autorità di certificazione (CA) potrebbe richiedere questa prova per rilasciare un certificato di convalida estesa (EV).

Per scaricare l'attestazione HSM associata alla tua chiave Cloud KMS, completa i seguenti passaggi:

  1. Nella console Google Cloud, vai alla pagina Gestione delle chiavi.

    Vai a Key Management

  2. Seleziona il keyring contenente la chiave che vuoi attestare, quindi seleziona la chiave.

  3. Fai clic su Altro per la versione della chiave che vuoi attestare, quindi fai clic su Verifica attestazione.

  4. Nella finestra di dialogo Verifica attestazione, fai clic su Scarica bundle attestazione. Viene scaricato un file ZIP contenente le catene di attestazioni e certificati.

Per istruzioni complete su come verificare l'attestazione scaricata, consulta Analisi dell'attestazione.

Crea un certificato autofirmato con OpenSSL

Questo passaggio è facoltativo, ma ti aiuta a familiarizzare con i passaggi successivi prima di seguire la procedura e le spese di acquisto di un certificato firmato da un'autorità di certificazione.

Utilizzando Cloud Shell o la tua macchina, genera un certificato autofirmato con la chiave di firma ospitata da Cloud KMS. Puoi usare OpenSSL per usare un URI PKCS #11 anziché un percorso file e identificare la chiave in base all'etichetta. Nella libreria PKCS #11 di Cloud KMS, l'etichetta della chiave equivale al nome della CryptoKey.

openssl req -new -x509 -days 3650 -subj '/CN=test/' -sha256 -engine pkcs11 \
  -keyform engine -key pkcs11:object=KEY_NAME > ca.cert

Se questo comando non riesce, è possibile che PKCS11_MODULE_PATH non sia stato impostato correttamente o che tu non abbia le autorizzazioni corrette per utilizzare la chiave di firma di Cloud KMS.

Ora dovresti avere un certificato simile al seguente:

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

Copia il certificato sul computer Windows in modo da poterlo utilizzare con Jsign per firmare gli artefatti.

Crea una nuova richiesta di firma del certificato

Puoi generare una richiesta di firma del certificato (CSR) per una chiave di firma di Cloud HSM. Completa questi passaggi se la tua autorità di certificazione richiede una richiesta di firma di certificato per generare un nuovo certificato per la firma del codice.

Utilizzando Cloud Shell o la tua macchina, esegui questo comando:

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

Sostituisci quanto segue:

  • CERTIFICATE_NAME: un nome per il certificato che vuoi generare.
  • DIGEST_FLAG: un flag che indica il tipo di digest. Utilizza -sha256, -sha384 o -sha512 a seconda dell'algoritmo della chiave.
  • KEY_ID: l'ID risorsa completo di una versione della chiave di firma asimmetrica, ad esempio projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1.
  • REQUEST_NAME: un nome per la richiesta di firma del certificato.

Assicurati di utilizzare le opzioni -sigopt corrette per il tipo di chiave che stai utilizzando.

Firma un artefatto con Jsign

Ora che hai creato un certificato (autofirmato o ottenuto dall'autorità di certificazione) e lo hai copiato sul computer Windows, puoi utilizzarlo per firmare un artefatto Windows.

Per un elenco dei formati file supportati, esegui il comando jsign --help.

Utilizza Jsign per firmare gli artefatti, con la chiave Cloud KMS e il tuo certificato.

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

Sostituisci quanto segue:

  • PATH_TO_JSIGN.JAR: il percorso per jsign.jar.
  • PATH_TO_CA.CERT: il percorso del certificato ca.cert.
  • PATH_TO_ARTIFACT_TO_SIGN: il percorso dell'elemento che vuoi firmare.

Per una spiegazione dettagliata di ciascuna opzione di comando, consulta la documentazione ufficiale di Jsign.