J'utilise OpenSSL pour importer ma clé dans AWS KMS, mais l'erreur « InvalidCiphertext » apparaît. Comment puis-je éliminer cette erreur ?

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

J'ai créé une clé client principale (CMK) dans AWS Key Management Service (AWS KMS). J'ai spécifié l'origine des clés CMK comme étant externe, choisi RSAES_OAEP_SHA_256 comme algorithme pour la clé de wrapping, puis utilisé OpenSSL pour chiffrer ma clé avec la clé de wrapping. Cependant, lorsque j'importe ma clé chiffrée, la requête échoue et un message d'erreur« InvalidCiphertext » s'affiche. Comment puis-je éviter cette erreur d'importation ?

Brève description

Par défaut, OpenSSL utilise la fonction de hachage SHA-1.

Pour éviter les erreurs d'importation lorsque vous utilisez l'algorithme RSAES_OAEP_SHA_256 (fonction de hachage SHA-256), chiffrez votre clé avec OpenSSL à l'aide de la commande openssl pkeyutl et spécifiez les paramètres –pkeyopt rsa_padding_mode:oaep et –pkeyopt rsa_oaep_md:sha256.

Voici la procédure complète permettant d'importer des éléments de clé dans AWS KMS à l'aide d'OpenSSL et de RSAES_OAEP_SHA_256 :

1.    Créez une clé CMK en indiquant l'origine de la clé comme étant externe.

2.    Téléchargez la clé (publique) de wrapping et le jeton d'importation.

3.    Générez une clé symétrique de 256 bits.

4.    Vérifiez que votre version d'OpenSSL prend en charge openssl pkeyutl.

5.    Chiffrez votre clé avec la clé de wrapping.

6.    Importez votre clé chiffrée.

Remarque : si vous utilisez l'algorithme de chiffrement RSAES_OAEP_SHA_1 pour votre clé d'emballage, reportez-vous à Comment importer des éléments de clé.

Résolution

Créer une clé CMK en indiquant l'origine de la clé comme étant externe

Exécutez les commandes de l'interface de ligne de commande AWS (AWS CLI) suivantes pour créer une clé CMK pour les éléments de clé externes.

Remarque : assurez-vous de remplacer les valeurs export REGION et export KEY_ALIAS par les informations de votre clé.

export REGION=us-east-1
export KEY_ALIAS=cmk_with_externalmaterial
export KEY_ID=`aws kms create-key --region $REGION --origin EXTERNAL --description $KEY_ALIAS --query KeyMetadata.KeyId --output text`
aws kms --region $REGION create-alias --alias-name alias/$KEY_ALIAS --target-key-id $KEY_ID

La clé CMK que vous venez de créer affiche l'état En attente d'importation jusqu'à ce que vous importiez la clé. Exécutez la commande suivante pour afficher l'état de la clé :

aws kms --region $REGION describe-key --key-id $KEY_ID

Télécharger la clé (publique) de wrapping et le jeton d'importation

Exécutez les commandes de l'interface de ligne de commande AWS suivantes pour obtenir les valeurs PublicKey (clé de wrapping) et ImportToken, décodez les deux valeurs à l'aide de base64, puis stockez-les dans des fichiers distincts. Notez que l'algorithme de wrapping RSAES_OAEP_SHA_256 est spécifié dans la commande get-parameters-for-import.

export KEY_PARAMETERS=`aws kms --region $REGION get-parameters-for-import --key-id $KEY_ID --wrapping-algorithm RSAES_OAEP_SHA_256 --wrapping-key-spec RSA_2048`
echo $KEY_PARAMETERS | awk '{print $7}' | tr -d '",' | base64 --decode > PublicKey.bin
echo $KEY_PARAMETERS | awk '{print $5}' | tr -d '",' | base64 --decode > ImportToken.bin

Ces commandes stockent la clé de wrapping dans PublicKey.bin et le jeton d'importation dans ImportToken.bin.

Générer une clé symétrique de 256 bits

La clé doit être une clé symétrique de 256 bits (32 octets). Exécutez l'une des commandes suivantes pour générer la clé :

OpenSSL

openssl rand -out PlaintextKeyMaterial.bin 32

-ou-

dd

dd if=/dev/urandom of=PlaintextKeyMaterial.bin bs=32 count=1

Vérifier que votre version OpenSSL prend bien en charge openssl pkeyutl

Pour chiffrer votre clé avec RSAES_OAEP_SHA_256 comme algorithme de wrapping, utilisez la commande openssl pkeyutl.

Important : cette commande est disponible uniquement sur OpenSSL 1.0.2 et les versions ultérieures.

Si vous utilisez un ordinateur Linux basé sur RHEL, comme une instance Amazon Elastic Compute Cloud (Amazon EC2) lancée avec une AMI Amazon Linux, procédez comme suit.

1.    Exécutez la commande suivante pour vérifier votre version d'OpenSSL.

openssl version

2.    Pour mettre à jour OpenSSL, exécutez la commande suivante.

sudo yum –y update openssl

Si vous utilisez macOS, procédez comme suit.

1.    Exécutez les commandes Homebrew suivantes.

brew update
brew upgrade openssl
brew info openssl

2.    La dernière commande vous montre qu'OpenSSL est installé dans /usr/local/opt/openssl/bin/. Confirmez la version OpenSSL en exécutant cette commande.

/usr/local/opt/openssl/bin/openssl version

3.    Pour toujours utiliser la version OpenSSL la plus récente, modifiez ~/.bash_profile et ajoutez la ligne suivante à la fin du fichier :

export PATH="/usr/local/opt/openssl/bin:$PATH"

4.    Après avoir ajouté la ligne, exécutez la commande suivante.

source ~/.bash_profile

5.    Pour vérifier le changement dans votre environnement macOS, exécutez la commande suivante.

echo $PATH
openssl version

Chiffrer votre clé avec la clé de wrapping

Exécutez la commande suivante pour chiffrer vos éléments de clé à l'aide de la version la plus récente d'OpenSSL et de la clé de wrapping que vous avez précédemment téléchargée.

Remarque : la clé de wrapping est stockée dans PublicKey.bin.

openssl pkeyutl -in PlaintextKeyMaterial.bin -out EncryptedKeyMaterial.bin -inkey PublicKey.bin -keyform DER \
-pubin -encrypt -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256

La commande génère EncryptedKeyMaterial.bin. Vous importez cette valeur en tant que clé chiffrée dans la clé CMK.

Importer votre clé chiffrée

Exécutez la commande de l'interface de ligne de commande AWS suivante afin d'importer la clé chiffrée dans la clé CMK.

aws kms --region $REGION import-key-material --key-id $KEY_ID --encrypted-key-material fileb://EncryptedKeyMaterial.bin --import-token fileb://ImportToken.bin --expiration-model KEY_MATERIAL_DOES_NOT_EXPIRE

Une fois l'importation terminée, la clé affiche l'état Activé. Exécutez la commande suivante pour vérifier l'état de la clé.

aws kms --region $REGION describe-key --key-id $KEY_ID

Cet article vous a-t-il été utile ?


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