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 del progetto basata su Terraform di questo tutorial 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 HSM FIPS 140-2 di livello 3.
  • Firma gli elementi di Windows utilizzando lo strumento SignTool standard di Windows.

Prima di iniziare

Per completare questo tutorial, hai bisogno di quanto segue:

  • Un computer Windows con gli elementi 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 nella sezione Configurazione di OpenSSL per scaricare e configurare la nostra libreria PKCS#11.

Ricordati 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 in Cloud KMS

Utilizzando Cloud Shell o la tua macchina, crea un portachiavi Cloud KMS nel tuo progetto Google Cloud utilizzando il seguente comando:

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

Quindi, crea una chiave di firma hardware EC-P256-SHA256 Cloud KMS nel progettoGoogle Cloud , nel portachiavi 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 dell'HSM

Un'attestazione HSM è la prova che la chiave risiede in un HSM. Questa prova potrebbe essere obbligatoria per l'autorità di certificazione (CA) per emettere un certificato di convalida estesa (EV).

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

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

    Vai a Gestione delle chiavi

  2. Seleziona il mazzo di chiavi contenente la chiave che vuoi attestare, quindi selezionata la chiave.

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

  4. Nella finestra di dialogo Verifica attestazione, fai clic su Scarica il bundle di attestazione. Verrà 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.

Creare un certificato autofirmato con OpenSSL

Questo passaggio è facoltativo, ma ti aiuta ad acquisire familiarità con i passaggi successivi prima di procedere con la procedura e la spesa per l'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 in Cloud KMS. Puoi utilizzare OpenSSL per utilizzare un URI PKCS #11 anziché un percorso file e identificare la chiave tramite l'etichetta. Nella biblioteca PKCS #11 di Cloud KMS, l'etichetta della chiave è equivalente al nome della chiave 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, è possibile che PKCS11_MODULE_PATH sia stato impostato in modo errato o che tu non disponga delle autorizzazioni necessarie per utilizzare la chiave di firma Cloud KMS.

A questo punto dovresti avere un certificato simile al seguente:

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

Copia il certificato sulla tua macchina Windows in modo da poterlo utilizzare con SignTool per firmare gli elementi.

Creare 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 la tua autorità di certificazione richiede una CSR per generare un nuovo certificato per la firma del codice.

Utilizzando Cloud Shell o la tua macchina, esegui il seguente 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 in uso.

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

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

Firmare un elemento con SignTool

Ora che hai creato un certificato (autofirmato o ottenuto dall'autorità di certificazione) e lo hai copiato sulla tua macchina Windows, puoi utilizzarlo per firmare un artifact Windows.

Utilizza SignTool per firmare gli elementi utilizzando la chiave Cloud KMS e il 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'elemento che vuoi firmare.

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