Utilizzare il provider CNG e SignTool per firmare gli elementi di Windows

Questa guida fornisce istruzioni per creare una chiave Cloud HSM per la firma Microsoft Authenticode tramite il nostro provider CNG e SignTool.

Puoi trovare una versione di questo tutorial basata su Terraform nel repository GitHub kms-solutions.

Casi d'uso

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

  • Firma il firmware con una chiave privata protetta da un modulo HSM FIPS140-2 di livello 3.
  • Firma gli artefatti Windows utilizzando lo strumento standard SignTool di Windows.

Prima di iniziare

Per completare questo tutorial, devi disporre di quanto segue:

  • Un computer Windows con gli artefatti che vuoi firmare.
  • L'ultima release del provider CNG di Cloud KMS, che può essere installata sulla tua macchina Windows utilizzando il programma di installazione .msi incluso.
  • Cloud Shell o la tua macchina Linux, per generare una richiesta di firma del certificato o un certificato. Su questa macchina, completa la configurazione descritta in Configurazione di OpenSSL per scaricare e configurare la nostra libreria PKCS#11.

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

Se non l'hai ancora fatto, scarica l'SDK Windows più recente sulla tua macchina Windows, che include SignTool.

Configurazione

Crea una chiave di firma ospitata da Cloud KMS

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

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

Poi, crea una chiave di firma hardware EC-P256-SHA256 Cloud KMS nel tuo progettoGoogle Cloud , nel keyring che hai 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. Questa prova potrebbe essere richiesta dalla tua autorità di certificazione (CA) per emettere un certificato Extended Validation (EV).

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

  1. Nella console Google Cloud , vai alla pagina Key Management.

    Vai a Gestione delle chiavi

  2. Seleziona le chiavi automatizzate contenenti la chiave che vuoi attestare, quindi seleziona la chiave.

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

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

Consulta la sezione Analisi dell'attestazione per istruzioni complete su come verificare l'attestazione scaricata.

Crea un certificato autofirmato con OpenSSL

Questo passaggio è facoltativo, ma ti aiuta a familiarizzare con i passaggi successivi prima di procedere con la procedura e la spesa 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 utilizzare OpenSSL per utilizzare un URI PKCS #11 anziché un percorso file e identificare la chiave in base alla sua etichetta. Nella libreria Cloud KMS PKCS #11, l'etichetta della chiave equivale al nome 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 va a buon fine, PKCS11_MODULE_PATH potrebbe essere stato impostato in modo errato oppure potresti non disporre delle autorizzazioni corrette per utilizzare la chiave di firma Cloud KMS.

Ora dovresti avere un certificato simile a questo:

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

Copia il certificato sul tuo computer Windows in modo da poterlo utilizzare con SignTool 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 Cloud HSM. Completa questi passaggi se l'autorità di certificazione richiede un CSR 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.

Non puoi utilizzare un ID oggetto più lungo di 100 caratteri con OpenSSL. Utilizza nomi brevi per KeyRing e CryptoKey oppure utilizza pkcs11:object=KEY_NAME. Per maggiori informazioni sul limite dell'ID oggetto OpenSSL, consulta il problema correlato su GitHub.

Ora che hai la CSR, puoi fornirla alla tua autorità di certificazione per ottenere il certificato di firma. Utilizza il certificato fornito dalla tua CA nella sezione successiva.

Firmare un artefatto con SignTool

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

Utilizza SignTool per firmare gli artefatti utilizzando la chiave Cloud KMS e il tuo certificato.

"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

Sostituisci quanto segue:

  • PATH_TO_SIGNTOOL.EXE: il percorso di signtool.exe (ad es. C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.19041.0\\x64\\signtool.exe).
  • PATH_TO_CA.CERT: il percorso del certificato ca.cert.
  • PATH_TO_ARTIFACT_TO_SIGN: il percorso dell'artefatto che vuoi firmare.

Per una spiegazione dettagliata di ogni opzione di comando e dei formati dei file degli artefatti supportati, consulta la documentazione ufficiale di SignTool.