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 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 senza dover utilizzare signtool.
Prima di iniziare
Per completare questo tutorial, hai bisogno di quanto segue:
- Un computer Windows con gli elementi che vuoi firmare. Assicurati che Java sia installato su questo computer.
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.
Ricordati di eseguire gcloud auth application-default login
, se non l'hai ancora fatto.
Sul computer Windows, scarica l'ultima release JAR di Jsign 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 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:
Nella console Google Cloud, vai alla pagina Gestione delle chiavi.
Seleziona il mazzo di chiavi contenente la chiave che vuoi attestare, quindi selezionata la chiave.
Fai clic su Altro more_vert per la versione della chiave che vuoi attestare e poi su Verifica attestazione.
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 Jsign 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 esempioprojects/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.
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 artefatto con Jsign
Ora che hai creato correttamente un certificato (autofirmato o ottenuto dall'autorità di certificazione) e lo hai copiato sulla tua macchina 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 elementi utilizzando la chiave Cloud KMS e il 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 perjsign.jar
.PATH_TO_CA.CERT
: il percorso del certificatoca.cert
.PATH_TO_ARTIFACT_TO_SIGN
: il percorso dell'elemento che vuoi firmare.
Per una spiegazione dettagliata di ogni opzione di comando, consulta la documentazione ufficiale di Jsign.