Como posso verificar assinaturas geradas por chaves assimétricas do AWS KMS?

3 minuto de leitura
0

Quero usar o Key Management Service (AWS KMS) para assinar um arquivo. Depois, quero compartilhar o arquivo, sua assinatura e a chave pública para verificar se a assinatura é válida. Não quero fornecer acesso à API para que os usuários acessem minha chave do AWS KMS.

Resolução

O exemplo a seguir usa o AWS KMS com um par de chaves assimétricas ECC_NIST_P256 (secp256r1). Quando o AWS KMS gera um arquivo de assinatura usando esse par de chaves, ele é criado de acordo com o NIST FIPS 168-4. Uma assinatura digital ECDSA contendo valores (r, s) é gerada conforme especificado na ANS X9.62. Como é um padrão aberto, você pode verificar essa assinatura usando o OpenSSL.

Para obter o formato de assinatura para pares de chaves RSA, siga as instruções para criar e gerenciar as chaves do AWS KMS.

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.

Assinar um arquivo local usando o AWS KMS

Depois de criar o par de chaves do AWS KMS em sua conta, consulte o par de chaves usando a AWS CLI para assinar um arquivo. A resposta recebida da API do AWS KMS é codificada em Base64. O exemplo a seguir usa o parâmetro --query para obter o valor da assinatura da resposta e colocá-lo no arquivo sign.b64.

[ec2-user@ip-172-31-23-22 ~]$ aws kms sign --key-id arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab --message fileb://message.txt --signing-algorithm ECDSA_SHA_256 --query 'Signature' --output text > sign.b64

Observação: você pode enviar mensagens de até 4096 bytes. Para assinar uma mensagem maior, gere um resumo hash da mensagem. Em seguida, forneça o resumo do hash no parâmetro message. Para indicar se a mensagem é uma mensagem completa ou um resumo, use o parâmetro MessageType. Lembre-se de anotar o algoritmo de assinatura, pois isso será necessário para verificar a assinatura posteriormente.

Como a assinatura está no formato Base64, você pode convertê-la para o formato binário usando o comando de codificação de base64 do Linux, como o seguinte:

[ec2-user@ip-172-31-23-22 ~]$ base64 -d sign.b64 > sign.bin

Para decodificar arquivos de Base64 para o sistema operacional Windows, execute o seguinte comando:

certutil -decode C:\Temp\sign.b64 C:\Temp\sign.bin

Verificar a assinatura do AWS KMS usando o OpenSSL

Agora você pode compartilhar o arquivo de assinatura sign.b64. Para verificar o arquivo de assinatura, você deve ter a chave pública. Para obter a chave pública, execute o comando da AWS CLI get-public-key, como o seguinte:

[ec2-user@ip-172-31-23-22 ~]$ aws kms get-public-key --key-id arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab --output text --query 'PublicKey' > KMSPublic.b64

Para converter o arquivo de base64 em codificação DER com outro arquivo denominado KMSPublic.key, execute o seguinte comando:

[ec2-user@ip-172-31-23-22 ~]$ base64 -d KMSPublic.b64 > KMSPublic.key

Agora você tem a chave pública e a assinatura em formato binário com o arquivo message.txt. Para verificar a assinatura, execute o comando OpenSSL dgst como o semelhante:

[ec2-user@ip-172-31-23-22 ~]$ openssl dgst -sha256 -verify KMSPublic.key -keyform DER -signature sign.bin message.txt
Verified OK

Esse exemplo de saída de "Verified OK" (OK verificado) indica que a verificação foi bem-sucedida.

Se você não recebeu uma resposta de verificação, certifique-se de que:

  • O algoritmo de assinatura OpenSSL é o mesmo usado para assinar o arquivo.
  • Seus arquivos não são codificados em Base64.

Informações relacionadas

Primitivas criptográficas

Conceitos do AWS KMS

AWS OFICIAL
AWS OFICIALAtualizada há 2 anos