Eu usei o OpenSSL para importar meu material de chave criptografada para o AWS Key Management Service (AWS KMS). No entanto, a solicitação falhou e recebi o erro “InvalidCiphertext”.
Breve descrição
Por padrão, o OpenSSL usa a função de hash SHA-1 (algoritmo RSAES_OAEP_SHA_256).
Para evitar erros de importação ao usar o algoritmo RSAES_OAEP_SHA_256, use o OpenSSL para criptografar seu material de chaves. Execute o comando openssl pkeyutl e especifique os parâmetros -pkeyopt rsa_padding_mode:oaep e -pkeyopt rsa_oaep_md:sha256.
Resolução
Use “externo” para a origem do material de chave para criar uma chave do AWS KMS
Se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solucionar erros da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.
Execute os comandos create-key e create-alias da AWS CLI para criar um AWS KMS para material de chaves 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
Observação: substitua example-region-1 e kms_key_with_externalmaterial pelos valores de sua chave.
Até você importar o material de chave, o status da chave do AWS KMS permanece em Importação pendente. Execute o comando a seguir para ver o status da chave:
aws kms --region $REGION describe-key --key-id $KEY_ID
Faça download da chave de empacotamento pública e do token de importação
Execute o comando get-parameters-for-import da AWS CLI para obter os 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 os dois valores e, em seguida, armazene esses valores em arquivos separados.
A chave de empacotamento pública é armazenada em PublicKey.bin e o token de importação é armazenado em ImportToken.bin.
Gerar uma chave simétrica de 256 bits
O material de chave deve ser uma chave simétrica de 256 bits (32 bytes). Execute um dos comandos a seguir para gerar a chave:
OpenSSL
openssl rand -out PlaintextKeyMaterial.bin 32
-ou-
dd
dd if=/dev/urandom of=PlaintextKeyMaterial.bin bs=32 count=1
Verifique se sua versão do OpenSSL é compatível com openssl pkeyutl
Importante: o comando pkeyutl está disponível somente no OpenSSL versão 1.0.2 e versões posteriores.
Se você usa um computador Linux baseado no Red Hat Enterprise Linux (RHEL), como uma instância executada com uma imagem de máquina da Amazon (AMI) do Amazon Linux, conclua as seguintes etapas:
-
Execute o comando a seguir para verificar sua versão do OpenSSL:
openssl version
-
Para atualizar o OpenSSL, execute o comando a seguir:
sudo yum -y update openssl
Se você usa o macOS, conclua as seguintes etapas:
-
Execute os seguintes comandos do Homebrew:
brew updatebrew upgrade openssl
brew info openssl
Observação: o comando info openssl mostra que o OpenSSL está instalado em /usr/local/opt/openssl/bin/.
-
Execute o comando a seguir para confirmar a versão do OpenSSL:
/usr/local/opt/openssl/bin/openssl version
-
Para sempre usar a versão mais recente do OpenSSL, adicione a seguinte linha no final de ~/.bash_profile:
export PATH="/usr/local/opt/openssl/bin:$PATH"
-
Execute o seguinte comando:
source ~/.bash_profile
-
Para verificar a alteração em seu ambiente macOS, execute o comando a seguir:
echo $PATHopenssl version
Criptografar seu material de chave com a chave de empacotamento pública
Para usar a versão mais recente do OpenSSL e a chave de empacotamento pública para criptografar seu material de chaves, execute o 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
O comando gera EncryptedKeyMaterial.bin. Importar esse valor como material de chave do AWS KMS.
Observação: a chave de empacotamento pública é armazenada em PublicKey.bin.
Importar seu material de chave criptografado
Conclua as seguintes etapas:
-
Execute o comando import-key-material da AWS CLI para importar o material de chave criptografada para a chave do 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
Observação: após a conclusão da importação, o status da chave muda para Habilitado.
-
Execute o comando describe-key da AWS CLI para verificar o status da chave:
aws kms --region $REGION describe-key --key-id $KEY_ID