Come faccio a trasferire in modo sicuro le mie chiavi su CloudHSM con OpenSSL e lo strumento a riga di comando key_mgmt_util?

8 minuti di lettura
0

Ho delle chiavi locali che voglio importare in AWS CloudHSM utilizzando il comando unWrapKey con lo strumento a riga di comando key_mgmt_util. Tuttavia, non posso importare o comprimere chiavi in testo semplice.

Soluzione

Crittografa la tua chiave di payload con una chiave AES effimera. Crittografa l'AES effimero con la tua chiave pubblica da una coppia di chiavi. Quindi, concatena la chiave di payload crittografata e la chiave effimera crittografata in un unico file. Il file concatenato verrà inviato a CloudHSM in formato crittografato, e successivamente decrittografato dalla chiave privata della coppia di chiavi. Il meccanismo AES_KEY_WRAP decrittografa la chiave AES effimera e la utilizza per decrittografare la chiave del payload.

Crea le seguenti chiavi:

  • Chiave AES o RSA del payload. Questa è la chiave che importi e usi con CloudHSM.
  • Chiave AES temporanea richiesta da AES_KEY_WRAP per crittografare il payload. È consigliabile utilizzare AES perché non ci sono limiti di dimensione su ciò che può essere crittografato.
  • Coppia di chiavi RSA utilizzata per comprimere ed estrarre in modo sicuro queste chiavi nel CloudHSM.

Prima di iniziare, assicurati di avere una versione aggiornata di OpenSSL per consentire la compressione del pacchetto. Per sapere come fare, consulta Come faccio ad applicare una patch a OpenSSL per attivarne l'uso con il meccanismo CloudHSM CKM_RSA_AES_KEY_WRAP?

Creare, crittografare e importare le chiavi locali

1.    Esegui questi comandi per creare le chiavi payload, effimere e RSA.

Suggerimento: Crea queste chiavi nella loro directory per tenere traccia dei tuoi file.

openssl rand -out payload_aes 32
openssl rand -out ephemeral_aes 32
openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -out public.pem -pubout -outform PEM

2.    Con questo comando si ottengono i valori esadecimali grezzi della chiave AES effimera in una variabile.

EPHEMERAL_AES_HEX=$(hexdump -v -e '/1 "%02X"' < ephemeral_aes)

Nota: Assicurati di aver installato l'utilità hexdump, altrimenti questo comando restituirà un errore. Consulta la documentazione del tuo sistema operativo su come installare l'utilità hexdump.

3.    Usa il comando OpenSSL enc per comprimere il payload con la chiave AES effimera. La cifratura -id-aes256-wrap-pad è il meccanismo di compressione conforme a RFC 3394 che coincide con CKM_RSA_AES_KEY_WRAP. I valori -iv vengono impostati da RFC 5649 (un'estensione a RFC 3394).

OPENSSL_V111 enc -id-aes256-wrap-pad -K $EPHEMERAL_AES_HEX -iv A65959A6 -in payload_aes -out payload_wrapped

4.    Crittografa la chiave AES con la chiave pubblica della coppia di chiavi RSA creata nel passaggio 1.

OPENSSL_V111 pkeyutl -encrypt -in ephemeral_aes -out ephemeral_wrapped -pubin -inkey public.pem -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha1 -pkeyopt rsa_mgf1_md:sha1

5.    Dal computer locale, concatena la chiave di payload crittografata e la chiave AES effimera in un unico file denominato rsa_aes_wrapped.

cat ephemeral_wrapped payload_wrapped > rsa_aes_wrapped

6.    Importa la chiave privata RSA in CloudHSM dal tuo computer locale. Crea una chiave AES persistente nell'HSM per gestire l'importazione utilizzando ImportPrivateKey.

Nota: Sostituisci user-name e user-password con il nome utente e la password di CloudHSM.

Nota: Se hai creato la coppia di chiavi RSA sull'HSM ed hai esportato la chiave pubblica utilizzando ExportPubKey, puoi saltare i passaggi da 6 a 9.

/opt/cloudhsm/bin/key_mgmt_util Cfm3Util singlecmd loginHSM -u CU -s user-name -p user-password  genSymKey -t 31 -s 32 -l aes256

Attenzione: Il comando può registrare localmente il nome utente e la password. Dopo aver trasferito le chiavi, è consigliabile modificare la password. Invece di specificare la password dell'utente crittografico, è possibile scrivere uno script di shell per evitare che la password venga registrata nella cronologia della shell. Questo script di shell riceverà tutti gli argomenti di key\mgmt_util e li invierà a questo comando. Ciò consente di utilizzare lo script di shell per eseguire il comando precedente e gli altri comandi di key_mgmt_util riportati di seguito.

7.    Riceverai un output simile al seguente. Prendi nota dell'handle della chiave AES, in quanto viene utilizzato per importare la chiave privata RSA. In questo esempio, l'handle della chiave è 7.

Command: genSymKey  -t  31  -s  32  -l  aes256
        Cfm3GenerateSymmetricKey returned: 0x00 : HSM Return: SUCCESS
        Symmetric Key Created.  Key Handle: 7
        Cluster Error Status
        Node id 0 and err state 0x00000000 : HSM Return: SUCCESS

8.    Importa la chiave privata e inseriscila nell'HSM. L'importazione viene protetta con la chiave AES persistente creata al punto 6. Nota: Sostituisci l'opzione -w 7 con l'handle della chiave.

/opt/cloudhsm/bin/key_mgmt_util Cfm3Util singlecmd loginHSM -u CU -s user-name -p user-password  importPrivateKey -l private -f private.pem -w 7

9.    Riceverai un output simile al seguente. Prendi nota dell'handle della chiave privata RSA importata. In questo esempio, la chiave privata RSA importata è 8.

Cfm3WrapHostKey returned: 0x00 : HSM Return: SUCCESS
        Cfm3CreateUnwrapTemplate2 returned: 0x00 : HSM Return: SUCCESS
        Cfm3UnWrapKey returned: 0x00 : HSM Return: SUCCESS
        Private Key Imported.  Key Handle: 8
        Cluster Error Status
        Node id 0 and err state 0x00000000 : HSM Return: SUCCESS

10.    Estrai la chiave di payload concatenata nell'HSM utilizzando la chiave privata RSA importata con il comando unWrapKey. In questo esempio viene utilizzato -w 8 come handle della chiave privata RSA importata.

Nota: Sostituisci -w 8 con l'handle della tua chiave privata.

/opt/cloudhsm/bin/key_mgmt_util Cfm3Util singlecmd loginHSM -u CU -s user-name -p user-password  unWrapKey -f rsa_aes_wrapped -w 8 -m 7 -noheader -l secretkey -kc 4 -kt 31

**Nota: ** È necessario utilizzare -kc 4 -kt 31 per estrarre le chiavi AES e -kc 3 -kt 0 per estrarre quelle private RSA. Per ulteriori informazioni sull'uso dei parametri -m, -kc e -kt, consulta l'esempio unWrapKey.

11.    In caso di importazione riuscita della chiave AES del payload, riceverai un output simile a questo:

Nota: In questo esempio, l'handle della chiave 10 della nuova chiave non estratta può essere utilizzato in CloudHSM.

Cfm3CreateUnwrapTemplate2 returned: 0x00 : HSM Return: SUCCESS
        Cfm2UnWrapWithTemplate3 returned: 0x00 : HSM Return: SUCCESS
        Key Unwrapped.  Key Handle: 10
        Cluster Error Status
        Node id 0 and err state 0x00000000 : HSM Return: SUCCESS

Verifica di aver importato la chiave AES del payload

1.    Esporta la chiave AES del payload sul disco utilizzando la chiave di crittografia -w 7. Sostituisci l'handle della chiave del payload 10 con il valore della chiave AES del payload importata.

/opt/cloudhsm/bin/key_mgmt_util Cfm3Util singlecmd loginHSM -u CU -s user-name -p user-password exSymKey -k 10 -w 7 -out HSM.key

2.    Esegui questo comando per confrontare la chiave del payload importata con la chiave payload_aes.

diff HSM.key payload_aes --report-identical-files

3.    Se le chiavi HSM.key e payload_aes sono identiche, otterrai il seguente output:

Files HSM.key and payload_aes are identical

Importare il payload RSA

1.    Se desideri estrarre una chiave privata RSA nell'HSM, esegui questi comandi per convertire la chiave di payload in una chiave privata RSA.

openssl genrsa -out payload_rsa.pem 2048
openssl rand -out ephemeral_aes 32
openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -out public.pem -pubout -outform PEM

2.    Le chiavi RSA create al passaggio 1 della sezione Passi necessari per l'importazione del payload RSA con OpenSSL sono in formato PKCS #1. Tuttavia, lo strumento key_mgmt_util presuppone che la chiave privata sia in formato PKCS #8 DER. Visualizza le chiavi in testo normale utilizzando il tuo editor di testo preferito per verificare che il formato sia simile a questo:

  • Formato PKCS1: -----BEGIN RSA PRIVATE KEY----- - Formato PKCS8: -----BEGIN PRIVATE KEY-----

3.    Per convertire la chiave payload_rsa.pem in formato pkcs8 e codificata DER, utilizza questo comando:

openssl pkcs8 -topk8 -inform PEM -outform DER -in payload_rsa.pem -out payload_rsa_pkcs8.der -nocrypt

4.    Segui i passaggi da 2 a 9 della sezione Creare, crittografare e importare le chiavi locali.

Nota: sostituisci payload_aes con payload_rsa_pkcs8.der.

5.    Esegui questo comando per scaricare la chiave privata RSA del payload in CloudHSM e annota l'handle della chiave di output:

/opt/cloudhsm/bin/key_mgmt_util singlecmd loginHSM -u CU -s user-name -p user-password unWrapKey -f rsa_aes_wrapped -kc 3 -kt 0 -w 8 -l private_key -m 7 -noheader

**Nota: ** È necessario utilizzare -kc 4 -kt 31 per estrarre le chiavi AES e -kc 3 -kt 0 per estrarre quelle private RSA.

Ora la chiave RSA del payload è stata estratta dall'HSM.

Verifica di aver importato la chiave privata RSA del payload

1.    Esporta la chiave privata RSA del payload sul disco utilizzando la chiave di crittografia creata in precedenza. Sostituisci l'handle della chiave di payload 25 con il tuo valore della chiave privata RSA del payload importata.

/opt/cloudhsm/bin/key_mgmt_util Cfm3Util singlecmd loginHSM -u CU -s user-name -p user-password exportPrivateKey -k 25 -w 7 -out HSM_rsa_private.key

2.    Esegui questo comando per convertire la chiave payload_rsa nel formato PKCS #8 senza convertirla in DER.

openssl pkcs8 -topk8 -inform PEM -outform PEM -in payload_rsa.pem -out payload_rsa_pkcs8.pem -nocrypt

3.    Esegui questo comando per confrontare la chiave del payload importata con la chiave payload_rsa.

diff HSM_rsa_private.key payload_rsa_pkcs8.pem --report-identical-files

4.    Se le chiavi HSM_rsa_private.key e payload_rsa_pkcs8.pem sono identiche, otterrai il seguente risultato:

Files HSM_rsa_private.key and payload_rsa_pkcs8.pem are identical

Informazioni correlate

Meccanismi PKCS #11 supportati

OpenSSL

Requisito Oasis con la specifica PKCS #11

RFC 3394

RFC 5649

AWS UFFICIALE
AWS UFFICIALEAggiornata 2 anni fa