Utilicé OpenSSL para importar mi material clave cifrado a AWS Key Management Service (AWS KMS). Sin embargo, la solicitud falló y recibí el error «InvalidCiphertext».
Breve descripción
De forma predeterminada, OpenSSL usa la función hash SHA-1 (algoritmo RSAES_OAEP_SHA_256).
Para evitar errores de importación al utilizar el algoritmo RSAES_OAEP_SHA_256, utilice OpenSSL para cifrar el material de claves. Ejecute el comando openssl pkeyutl y especifique los parámetros -pkeyopt rsa_padding_mode:oaep y -pkeyopt rsa_oaep_md:sha256.
Resolución
Utilice «externo» para el origen del material clave para crear una clave de AWS KMS
Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulte Solucionar errores de AWS CLI. Además, asegúrese de utilizar la versión más reciente de la AWS CLI.
Ejecute los comandos de AWS CLI create-key y create-alias para crear un AWS KMS para material de claves externas:
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
Nota: Sustituya example-region-1 y kms_key_with_externalmaterial por sus valores clave.
Hasta que importe el material clave, el estado de la clave de AWS KMS permanecerá en Pendiente de importación. Ejecute el siguiente comando para ver el estado de la clave:
aws kms --region $REGION describe-key --key-id $KEY_ID
Descargar la clave de encapsulamiento pública y el token de importación
Ejecute el comando get-parameters-for-import de AWS CLI para obtener los valores PublicKey E 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
Use base64 para decodificar ambos valores y, a continuación, almacene estos valores en archivos separados.
La clave pública de empaquetado se almacena en PublicKey.bin y el token de importación se almacena en ImportToken.bin.
Generar una clave simétrica de 256 bits
El material de claves debe ser una clave simétrica de 256 bits (32 bytes). Ejecute uno de los siguientes comandos para generar la clave:
OpenSSL
openssl rand -out PlaintextKeyMaterial.bin 32
-o-
dd
dd if=/dev/urandom of=PlaintextKeyMaterial.bin bs=32 count=1
Comprobar que su versión de OpenSSL sea compatible con openssl pkeyutl
**Importante:**El comando pkeyutl solo está disponible en la versión 1.0.2 y posteriores de OpenSSL.
Si utiliza un ordenador Linux basado en Red Hat Enterprise Linux (RHEL), como una instancia lanzada con una imagen de máquina de Amazon (AMI) de Amazon Linux, complete los siguientes pasos:
-
Ejecute el siguiente comando para comprobar su versión de OpenSSL:
openssl version
-
Para actualizar OpenSSL, ejecute el siguiente comando:
sudo yum -y update openssl
Si usa macOS, complete los siguientes pasos:
-
Ejecute los siguientes comandos de Homebrew:
brew updatebrew upgrade openssl
brew info openssl
Nota: El comando info openssl le muestra que OpenSSL está instalado en /usr/local/opt/openssl/bin/.
-
Ejecute el siguiente comando para confirmar su versión de OpenSSL:
/usr/local/opt/openssl/bin/openssl version
-
Para utilizar siempre la versión más reciente de OpenSSL, añada la siguiente línea al final de ~/.bash_profile:
export PATH="/usr/local/opt/openssl/bin:$PATH"
-
Ejecute el siguiente comando:
source ~/.bash_profile
-
Para comprobar el cambio en su entorno macOS, ejecute el siguiente comando:
echo $PATHopenssl version
Cifrar material de claves con la clave de encapsulamiento pública
Para usar la versión más reciente de OpenSSL y la clave pública de encapsulamiento para cifrar el material de su clave, ejecute el comando 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
El comando genera EncryptedKeyMaterial.bin. Importe este valor como material de claves cifrado en la clave de AWS KMS.
Nota: La clave de encapsulamiento pública se almacena en PublicKey.bin.
Importar material de claves cifrado
Complete los siguientes pasos:
-
Ejecute el comando import-key-material de AWS CLI para importar el material de claves cifrado a la clave de 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
Nota: Una vez finalizada la importación, el estado de la clave cambia a Habilitada.
-
Ejecute el comando describe-key de AWS CLI para comprobar el estado de la clave:
aws kms --region $REGION describe-key --key-id $KEY_ID