Comment transférer en toute sécurité mes clés vers CloudHSM avec OpenSSL et l'outil de ligne de commande key_mgmt_util ?

Date de la dernière mise à jour : 11/08/2020

Je dispose de clés locales que je souhaite importer dans AWS CloudHSM à l'aide de la commande unWrapKey avec l'outil de ligne de commande key_mgmt_util. Toutefois, je ne peux pas importer ou encapsuler des clés en texte brut.

Solution

Chiffrez votre clé de charge utile avec une clé AES éphémère et chiffrez cette dernière avec votre clé publique à partir d'une paire de clés. Ensuite, concaténez la clé de charge utile chiffrée et la clé éphémère chiffrée dans un seul fichier. Le fichier concaténé est envoyé à votre CloudHSM dans son format chiffré et déchiffré par la clé privée de la paire de clés. Le mécanisme AES_KEY_WRAP déchiffre la clé AES éphémère et l'utilise pour déchiffrer votre clé de charge utile.

Créez les clés suivantes :

  • Charge utile AES ou clé RSA. Il s'agit de la clé que vous importez et utilisez avec votre CloudHSM.
  • Clé AES temporaire requise par AES_KEY_WRAP pour chiffrer la charge utile. Il est recommandé d'utiliser AES, car il n'existe aucune limite de taille sur ce qui peut être chiffré.
  • Paire de clés RSA utilisée pour encapsuler et désencapsuler en toute sécurité ces clés dans votre CloudHSM.

Avant de commencer, assurez-vous que vous disposez d'une version corrigée d'OpenSSL pour autoriser l'encapsulage d'enveloppe. Pour les instructions, consultez Comment corriger OpenSSL pour activer l'utilisation avec le mécanisme CloudHSM CKM_RSA_AES_KEY_WRAP ?

Créer, chiffrer et importer les clés locales

1.    Exécutez ces commandes pour créer les clés de charge utile, éphémère et RSA.

Astuce : créez ces clés dans leur propre répertoire pour suivre vos fichiers.

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.    Fournissez les valeurs hexadécimales brutes de la clé AES éphémère dans une variable avec cette commande.

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

Remarque : assurez-vous que l'utilitaire hexdump est installé ou que cette commande renvoie une erreur. Reportez-vous à la documentation de votre système d'exploitation pour savoir comment installer l'utilitaire hexdump.

3.    Utilisez la commande OpenSSL enc pour encapsuler la charge utile avec la clé AES éphémère. Le chiffrement -id-aes256-wrap-pad est le mécanisme d'encapsulage conforme à RFC 3394 qui coïncide avec CKM_RSA_AES_KEY_WRAP. Les valeurs -iv sont définies par RFC 5649 (extension de RFC 3394).  

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

4.    Chiffrez la clé AES avec la clé publique de la paire de clés RSA que vous avez créée à l'étape 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.    Depuis l'ordinateur local, concaténez la clé de charge utile chiffrée et la clé AES éphémère dans le fichier rsa_aes_wrapped.

cat ephemeral_wrapped payload_wrapped > rsa_aes_wrapped

6.    Importez la clé privée RSA dans le CloudHSM à partir de votre ordinateur local. Créez une clé AES persistante dans le HSM pour gérer l'importation à l'aide de importPrivateKey.

Remarque : remplacez nom-utilisateur et motdepasse-utilisateurpar vos nom d'utilisateur et mot de passe CloudHSM.

Remarque : si vous avez créé la paire de clés RSA sur le HSM et exporté la clé publique à l'aide de exportPubKey, vous pouvez ignorer les étapes 6 à 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

7.    Vous obtenez une sortie similaire à ce qui suit : Notez le descripteur de clé AES. Il sert à importer la clé RSA privée. Dans cet exemple, le descripteur de clé est 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.    Importez la clé privée et encapsulez-la dans le HSM. L'importation est sécurisée avec la clé AES persistante que vous avez créée à l'étape 6.
Remarque : remplacez l'option -w 7 par votre descripteur de clé.

/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.    Vous obtenez une sortie similaire à ce qui suit : Notez le descripteur de clé privée RSA importé. Dans cet exemple, la clé privée RSA importée est 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.    Désencapsulez la clé de charge utile concaténée dans le HSM à l'aide de la clé privée RSA importée avec la commande unWrapKey. Cet exemple utilise -w 8 comme descripteur de la clé privée RSA importée.

Remarque : remplacez -w 8 par votre descripteur de clé privée.

/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

Remarque : vous devez utiliser -kc 4 -kt 31 pour désencapsuler les clés AES et -kc 3 -kt 0 pour désencapsuler les clés privées RSA. Pour plus d'informations sur l'utilisation des paramètres -m, -kc et -kt, consultez l'exemple unWrapKey.

11.    Vous recevez une importation réussie de la clé AES de charge utile similaire à la sortie suivante :

Remarque : dans cet exemple, le descripteur 10 de la nouvelle clé désencapsulée peut être utilisé dans le 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

Vérifiez que vous avez importé la clé AES de la charge utile

1.    Exportez la clé AES de la charge utile vers le disque à l'aide de la clé d'encapsulage -w 7. Remplacez le descripteur de clé de charge utile 10 par votre propre valeur de la clé AES de charge utile importée.

/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.    Exécutez cette commande pour comparer la clé de charge utile importée avec la clé payload_aes.

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

3.    Si les clés HSM.key et payload_aes sont identiques, vous recevez la sortie suivante :

Files HSM.key and payload_aes are identical

Importation de la charge utile RSA

1.    Si vous souhaitez désencapsuler une clé privée RSA dans le HSM, exécutez ces commandes pour remplacer la clé de charge utile par une clé privée 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.    Les clés RSA créées à l'étape 1 à partir de la section Étapes requises pour importer la charge utile RSA à l'aide d'OpenSSL sont au format PKCS # 1. Toutefois, l'outil key_mgmt_util suppose que la clé privée est au format DER PKCS # 8. Affichez les clés en texte brut à l'aide de l'éditeur de texte de votre choix pour confirmer un format similaire à ce qui suit :

- Format PKCS1 : -BEGIN RSA PRIVATE KEY- - Format PKCS8 : -BEGIN PRIVATE KEY-

3.    Pour convertir la clé payload_rsa.pem au format pkcs8 et codée DER, exécutez la commande suivante :

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

4.    Suivez les étapes 2 à 9 de la section Créer, chiffrer et importer les clés locales.

Remarque : remplacez payload_aes par payload_rsa_pkcs8.der.

5.    Exécutez cette commande pour désencapsuler la clé privée RSA de charge utile dans le CloudHSM et notez le descripteur de la clé de sortie :

/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

Remarque : vous devez utiliser -kc 4 -kt 31 pour désencapsuler les clés AES et -kc 3 -kt 0 pour désencapsuler les clés privées RSA.

Vous avez maintenant la clé RSA de charge utile désencapsulée dans le HSM.

Vérifiez que vous avez importé la clé privée RSA de charge utile

1.    Exportez la clé privée RSA de charge utile vers le disque à l'aide de la clé d'encapsulage que vous avez créée précédemment. Remplacez le descripteur 25 de clé de charge utile par votre propre clé privée RSA de charge utile importée.

/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.    Exécutez cette commande pour convertir votre clé payload_rsa au format PKCS # 8 sans conversion DER.

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

3.    Exécutez cette commande pour comparer la clé de charge utile importée avec la clé payload_rsa.

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

4.    Si les clés HSM_rsa_private.key et payload_rsa_pkcs8.pem sont identiques, vous recevez la sortie suivante :

Files HSM_rsa_private.key and payload_rsa_pkcs8.pem are identical

Cette page vous a-t-elle été utile ?


Besoin d'aide pour une question technique ou de facturation ?