Comment résoudre l'erreur « InvalidCiphertext » lorsque j'essaie d'utiliser OpenSSL pour importer ma clé dans AWS KMS ?

Lecture de 4 minute(s)
0

J'ai utilisé OpenSSL pour importer ma clé chiffrée dans AWS Key Management Service (AWS KMS). Cependant, la demande a échoué et j'ai reçu l'erreur « InvalidCiphertext ».

Brève description

Par défaut, OpenSSL utilise la fonction de hachage SHA-1 (algorithme RSAES_OAEP_SHA_256).

Pour éviter les erreurs d'importation lorsque vous utilisez l'algorithme RSAES_OAEP_SHA_256, utilisez OpenSSL pour chiffrer vos clés. Exécutez la commande openssl pkeyutl et spécifiez les paramètres -pkeyopt rsa_padding_mode:oaep et -pkeyopt rsa_oaep_md:sha256.

Résolution

Utiliser « external » pour l'origine des clés afin de créer une clé AWS KMS

Si des erreurs surviennent lorsque vous exécutez des commandes de l’interface de la ligne de commande AWS (AWS CLI), consultez la section Résoudre les erreurs AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l’AWS CLI.

Exécutez les commandes create-key et create-alias de l'AWS CLI pour créer un AWS KMS pour les clés externes :

export REGION=example-region-1export KEY_ALIAS=kms_key_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

Remarque : Remplacez example-region-1 et kms_key_with_externalmaterial par les valeurs de votre clé.

Tant que vous n'importez pas les clés, le statut de la clé AWS KMS reste en Importation en attente. 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é d'encapsulage et le jeton d'importation

Exécutez la commande get-parameters-for-import de l'interface de ligne de commande AWS pour obtenir les valeurs PublicKey et ImportToken :

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

Utilisez base64 pour décoder les deux valeurs, puis stockez-les dans des fichiers séparés.

La clé publique d'encapsulage est stockée dans PublicKey.bin et le jeton d'importation est stocké 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 d'OpenSSL prend en charge openssl pkeyutl

Important : La commande pkeyutl n'est disponible que sur les versions 1.0.2 et ultérieures d'OpenSSL.

Si vous utilisez un ordinateur Linux basé sur Red Hat Enterprise Linux (RHEL), tel qu'une instance lancée avec une Amazon Linux Amazon Machine Image (AMI), 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 updatebrew upgrade openssl
    brew info openssl
    

    **Remarque :**La commande info openssl indique qu'OpenSSL est installé dans /usr/local/opt/openssl/bin/.

  2. Exécutez la commande suivante pour confirmer la version d'OpenSSL :

    /usr/local/opt/openssl/bin/openssl version
    
  3. Pour toujours utiliser la version la plus récente d'OpenSSL, ajoutez la ligne suivante à la fin de ~/.bash_profile :

    export PATH="/usr/local/opt/openssl/bin:$PATH"
    
  4. Exécutez la commande suivante :

    source ~/.bash_profile
    
  5. Pour vérifier les modifications apportées à votre environnement macOS, exécutez la commande suivante :

    echo $PATHopenssl version

Chiffrer vos clés à l'aide de la clé publique d'encapsulage

Pour utiliser la version la plus récente d'OpenSSL et la clé publique d’encapsulage afin de chiffrer votre clé, exécutez la commande openssl pkeyutl :

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. Importez cette valeur en tant que clé chiffrée dans la clé AWS KMS.

Remarque : La clé publique d'encapsulage est stockée dans PublicKey.bin.

Importer votre clé chiffrée

Procédez comme suit :

  1. Exécutez la commande import-key-material de l'interface de ligne de commande AWS pour importer la clé chiffrée dans la clé AWS KMS :

    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
    

    Remarque : Une fois l'importation terminée, l’état de la clé passe à Activé (e).

  2. Exécutez la commande describe-key de l'AWS CLI pour vérifier l'état de la clé :

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