Questa guida mostra come importare una chiave di crittografia in Cloud Key Management Service come nuova versione della chiave utilizzando un metodo di importazione quantum-safe. Questo approccio contribuisce a proteggere la chiave durante il transito dagli attacchi "Harvest Now, Decrypt Later" (HNDL) da parte di futuri computer quantistici.
L'importazione di chiavi quantum-safe utilizza strumenti di crittografia post-quantistica (PQC) standard, inclusi meccanismi di incapsulamento delle chiavi (KEM) e crittografia ibrida a chiave pubblica (HPKE) per proteggere la chiave durante il transito.
L'importazione di chiavi quantum-safe è supportata per le chiavi basate su software (livello di protezione SOFTWARE).
Prima di iniziare
Prima di poter importare una chiave, devi preparare il progetto, il sistema locale e il materiale della chiave.
Prepara il progetto
-
In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Cloud de Confiance project.
Enable the required API.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
Installa Google Cloud CLI.
-
Configura gcloud CLI per utilizzare la tua identità federata.
Per ulteriori informazioni, vedi Accedi a gcloud CLI con la tua identità federata.
-
Per inizializzare gcloud CLI, esegui questo comando:
gcloud init
Ruoli obbligatori
Per ottenere le autorizzazioni necessarie per importare una chiave, chiedi all'amministratore di concederti i seguenti ruoli IAM sul portachiavi:
-
Per importare solo nelle chiavi esistenti:
Cloud KMS Importer (
roles/cloudkms.importer) -
Per importare in nuove chiavi:
Amministratore Cloud KMS (
roles/cloudkms.admin)
Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.
Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.
Preparare il sistema locale
Sul sistema locale è necessaria una libreria crittografica che supporti gli strumenti di crittografia post-quantistica (PQC), inclusi i meccanismi di incapsulamento delle chiavi (KEM) e la crittografia a chiave pubblica ibrida (HPKE). Puoi utilizzare Tink, OpenSSL o un'altra libreria di crittografia che supporti quanto segue:
- Crittografia a chiave pubblica ibrida (HPKE)
- Uno dei seguenti algoritmi KEM:
ML-KEM-768ML-KEM-1024X-WING(un ibrido diML-KEM-768eX25519)
- La funzione di derivazione della chiave (KDF)
HKDF-SHA256 - Crittografia autenticata con dati associati (AEAD) utilizzando l'algoritmo
AES-256-GCM
Prepara la chiave
Verifica che l'algoritmo e la lunghezza della chiave siano
supportati. Tutte le versioni di una chiave devono avere lo stesso livello di protezione
(SOFTWARE).
Crea la chiave di destinazione e le chiavi automatizzate
Quando importi il materiale della chiave, questo diventa una nuova versione della chiave esistente. Questa chiave è chiamata chiave di destinazione. Il keyring di destinazione e la chiave di destinazione devono esistere prima di poter importare il materiale della chiave.
Segui questi passaggi per creare una chiave supportata dal software vuota su un nuovo portachiavi utilizzando Google Cloud CLI o la console Cloud de Confiance .
Console
Nella console Cloud de Confiance , vai alla pagina Key Management.
Fai clic su Crea keyring.
Nel campo Nome della chiave automatizzata, inserisci il nome della chiave automatizzata.
In Tipo di località, seleziona un tipo di località e una località.
Fai clic su Crea. Viene visualizzata la pagina Crea chiave.
Nel campo Nome chiave, inserisci il nome della chiave.
In Livello di protezione, seleziona Software.
In Materiale chiave, seleziona Chiave importata e poi fai clic su Continua. In questo modo, non viene creata una versione iniziale della chiave.
Imposta Scopo e Algoritmo per la chiave, poi fai clic su Continua.
(Facoltativo) Se vuoi che questa chiave contenga solo le versioni della chiave importate, seleziona Limita le versioni della chiave solo per importazione. In questo modo, eviti di creare accidentalmente nuove versioni della chiave in Cloud KMS.
(Facoltativo) Per le chiavi importate, la rotazione automatica è disattivata per impostazione predefinita. Per attivare la rotazione automatica, seleziona un valore dal campo Periodo di rotazione della chiave.
Se abiliti la rotazione automatica, le nuove versioni della chiave verranno generate in Cloud KMS e la versione della chiave importata non sarà più la versione della chiave predefinita dopo una rotazione.
Fai clic su Crea.
gcloud
Per utilizzare Cloud KMS dalla riga di comando, devi prima installare o eseguire l'upgrade all'ultima versione di Google Cloud CLI.
Crea il keyring di destinazione. Scegli una posizione compatibile con il livello di protezione che vuoi utilizzare. Per ulteriori informazioni sulle località supportate, consulta Località Cloud KMS.
gcloud kms keyrings create KEY_RING \ --location LOCATION
Puoi scoprire di più sulla creazione di chiavi automatizzate.
Crea la chiave di destinazione utilizzando il comando
kms keys createcon il flag--skip-initial-version-creation. In questo modo viene creata una chiave senza versione iniziale, in modo che il materiale della chiave importato sia la versione1. Utilizza il flag--import-onlyper impedire a Cloud KMS di generare materiale delle chiavi per le nuove versioni delle chiavi. Se questo flag è impostato, è necessario importare le nuove versioni della chiave. Le chiavi create come--import-onlydevono essere ruotate manualmente.gcloud kms keys create KEY_NAME \ --location LOCATION \ --keyring KEY_RING \ --purpose PURPOSE \ --skip-initial-version-creation \ --import-only
Sostituisci quanto segue:
KEY_NAME: il nome che vuoi utilizzare per la chiave.LOCATION: la posizione delle chiavi automatizzate.KEY_RING: le chiavi automatizzate in cui vuoi creare la chiave.PURPOSE: lo scopo che vuoi utilizzare per la chiave.
API
Questi esempi utilizzano curl come client HTTP per dimostrare l'utilizzo dell'API. Per saperne di più sul controllo dell'accesso, consulta Accesso all'API Cloud KMS.
Crea un nuovo keyring:
curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings?keyRingId=KEY_RING" \ --request "POST" \ --header "authorization: Bearer TOKEN" \ --header "content-type: application/json" \ --header "x-goog-user-project: PROJECT_ID" \ --data "{}"Per saperne di più, consulta la documentazione dell'API
KeyRing.create.Crea una chiave vuota di sola importazione:
curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys?cryptoKeyId=KEY_NAME&skipInitialVersionCreation=true" \ --request "POST" \ --header "authorization: Bearer TOKEN" \ --header "content-type: application/json" \ --header "x-goog-user-project: PROJECT_ID" \ --data "{"purpose":"PURPOSE", "importOnly": "true", "versionTemplate":{"protectionLevel":"PROTECTION_LEVEL","algorithm":"ALGORITHM"}}"Per saperne di più, consulta la documentazione dell'API
CryptoKey.create.
Il keyring e la chiave ora esistono, ma la chiave non contiene materiale della chiave, non ha versioni e non è attiva. A questo punto, crea un job di importazione.
Crea il job di importazione
Un job di importazione definisce le caratteristiche delle chiavi che importa, inclusi il livello di protezione e il metodo di importazione.
L'importazione di chiavi quantum-safe è supportata solo per il livello di protezione SOFTWARE.
Scegli uno dei seguenti metodi di importazione quantum-safe:
HPKE_KEM_XWING_HKDF_SHA256_AES_256_GCMHPKE_KEM_ML_KEM_768_HKDF_SHA256_AES_256_GCMHPKE_KEM_ML_KEM_1024_HKDF_SHA256_AES_256_GCM
gcloud
Esegui questo comando per creare un job di importazione con un metodo di importazione quantum-safe:
gcloud kms import-jobs create IMPORT_JOB \
--location LOCATION \
--keyring KEY_RING \
--import-method IMPORT_METHOD \
--protection-level software
Sostituisci quanto segue:
IMPORT_JOB: un nome univoco da utilizzare per il job di importazione.LOCATION: la posizione delle chiavi automatizzate in cui hai creato la chiave di destinazione.KEY_RING: il nome del keyring in cui hai creato la chiave di destinazione.IMPORT_METHOD: il metodo di importazione quantum-safe che vuoi utilizzare, ad esempiohpke-kem-xwing-hkdf-sha256-aes-256-gcm.
REST
Chiama il metodo keyRings.importJobs.create:
curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/importJobs?import_job_id=IMPORT_JOB" \
--request "POST" \
--header "authorization: Bearer TOKEN" \
--header "content-type: application/json" \
--data '{"import_method": "IMPORT_METHOD", "protection_level": "SOFTWARE"}'
Sostituisci quanto segue:
PROJECT_ID: l'identificatore del tuo progetto Cloud KMS.LOCATION: la posizione delle chiavi automatizzate in cui hai creato la chiave di destinazione.KEY_RING: il nome del keyring in cui hai creato la chiave di destinazione.IMPORT_JOB: un nome univoco da utilizzare per il job di importazione.TOKEN: il token per autenticare la richiesta.IMPORT_METHOD: il metodo di importazione quantum-safe che vuoi utilizzare, ad esempioHPKE_KEM_XWING_HKDF_SHA256_AES_256_GCM.
Controllare lo stato del job di importazione
Lo stato iniziale di un job di importazione è PENDING_GENERATION. Quando lo stato è
ACTIVE, puoi utilizzarlo per importare le chiavi.
Un job di importazione scade dopo tre giorni. Se il job di importazione è scaduto, devi crearne uno nuovo.
Puoi controllare lo stato di un job di importazione utilizzando Google Cloud CLI, la consoleCloud de Confiance o l'API Cloud Key Management Service.
Console
Vai alla pagina Key Management nella console Cloud de Confiance .
Fai clic sul nome del keyring che contiene il job di importazione.
Fai clic sulla scheda Job di importazione nella parte superiore della pagina.
Lo stato sarà visibile nella sezione Stato accanto al nome del job di importazione.
gcloud
Per utilizzare Cloud KMS dalla riga di comando, devi prima installare o eseguire l'upgrade all'ultima versione di Google Cloud CLI.
Quando un job di importazione è attivo, puoi utilizzarlo per importare le chiavi. L'operazione potrebbe richiedere alcuni minuti. Utilizza questo comando per verificare che il job di importazione sia attivo. Utilizza la località e il keyring in cui hai creato il job di importazione.
gcloud kms import-jobs describe IMPORT_JOB \ --location LOCATION \ --keyring KEY_RING \ --format="value(state)"
L'output è simile al seguente:
state: ACTIVE
Go
Per eseguire questo codice, devi innanzitutto configurare un ambiente di sviluppo Go e installare l'SDK Go di Cloud KMS.
Java
Per eseguire questo codice, devi innanzitutto configurare un ambiente di sviluppo Java e installare l'SDK Java Cloud KMS.
Node.js
Per eseguire questo codice, devi innanzitutto configurare un ambiente di sviluppo Node.js e installare l'SDK Node.js di Cloud KMS.
Python
Per eseguire questo codice, devi innanzitutto configurare un ambiente di sviluppo Python e installare l'SDK Python di Cloud KMS.
API
Questi esempi utilizzano curl come client HTTP per dimostrare l'utilizzo dell'API. Per saperne di più sul controllo dell'accesso, consulta Accesso all'API Cloud KMS.
Per controllare lo stato di un job di importazione, utilizza il metodo
ImportJobs.get:
curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/importJobs/IMPORT_JOB_ID" \
--request "GET" \
--header "authorization: Bearer TOKEN"
Non appena il job di importazione è attivo, puoi inviare una richiesta di importazione di una chiave.
Recupera la chiave pubblica di wrapping
Una volta completato il job di importazione ACTIVE, recupera la chiave pubblica associata. Utilizzerai questa chiave pubblica sul tuo sistema locale per eseguire il wrapping del materiale della chiave
che vuoi importare.
gcloud
Esegui questo comando per scaricare la chiave pubblica:
gcloud kms import-jobs describe IMPORT_JOB
--location LOCATION
--keyring KEY_RING
--format="value(publicKey.data)"
Sostituisci quanto segue:
IMPORT_JOB: il nome del job di importazione.LOCATION: la posizione del portachiavi in cui hai creato il job di importazione.KEY_RING: il nome delle chiavi automatizzate in cui hai creato il job di importazione.
La chiave pubblica ha una codifica Base64.
REST
- Chiama il metodo
keyRings.importJobs.get. - Recupera la chiave pubblica dal campo
publicKey.datadella risposta e salvala localmente comepublic_key.data.
Preparare e eseguire il wrapping del materiale delle chiavi
Utilizza una libreria crittografica esterna supportata sul sistema locale per eseguire il wrapping del materiale della chiave utilizzando la chiave di wrapping pubblica recuperata.
Il processo di wrapping deve eseguire HPKE.Seal() (RFC 9180) per produrre una chiave
wrapped. In questo modo, vengono completati i seguenti passaggi:
- Incapsula la chiave pubblica recuperata per produrre un segreto condiviso e una chiave di incapsulamento.
- Deriva una chiave simmetrica temporanea dal segreto condiviso utilizzando HKDF-SHA256.
- Cripta il materiale della chiave con la chiave effimera utilizzando AES-256-GCM.
- Concatenare la chiave di incapsulamento e il materiale della chiave crittografato come
testo crittografato. Questa è la chiave con wrapping risultante che utilizzerai per importare
la chiave. Salva questo file come
wrapped_key.bin.
Il seguente esempio di codice Go mostra il wrapping del materiale della chiave utilizzando la libreria tink-go:
package main
import (
"bytes"
"encoding/base64"
"flag"
"fmt"
"log"
"google.golang.org/protobuf/proto"
"github.com/tink-crypto/tink-go/v2/hybrid"
"github.com/tink-crypto/tink-go/v2/keyset"
hpkepb "github.com/tink-crypto/tink-go/v2/proto/hpke_go_proto"
tinkpb "github.com/tink-crypto/tink-go/v2/proto/tink_go_proto"
)
var (
publicKeyB64Flag = flag.String("public_key", "", "Base64 encoded public key for wrapping.")
targetKeyB64Flag = flag.String("target_key", "", "Base64 encoded 32-byte target key to be wrapped.")
)
func main() {
flag.Parse()
if *publicKeyB64Flag == "" {
log.Fatal("-public_key is required")
}
if *targetKeyB64Flag == "" {
log.Fatal("-target_key is required")
}
pkBytes, err := base64.StdEncoding.DecodeString(*publicKeyB64Flag)
if err != nil {
log.Fatalf("failed to decode public key: %v", err)
}
targetKey, err := base64.StdEncoding.DecodeString(*targetKeyB64Flag)
if err != nil {
log.Fatalf("failed to decode target key: %v", err)
}
hpkePubKey := &hpkepb.HpkePublicKey{
Version: 0,
Params: &hpkepb.HpkeParams{
Kem: hpkepb.HpkeKem_ML_KEM768,
Kdf: hpkepb.HpkeKdf_HKDF_SHA256,
Aead: hpkepb.HpkeAead_AES_256_GCM,
},
PublicKey: pkBytes,
}
serializedPubKey, err := proto.Marshal(hpkePubKey)
if err != nil {
log.Fatalf("failed to marshal HPKE public key: %v", err)
}
ks := &tinkpb.Keyset{
PrimaryKeyId: 1,
Key: []*tinkpb.Keyset_Key{
{
KeyData: &tinkpb.KeyData{
TypeUrl: "type.googleapis.com/google.crypto.tink.HpkePublicKey",
Value: serializedPubKey,
KeyMaterialType: tinkpb.KeyData_ASYMMETRIC_PUBLIC,
},
Status: tinkpb.KeyStatusType_ENABLED,
KeyId: 1,
OutputPrefixType: tinkpb.OutputPrefixType_RAW,
},
},
}
serializedKeyset, err := proto.Marshal(ks)
if err != nil {
log.Fatalf("failed to marshal keyset: %v", err)
}
// Create a KeysetHandle and retrieve the HybridEncrypt primitive.
reader := keyset.NewBinaryReader(bytes.NewReader(serializedKeyset))
handle, err := keyset.ReadWithNoSecrets(reader)
if err != nil {
log.Fatalf("failed to create keyset handle: %v", err)
}
enc, err := hybrid.NewHybridEncrypt(handle)
if err != nil {
log.Fatalf("failed to create hybrid encrypt primitive: %v", err)
}
// Perform the wrapping operation. Tink's HPKE implementation handles the
// 'enc || ciphertext' concatenation automatically.
wrappedKey, err := enc.Encrypt(targetKey, nil)
if err != nil {
log.Fatalf("failed to wrap key: %v", err)
}
fmt.Printf("Final wrappedKey (base64):\n%s\n", base64.StdEncoding.EncodeToString(wrappedKey))
}
Salva la stringa base64 di output o decodificala in un file binario:
bash
echo "BASE64_WRAPPED_KEY" | base64 --decode > wrapped_key.bin
Importa la chiave con wrapping
Importa la chiave con wrapping preparata come nuova versione della chiave di destinazione.
gcloud
Esegui il comando kms keys versions import:
gcloud kms keys versions import \
--location LOCATION \
--keyring KEY_RING \
--key KEY_NAME \
--import-job IMPORT_JOB \
--algorithm ALGORITHM \
--wrapped-key-file wrapped_key.bin
Sostituisci quanto segue:
LOCATION: la posizione delle chiavi automatizzate che contengono la chiave di destinazione.KEY_RING: il nome delle chiavi automatizzate che contiene la chiave di destinazione.KEY_NAME: il nome della chiave di destinazione.IMPORT_JOB: il nome del job di importazione.ALGORITHM: l'algoritmo del materiale chiave da importare.
REST
Chiama il metodo cryptoKeyVersions.import:
curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions:import" \
--request "POST" \
--header "authorization: Bearer TOKEN" \
--header "content-type: application/json" \
--data '{"importJob": "IMPORT_JOB", "algorithm": "ALGORITHM", "wrappedKey": "PATH_TO_WRAPPED_KEY"}'
Sostituisci quanto segue:
PROJECT_ID: l'identificatore del tuo progetto Cloud KMS.LOCATION: la posizione delle chiavi automatizzate che contengono la chiave di destinazione.KEY_RING: il nome delle chiavi automatizzate che contiene la chiave di destinazione.KEY_NAME: il nome della chiave di destinazione.TOKEN: il token per autenticare la richiesta.IMPORT_JOB: l'identificatore del job di importazione corrispondente.ALGORITHM: l'algoritmo del materiale chiave da importare.PATH_TO_WRAPPED_KEY: il percorso della chiave con wrapping manuale in formato base64.
Controlla lo stato della versione della chiave importata
Lo stato iniziale di una versione della chiave importata è PENDING_IMPORT. Quando lo
stato è ENABLED, la versione della chiave è stata importata correttamente. Se l'importazione non riesce, lo stato è IMPORT_FAILED.
Puoi controllare lo stato di una richiesta di importazione utilizzando Google Cloud CLI, la consoleCloud de Confiance o l'API Cloud Key Management Service.
Console
Apri la pagina Key Management nella consoleCloud de Confiance .
Fai clic sul nome del keyring che contiene il job di importazione.
Fai clic sulla scheda Job di importazione nella parte superiore della pagina.
Lo stato sarà visibile nella sezione Stato accanto al nome del job di importazione.
gcloud
Per utilizzare Cloud KMS dalla riga di comando, devi prima installare o eseguire l'upgrade all'ultima versione di Google Cloud CLI.
Utilizza il comando versions list per controllare lo stato. Utilizza la stessa
posizione, lo stesso keyring di destinazione e la stessa chiave di destinazione che hai creato in precedenza in questo
argomento.
gcloud kms keys versions list \ --keyring KEY_RING \ --location LOCATION \ --key KEY_NAME
Go
Per eseguire questo codice, devi innanzitutto configurare un ambiente di sviluppo Go e installare l'SDK Go di Cloud KMS.
Java
Per eseguire questo codice, devi innanzitutto configurare un ambiente di sviluppo Java e installare l'SDK Java Cloud KMS.
Node.js
Per eseguire questo codice, devi innanzitutto configurare un ambiente di sviluppo Node.js e installare l'SDK Node.js di Cloud KMS.
Python
Per eseguire questo codice, devi innanzitutto configurare un ambiente di sviluppo Python e installare l'SDK Python di Cloud KMS.
API
Questi esempi utilizzano curl come client HTTP per dimostrare l'utilizzo dell'API. Per saperne di più sul controllo dell'accesso, consulta Accesso all'API Cloud KMS.
Chiama il metodo ImportJob.get e controlla il campo
[state][api_importjob_fields_state]. Se
state è PENDING_GENERATION, il job di importazione è ancora in fase di creazione.
Controlla periodicamente lo stato finché non diventa ACTIVE.
Dopo l'importazione della versione iniziale della chiave, lo stato della chiave cambia in
ENABLED. Per le chiavi simmetriche, devi impostare la versione della chiave importata come
versione principale prima di poter utilizzare la chiave.
Reimporta una chiave eliminata in precedenza
Se devi ripristinare una versione della chiave importata in precedenza che si trova nello stato DESTROYED
o IMPORT_FAILED allo stato ENABLED, puoi reimportare esattamente
lo stesso materiale della chiave.
Il reimportazione di una versione della chiave eliminata utilizza la stessa procedura dell'importazione iniziale, utilizzando il job di importazione originale o un nuovo job di importazione (con lo stesso livello di protezione SOFTWARE).