Como posso usar as chaves assimétricas do AWS KMS para criptografar um arquivo usando OpenSSL?

Última atualização: 4/08/2022

Quero usar as chaves do Key Management Service (AWS KMS) para criptografar um arquivo usando OpenSSL. Como posso fazer isso?

Breve descrição

Você não pode criptografar grandes porções de dados com chaves RSA. Por exemplo, para criptografar um par de chaves RSA de 2048 bytes com RSAES_OAEP_SHA_256, a maior quantidade que você pode criptografar são 190 bytes. Com as chaves Advanced Encryption Standard (AES), você pode dividir os dados em porções menores usando Cipher Block Chaining (CBC).

Resolução

Siga estas instruções para criptografar e descriptografar chaves usando CBC.

Observação: se receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), verifique se está usando a versão mais recente da AWS CLI.

Criar o par de chaves RSA, baixar a chave pública e criar uma chave AES de 256 bits

1.    Siga as instruções para criar o par de chaves RSA com o Console de Gerenciamento da AWS.

2.    Baixe a chave pública usando o comando da AWS CLI get-public-key, como o seguinte:

$ 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
Observação: a função --query obtém apenas a chave pública e depois decodifica o arquivo de base64 para uma chave DER.

3.    Crie uma chave AES de 256 bits usando o comando OpenSSL rand para gerar dados aleatórios e depois enviar para o arquivo key.bin, como o seguinte:

$ openssl rand -base64 32 > key.bin

Criptografar os dados

1.    Criptografe os dados usando o arquivo key.bin com o comando OpenSSL enc criptografado em CBC, como o seguinte:

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

Observação:

  • o comando -pbkdf2 só está disponível com o OpenSSL 1.1.1. A AMI do Amazon Linux 2 tem o OpenSSL 1.0.2 instalado, que não é compatível com o comando -pbkdf2.
  • CBC permite criptografar arquivos de qualquer tamanho.
  • Substitua o valor FILE_TO_ENCRYPT pelo nome do arquivo que você deseja criptografar.

2.    Criptografe a chave AES de 256 bits key.bin com a chave pública do AWS KMS. Isso confirma que a chave para os dados é segura. Somente os usuários que têm acesso à sua chave privada do AWS KMS podem acessar a chave key.bin.

Execute o comando OpenSSL pkeyutl, como o seguinte:

$ 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

Observação: o comando pkeyutl usa um algoritmo de criptografia que é aceito para descriptografia pela API do AWS KMS (RSAES_OAEP_SHA_256). A chave pública do AWS KMS RSAPublic.bin criptografa a chave AES 256 e cria um novo arquivo denominado enc.key.bin.

3.    Criptografe o arquivo key.bin para que os usuários não possam acessá-lo, a menos que possam descriptografar o arquivo enc.key.bin usando o comando rm da AWS CLI, como o seguinte:

$ rm key.bin && rm FILE_TO_ENCRYPT

Observação: você também pode optar por excluir o arquivo original que queria criptografar para que os usuários não possam acessá-lo.

Agora você tem o seguinte:

  • Os dados criptografados no arquivo FILE_TO_ENCRYPT.enc.
  • A chave AES de 256 bits criptografada enc.key.bin.
  • A chave pública do AWS KMS RSAPublic.bin.

Observação: usuários com dados criptografados devem enviar esses arquivos para você descriptografar.

Descriptografar os arquivos enviados para você

Para recuperar os dados criptografados, descriptografe a chave AES de 256 bits e depois use essa chave para descriptografar o arquivo de dados FILE_TO_ENCRYPT.enc.

Observação: você deve ter acesso à API do AWS KMS, pois a chave privada do AWS KMS não pode ser visualizada em texto simples.

1.    Descriptografe a chave AES de 256 bits e envie o arquivo enc.key.bin para a API do AWS KMS usando o comando decrypt da AWS CLI, como o seguinte:

$ 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
Observação: a função --query seleciona o texto simples e decodifica o valor de base64 para o arquivo decryptedKey.bin.

2.    Execute o comando OpenSSL enc usando o arquivo decryptedKey.bin para enviar para DECRYPTED_FILE, como o seguinte:

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

Observação: substitua o valor DECRYPTED_FILE pelo nome do arquivo que você deseja descriptografar.

Você pode comparar os arquivos DECRYPTED_FILE e FILE_TO_ENCRYPT para se certificar de que a criptografia e a descriptografia tenham sido concluídas com êxito.


Este artigo ajudou?


Precisa de ajuda com faturamento ou suporte técnico?