Wrapping di una chiave utilizzando OpenSSL su Linux

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Questo argomento mostra come eseguire manualmente il wrapping di una chiave prima di importarla in Cloud KMS. Devi seguire le istruzioni in questo argomento solo se non vuoi utilizzare l'Google Cloud CLI per eseguire automaticamente il wrapping della chiave prima di importarla. Per una panoramica delle differenze, consulta la pagina Come funziona l'importazione delle chiavi.

Puoi completare i passaggi in questo argomento tra 5 e 10 minuti, esclusi quelli Prima di iniziare.

Prima di iniziare

Prima di eseguire il wrapping di una chiave, devi completare i seguenti prerequisiti.

  1. Crea un keyring e una chiave del target, quindi crea un job di importazione.
  2. Verifica che la chiave sia disponibile localmente e formattata correttamente per l'importazione in Cloud KMS.
  3. Patch e ricompilazione di OpenSSL

Recupera la chiave wrapping

Questa sezione mostra come recuperare la chiave di wrapping dal job di importazione che hai creato in Prima di iniziare. Si consiglia di utilizzare Google Cloud Console.

Console

  1. Vai alla pagina Gestione chiavi in Google Cloud Console.

    Vai alla pagina Gestione delle chiavi

  2. Fai clic sul nome del keyring che contiene il job di importazione.

  3. Fai clic sulla scheda Job di importazione nella parte superiore della pagina.

  4. Fai clic su Altro , quindi su Scarica chiave di wrapping nel menu popup.

Interfaccia a riga di comando gcloud

Per verificare che il job di importazione sia attivo, esegui il comando gcloud kms import-jobs describe:

gcloud kms import-jobs describe IMPORT_JOB \
  --location LOCATION \
  --keyring KEY_RING \
  --format="value(state)"
state: ACTIVE

Esegui questo comando per salvare la chiave pubblica dal job di importazione in ${HOME}/wrapping-key.pem

gcloud kms import-jobs describe \
  --location=LOCATION \
  --keyring=KEY_RING \
  --format="value(publicKey.pem)" \
  IMPORT_JOB > ${HOME}/wrapping-key.pem

API

  1. Chiama il metodo ImportJob.get.

  2. Recupera la chiave pubblica tramite il campo publicKey della risposta ImportJob.get. Questo valore è di tipo WrappingPublicKey. Il campo pem del tipo WrappingPublicKey è la chiave pubblica codificata in formato PEM (Privacy Enhanced Mail).

Per ulteriori informazioni sul formato con codifica PEM, consulta la sezione RFC 7468, in particolare le sezioni Considerazioni generali e Codifica testuale delle informazioni sulla chiave pubblica del soggetto.

Imposta le variabili di ambiente

I comandi OpenSSL richiedono diversi percorsi file come valori di input. Definisci le variabili di ambiente per i percorsi dei file per semplificare l'esecuzione dei comandi. Assicurati di avere accesso in scrittura alle directory che definisci di seguito.

  1. Imposta la variabile PUB_WRAPPING_KEY sul percorso completo della chiave di wrapping che hai scaricato dal job di importazione. La chiave di wrapping termina tra .pem.

    PUB_WRAPPING_KEY="WRAPPING_KEY_PATH"
    

  2. Imposta la variabile TARGET_KEY sul percorso completo della chiave non aggregata (target).

    TARGET_KEY=TARGET_KEY_PATH
    

    Sostituisci TARGET_KEY_PATH con il percorso del file .bin per le chiavi simmetriche o il percorso del file .der per le chiavi asimmetriche.

  3. Se esegui il wrapping con RSA-AES, imposta la variabile TEMP_AES_KEY sul percorso completo della chiave AES temporanea.

    TEMP_AES_KEY=TEMP_AES_KEY_PATH
    

  4. Imposta la variabile WRAPPED_KEY sul percorso completo in cui vuoi salvare la chiave di destinazione aggregata, pronta per l'importazione.

    WRAPPED_KEY=WRAPPED_KEY_PATH
    

  5. Verifica che tutte le variabili di ambiente siano impostate correttamente utilizzando i seguenti comandi:

    echo "PUB_WRAPPING_KEY: " ${PUB_WRAPPING_KEY}; \
    echo "TARGET_KEY: " ${TARGET_KEY}; \
    echo "TEMP_AES_KEY: " ${TEMP_AES_KEY}; \
    echo "WRAPPED_KEY: " ${WRAPPED_KEY}
    

Quando le variabili sono impostate correttamente, puoi eseguire il wrapping della chiave. Esistono due approcci descritti di seguito: con solo RSA o RSA-AES.

Aggrega la chiave

Aggregare la chiave con RSA

In questo approccio, la chiave di destinazione viene aggregata in un blocco RSA. Le dimensioni della chiave di destinazione sono quindi limitate. Ad esempio, non puoi utilizzare questo metodo per eseguire il wrapping di un'altra chiave RSA. I metodi di importazione supportati sono rsa-oaep-3072-sha256 e rsa-oaep-4096-sha256.

  • Aggrega la chiave di destinazione con la chiave pubblica di wrapping utilizzando l'algoritmo CKM_RSA_PKCS_OAEP:

    openssl pkeyutl \
      -encrypt \
      -pubin \
      -inkey ${PUB_WRAPPING_KEY} \
      -in ${TARGET_KEY} \
      -out ${WRAPPED_KEY} \
      -pkeyopt rsa_padding_mode:oaep \
      -pkeyopt rsa_oaep_md:sha256 \
      -pkeyopt rsa_mgf1_md:sha256
    

Aggregare la chiave con RSA-AES

In questo approccio, la chiave di destinazione viene aggregata con una chiave AES temporanea. La chiave AES temporanea viene quindi aggregata dalla chiave RSA. Queste due chiavi aggregate sono concatenate e importate. Poiché viene eseguito il wrapping della chiave di destinazione utilizzando AES anziché RSA, questo approccio può essere utilizzato per eseguire il wrapping delle chiavi di grandi dimensioni. I metodi di importazione supportati sono rsa-oaep-3072-sha1-aes-256, rsa-oaep-4096-sha1-aes-256, rsa-oaep-3072-sha256-aes-256 e rsa-oaep-4096-sha256-aes-256.

  1. Genera una chiave AES casuale temporanea di 32 byte e salvala nella località identificata da ${TEMP_AES_KEY}:

    openssl rand -out "${TEMP_AES_KEY}" 32
    

  2. Aggrega la chiave AES temporanea con la chiave pubblica di wrapping utilizzando l'algoritmo CKM_RSA_PKCS_OAEP. Se il metodo di importazione è rsa-oaep-3072-sha1-aes-256 o rsa-oaep-4096-sha1-aes-256, utilizza sha1 per rsa_oaep_md e rsa_mgf1_md. Utilizza sha256 per rsa-oaep-3072-sha256-aes-256 e rsa-oaep-4096-sha256-aes-256.

    openssl pkeyutl \
      -encrypt \
      -pubin \
      -inkey ${PUB_WRAPPING_KEY} \
      -in ${TEMP_AES_KEY} \
      -out ${WRAPPED_KEY} \
      -pkeyopt rsa_padding_mode:oaep \
      -pkeyopt rsa_oaep_md:{sha1|sha256} \
      -pkeyopt rsa_mgf1_md:{sha1|sha256}
    

  3. Imposta la variabile OpenSSL_V110 sul percorso dello script openssl.sh. Se hai seguito esattamente le istruzioni per patchare e ricompilare OpenSSL, puoi utilizzare questo comando senza modificare il valore della variabile.

    OPENSSL_V110="${HOME}/local/bin/openssl.sh"
    

  4. Aggrega la chiave di destinazione con la chiave AES temporanea utilizzando l'algoritmo CKM_AES_KEY_WRAP_PAD e aggiungila alla WRAPPED_KEY.

    "${OPENSSL_V110}" enc \
      -id-aes256-wrap-pad \
      -iv A65959A6 \
      -K $( hexdump -v -e '/1 "%02x"' < "${TEMP_AES_KEY}" ) \
      -in "${TARGET_KEY}" >> "${WRAPPED_KEY}"
    

    Il flag -iv A65959A6 imposta A65959A6 come valore iniziale alternativo. Questa informazione è richiesta dalla specifica RFC 5649.

Passaggi successivi