{"copy":"Copia","expand":"Aprire","collapse":"Chiudere","copy_success":"Copiato!","copy_error":"Copia non riuscita!"}

Firma del codice con Google Cloud KMS

Con il servizio Google Cloud KMS ottieni un HSM cloud certificato FIPS 140-2 Level 3. Puoi firmare il codice in modo sicuro, rapido e ovunque. Inoltre, i costi per il numero di operazioni (firme) sono molto vantaggiosi. Cloud KMS supporta la firma tramite Microsoft Cryptography API: Next Generation (CNG).

Per configurare e firmare il codice è necessario eseguire i seguenti passaggi, che esamineremo uno dopo l'altro:

  • Installa il provider CNG
  • Crea un Key Ring e una chiave privata
  • Crea un CSR e ottieni un certificato
  • Firma il tuo artefatto

Scarica il provider CNG e i pacchetti necessari

Google ha pubblicato il proprio provider CNG nel suo repository su GitHub. Questi file possono essere installati nel tuo sistema Windows tramite il file di installazione .msi allegato. Questo programma necessita di configurazione sotto forma di un file YAML, che troverai in uno dei passaggi di questa guida.

Ora spostati su Linux (puoi usare WSL su Windows). Si consiglia di creare la chiave privata e CSR su Linux; sebbene tu possa installare OpenSSL su PowerShell in Windows, è meno probabile che incontri complicazioni su Linux. Anche la guida ufficiale di Google procede in questo modo.

Per comunicare con il cloud utilizzeremo l'applicazione gcloud dal pacchetto google-cloud-cli.

Crea un Key Ring e una chiave privata in Cloud HSM

Esegui i seguenti passaggi su Linux. Crea un nuovo Key Ring per il Cloud Key Management Service (KMS) API e al suo interno crea una chiave privata protetta hardwaremente tramite Cloud HSM. Scegli il algoritmo RSA asimmetrico per la firma e una lunghezza della chiave di 3072b, poiché SignTool non può utilizzare chiavi EC in combinazione con Google Cloud KMS CNG.

Prima di tutto, su Linux accedi al tuo account Google e autorizza la sessione (valgono anche per Windows PowerShell): gcloud auth application-default login

Così crei un Key Ring per posizionare una chiave privata: gcloud kms keyrings create KEYRING-NAME \
--location=europe-west3 \
--project=PROJECT-NAME

In questo Key Ring posizioneremo una chiave privata. La genereremo anche usando l'utility gcloud; sostituisci i nomi (in maiuscolo) con quelli reali (nome del progetto in GCP) e con la tua denominazione.

gcloud kms keys create KEY-NAME --keyring=KEYRING-NAME --location=europe-west3 --purpose=asymmetric-signing --protection-level=hsm --default-algorithm=rsa-sign-pkcs1-3072-sha256 --project=PROJECT-NAME

Dopo aver creato la prima versione della chiave, si consiglia di copiare il Copy resource name nel dettaglio su Cloud Console, poiché questo dato sarà necessario per KEY_ID. Appare come: projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1

Ora torna su Windows, dove sarà necessario creare ancora il file config.yaml con la configurazione per l'integrazione KMS. Inserisci quanto segue nel PowerShell: $yaml = @"
resources:
- crypto_key_version: "projects/PROJECT-NAME/locations/europe-west3/keyRings/KEYRING-NAME/cryptoKeys/KEY-NAME/cryptoKeyVersions/1" "@

$yaml = $yaml -replace "`t"," "

$utf8NoBom = New-Object System.Text.UTF8Encoding($false)
[System.IO.File]::WriteAllText('C:\Windows\KMSCNG\config.yaml', $yaml, $utf8NoBom)

Creazione del CSR

Naturalmente non è possibile importare un certificato con chiave privata all'interno di un HSM, come non è possibile esportare questa coppia. La chiave privata e il CSR devono quindi essere creati nell'HSM, quindi invia il tuo CSR a SSLmarket e fallo certificare da DigiCert. L'importazione del certificato rilasciato è il prossimo passo.

Risulta migliore effettuare la creazione del CSR su Linux, usando la libreria libengine-pkcs11-openssl, libkmsp11 e le API. Ovviamente avrai bisogno anche del pacchetto google-cloud-cli.

La creazione di un CSR appare così (dopo pkcs11:object= inserisci il nome della chiave (CryptoKey) secondo GCP): openssl req -new \
-subj "/C=CZ/O=ZONER /CN=ZONER" \
-sha256 -engine pkcs11 -keyform engine \
-key "pkcs11:object=KEY_NAME;type=private" \
-reqexts v3_req -config <(cat /etc/ssl/openssl.cnf; printf "\n[v3_req]\nextendedKeyUsage=codeSigning\n") \
-out cs-request.csr

Richiesta per DigiCert poi sarà disponibile nel file cs-request.csr nella cartella in cui stai lavorando. Inviaci questo CSR.

Ottenimento del certificato

Fatti firmare il CSR creato da DigiCert e riceverai indietro un nuovo certificato di Code Signing. Non è più necessario inserirlo nella Google Cloud Console, è sufficiente avere la chiave privata lì. Con il certificato lavoreremo localmente su Windows, salvalo da qualche parte sul tuo disco come un file.

Firma i tuoi artefatti

Continuiamo su Windows. Dal 2024, Google ha rilasciato ufficialmente il Cloud KMS CNG Provider, che si registra su Windows come Crypto Service Provider (CSP) / Key Storage Provider (KSP) con il nome Google Cloud KMS Provider. Grazie a ciò, SignTool può utilizzare le chiavi nel cloud e non devono essere solo localmente sul token.

Firmeremo utilizzando SignTool di Windows SDK e la versione x64 dello strumento; si consiglia l'ultima versione. Assicurati di inserire correttamente i parametri (vedi spiegazione dopo l'esempio).

Esempio di firma con SignTool e PowerShell: & $SignTool sign `
/v /debug `
/fd sha256 /td sha256 `
/tr http://timestamp.digicert.com `
/f "PATH_TO_CERT" `
/csp "Google Cloud KMS Provider" `
/kc "projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1" `
"PATH_TO_FILE_TO_SIGN"

Spiegazione:

  • /f PATH_TO_CERT è il percorso del file con il certificato di Code Signing (parte pubblica). Ti verrà fornito con questo insieme se te lo fai rilasciare per HSM.
  • /csp determina il provider CNG specifico, poiché su Windows ne possono essere presenti più. Google Cloud KMS Provider è registrato proprio come ad esempio “Microsoft Software Key Storage Provider”.
  • /kc (Key Container) è il percorso della chiave specifica e della sua versione (KMS CryptoKeyVersion), corrisponde al già menzionato KEY_ID.

Durante la firma, vedrai quale certificato è stato scelto per la firma e il risultato. Poiché SignTool ha problemi con il collegamento del certificato alla chiave privata nel cloud (tramite CSP/KSP), ti consiglio di tenere il certificato memorizzato localmente in un file. La scelta attraverso il nome dell'organizzazione o l'hash SHA1 del certificato è problematica e spesso non funziona; funzionava solo il certificato nel file.

The following certificate was selected:
Issued to: ZONER a.s.
Issued by: DigiCert Trusted G4 Code Signing RSA4096 SHA384 2021 CA1
Expires: Wed Nov 12 01:59:59 2025
SHA1 hash: F9BC96AC1764AD9F2072780FFB64940538A3B292

The following additional certificates will be attached:
Issued to: DigiCert Trusted G4 Code Signing RSA4096 SHA384 2021 CA1
Issued by: DigiCert Trusted Root G4
Expires: Tue Apr 29 01:59:59 2036
SHA1 hash: 7B0F360B775F76C94A12CA48445AA2D2A875701C

Done Adding Additional Store
Successfully signed: C:\Users\jindrich.zechmeister\HelloSign.exe

Number of files successfully Signed: 1
Number of warnings: 0
Number of errors: 0

Bonus - verifica della firma

La nuova firma digitale può essere verificata anche con SignTool.

PS C:\Users\jindrich.zechmeister> signtool verify /pa c:\Users\jindrich.zechmeister\App.exe
File: c:\Users\jindrich.zechmeister\App.exe
Index Algorithm Timestamp
========================================
0 sha256 RFC3161
Successfully verified: c:\Users\jindrich.zechmeister\App.exe

Il file EXE firmato è stato firmato con successo!

Fonti:

Ti è stato utile questo articolo?