¿Cómo puedo usar claves asimétricas de AWS KMS para cifrar un archivo con OpenSSL?

5 minutos de lectura
0

Quiero usar las claves de Key Management Service (AWS KMS) para cifrar un archivo con OpenSSL. ¿Cómo puedo hacerlo?

Descripción corta

No puede cifrar grandes fragmentos de datos con claves RSA. Por ejemplo, para cifrar un tamaño de par de claves RSA de 2048 bytes con RSAES_OAEP_SHA_256, la mayor cantidad que puede cifrar es de 190 bytes. Con las claves de Advanced Encryption Standard (AES), puede dividir sus datos en partes más pequeñas con Cipher Block Chaining (CBC).

Resolución

Siga estas instrucciones para cifrar y descifrar las claves mediante CBC.

Nota: Si se producen errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), asegúrese de que utiliza la versión más reciente de la AWS CLI.

Crear el par de claves RSA, descargar la clave pública y crear una clave AES de 256 bits

1.    Siga las instrucciones para crear el par de claves RSA con la consola de administración de AWS.

2.    Descargue la clave pública con el comando get-public-key de AWS CLI, de manera similar a cómo se indica a continuación:

$ aws kms get-public-key --key-id arn:aws:kms:eu-west-1:123456789012:key/d74f5077-811b-4447-af65-71f5f64f37d3 --output text --query 'PublicKey' > RSAPublic.b64 && base64 -d RSAPublic.b64 > RSAPublic.bin

Nota: La función --query obtiene solo la clave pública y, a continuación, decodifica el archivo base64 en una clave DER. 3.    Cree una clave AES de 256 bits con el comando rand de OpenSSL para generar datos aleatorios y, a continuación, envíe el resultado al archivo key.bin de forma similar a la siguiente:

$ openssl rand -base64 32 > key.bin

Cifrar sus datos

1.    Cifre sus datos con el archivo key.bin mediante el comando enc de OpenSSL cifrado en CBC de forma similar a la siguiente:

$ openssl enc -aes-256-cbc -salt -pbkdf2 -in FILE_TO_ENCRYPT -out FILE_TO_ENCRYPT.enc -pass file:./key.bin

Nota:

  • El comando -pbkdf2 solo está disponible con OpenSSL 1.1.1. La AMI de Amazon Linux 2 tiene OpenSSL 1.0.2 instalado, el cual no admite el comando -pbkdf2.
  • CBC le permite cifrar archivos de cualquier tamaño.
  • Sustituya el valor FILE_TO_ENCRYPT por el nombre del archivo que desea cifrar.

2.    Cifre su clave AES de 256 bits key.bin con la clave pública de AWS KMS. Esto verifica que la clave de sus datos esté protegida. Solo los usuarios que tienen acceso a su clave privada de AWS KMS pueden acceder a la clave key.bin.

Ejecute el comando pkeyutl de OpenSSL de forma similar a la siguiente:

$ openssl pkeyutl -in key.bin -out enc.key.bin -inkey RSAPublic.bin -keyform DER -pubin -encrypt -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256

Nota: El comando pkeyutl utiliza un algoritmo de cifrado que admite el descifrado de la API de AWS KMS (RSAES_OAEP_SHA_256). La clave pública de AWS KMS RSAPublic.bin cifra la clave AES 256 y crea un nuevo archivo denominado enc.key.bin.

3.    Cifre el archivo key.bin para que los usuarios no puedan acceder a él a menos que puedan descifrar el archivo enc.key.bin con el comando rm de AWS CLI de manera similar a la que se indica a continuación:

$ rm key.bin && rm FILE_TO_ENCRYPT

Nota: También puede optar por eliminar el archivo original que desea cifrar para que los usuarios no puedan acceder a él.

Ahora tiene lo siguiente:

  • Los datos cifrados en el archivo FILE_TO_ENCRYPT.enc.
  • La clave cifrada AES de 256 bits enc.key.bin.
  • La clave pública de AWS KMS RSAPublic.bin.

Nota: Los usuarios con datos cifrados deben enviarle estos archivos para descifrarlos.

Descifrar los archivos que se le envían

Para recuperar los datos cifrados, descifre la clave AES de 256 bits y, a continuación, utilice esa clave para descifrar el archivo de datos FILE_TO_ENCRYPT.enc.

Nota: Debe tener acceso a la API de AWS KMS, porque la clave privada de AWS KMS no se puede ver en texto sin formato.

1.    Descifre la clave AES de 256 bits y envíe el archivo enc.key.bin a la API de AWS KMS mediante el comando de AWS CLI decrypt, de manera similar a como se indica a continuación:

$ aws kms decrypt --key-id arn:aws:kms:eu-west-1:123456789012:key/d74f5077-811b-4447-af65-71f5f64f37d3 --ciphertext-blob fileb://enc.key.bin --encryption-algorithm RSAES_OAEP_SHA_256 --output text --query 'Plaintext' | base64 --decode > decryptedKey.bin

Nota: La función --query selecciona el texto sin formato y, a continuación, decodifica el valor base64 en el archivo decryptedKey.bin. 2.    Ejecute el comando enc de OpenSSL con el archivo decryptedKey.bin para generar como resultado DECRYPTED_FILE de forma similar a la siguiente:

$ openssl enc -d -aes-256-cbc -pbkdf2 -in FILE_TO_ENCRYPT.enc -out DECRYPTED_FILE -pass file:./decryptedKey.bin

Nota: Sustituya el valor DECRYPTED_FILE por el nombre del archivo que desea descifrar.

Puede comparar DECRYPTED_FILE y FILE_TO_ENCRYPT para asegurarse de que el cifrado y el descifrado se completaron correctamente.


Información relacionada

Herramientas y servicios criptográficos de AWS

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 años